搜索
查看: 3530|回复: 10

webaar网站开发框架 v0.2

[复制链接]

10

主题

49

帖子

289

积分

二级会员

Rank: 3Rank: 3

积分
289
发表于 2016-12-23 15:10:34 | 显示全部楼层 |阅读模式
之前写了一个webaar网站开发框架,静态文件也用这个处理,但如果是MP4等文件,这个框架搞不定,刚好看到5e365发了一个niginx的方案,在nginx里很容易配置/static目录下的静态内容全部由niginx自身处理,其余的全部都交给webaar框架处理,动静分离,这样使用这个框架就很方便了。
把webaar框架修改下,库源码全部放在一个文件里webaar.aardio,在你自己的web主程序里import webaar后就可以使用这个框架开发网站了
  1. //webaar网站开发框架
  2. namespace webaar

  3. input = function(params) begin
  4.         var ret = {}
  5.         if(!params || type(params)!=type.table) return ret;        
  6.         for(k,v in params){
  7.                 ret[k] = ..request.get[k] : v       
  8.         }
  9.         return ret;
  10. end;

  11. class application{
  12.         ctor(urls){
  13.                 var request = ..request
  14.                 var response = ..response               
  15.         };
  16.        
  17.         run = function() begin       
  18.                 if(!request) return simpleServerRun(urls);
  19.                 if(..string.startWith(request.path, "/static/", true))
  20.                         return error("/static目录下保存静态文件, 请设置web服务器来处理");
  21.                        
  22.                 this.handler, this.params = this.getHandler()
  23.                 var ret = this.handler[request.method](..table.unpack(this.params))
  24.                 if(ret) response.write(ret)
  25.                 response.close()
  26.         end;       
  27.        
  28.         getHandler = function() begin               
  29.                 for(clsName,path in urls){
  30.                         var params = {..string.match(request.path, "^"++ path ++"$")}
  31.                         if(#params){
  32.                                 var cls = eval(".."++ clsName)
  33.                                 if(params[1] == request.path) return cls();
  34.                                 else return cls(), params;
  35.                         }               
  36.                 }
  37.         end;       
  38. }

  39. namespace application{
  40.         simpleServerRun = function(urls, port=80) begin
  41.                 import console;
  42.                 import wsock.tcp.simpleHttpServer;                       
  43.                 var app = wsock.tcp.simpleHttpServer("127.0.0.1", port);       
  44.                 console.log(..string.format("本机%d端口启动web服务器...", port))
  45.                 app.run(
  46.                         function(response,request){       
  47.                                 console.log("请求:", request.url)
  48.                                 loadcodex("/main.aardio");
  49.                         }        
  50.                 );       
  51.         end;       
  52. }

  53. render = {
  54.         dir = "/templates"; //默认模版路径,可以修改
  55.        
  56.         parseTemp = function(...) begin
  57.                 loadcodex(owner.fileTemp, ...)
  58.         end;       
  59.        
  60.         @{
  61.                 _get = function(k) begin
  62.                         if(k = "load") return loadcodex;
  63.                         var fileTemp = owner[["dir"]] ++"/"++ k ++".aardio";
  64.                         if(..io.exist(fileTemp,4)){
  65.                                 owner[["fileTemp"]] = fileTemp
  66.                                 return owner[["parseTemp"]];
  67.                         }
  68.                         else {
  69.                                 ..response.error("Not find: "++ fileTemp)
  70.                                 return function(...){}
  71.                         }                       
  72.                 end;               
  73.         }       
  74. }

  75. /**intellisense(webaar)
  76. webaar = webaar网站开发框架
  77. webaar.input(__/*默认参数表*/) = URL中GET查询参数
  78. render = 模版渲染器
  79. render.dir = 模版文件保存路径,默认为templates,模版文件扩展名为aardio
  80. render.load(.(模版代码或模版文件路径,传递给模版的参数) = 直接加载模版
  81. end intellisense**/
复制代码


下面是直接可以运行的演示代码,IDE里新建一个工程,工程类型选择网站程序,然后把上面的代码全部复制进main.aardio里并保存
然后运行工程,浏览器里打开如下三个链接就可以看到演示效果了

http://127.0.0.1/hi?name2=James
http://127.0.0.1/hello/Bill
http://127.0.0.1/demo

完整演示程序如下:
每个类对应一种URL请求,可以用restfull风格传递参数,模板文件默认保存在/Templates(可以修改)
  1. namespace webaar{
  2. input = function(params) begin
  3.         var ret = {}
  4.         if(!params || type(params)!=type.table) return ret;        
  5.         for(k,v in params){
  6.                 ret[k] = ..request.get[k] : v       
  7.         }
  8.         return ret;
  9. end;

  10. class application{
  11.         ctor(urls){
  12.                 var request = ..request
  13.                 var response = ..response               
  14.         };
  15.        
  16.         run = function() begin       
  17.                 if(!request) return simpleServerRun(urls);
  18.                 if(..string.startWith(request.path, "/static/", true))
  19.                         return error("/static目录下保存静态文件, 请设置web服务器来处理");
  20.                        
  21.                 this.handler, this.params = this.getHandler()
  22.                 var ret = this.handler[request.method](..table.unpack(this.params))
  23.                 if(ret) response.write(ret)
  24.                 response.close()
  25.         end;       
  26.        
  27.         getHandler = function() begin               
  28.                 for(clsName,path in urls){
  29.                         var params = {..string.match(request.path, "^"++ path ++"$")}
  30.                         if(#params){
  31.                                 var cls = eval(".."++ clsName)
  32.                                 if(params[1] == request.path) return cls();
  33.                                 else return cls(), params;
  34.                         }               
  35.                 }
  36.         end;       
  37. }

  38. namespace application{
  39.         simpleServerRun = function(urls, port=80) begin
  40.                 import console;
  41.                 import wsock.tcp.simpleHttpServer;                       
  42.                 var app = wsock.tcp.simpleHttpServer("127.0.0.1", port);       
  43.                 console.log(..string.format("本机%d端口启动web服务器...", port))
  44.                 app.run(
  45.                         function(response,request){       
  46.                                 console.log("请求:", request.url)
  47.                                 loadcodex("/main.aardio");
  48.                         }        
  49.                 );       
  50.         end;       
  51. }

  52. render = {
  53.         dir = "/templates"; //默认模版路径,可以修改
  54.        
  55.         parseTemp = function(...) begin
  56.                 loadcodex(owner.fileTemp, ...)
  57.         end;       
  58.        
  59.         @{
  60.                 _get = function(k) begin
  61.                         if(k = "load") return loadcodex;
  62.                         var fileTemp = owner[["dir"]] ++"/"++ k ++".aardio";
  63.                         if(..io.exist(fileTemp,4)){
  64.                                 owner[["fileTemp"]] = fileTemp
  65.                                 return owner[["parseTemp"]];
  66.                         }
  67.                         else {
  68.                                 ..response.error("Not find: "++ fileTemp)
  69.                                 return function(...){}
  70.                         }                       
  71.                 end;               
  72.         }       
  73. }

  74. /**intellisense(webaar)
  75. webaar = webaar网站开发框架
  76. webaar.input(__/*默认参数表*/) = URL中GET查询参数
  77. render = 模版渲染器
  78. render.dir = 模版文件保存路径,默认为templates,模版文件扩展名为aardio
  79. render.load(.(模版代码或模版文件路径,传递给模版的参数) = 直接加载模版
  80. end intellisense**/       
  81. }

  82. /// 以上是webaar库源码,下面是自己的网站程序main.aardo ///
  83. //import webaar

  84. //url路由, 支持url目录部分传递参数, 每一项与后面的一个类对应
  85. urls = {
  86.         hello = "/hello/(.*)";
  87.         hi = "/hi";
  88.         demo = "/demo";
  89. }

  90. //url处理类,与上面的urls路由对应
  91. class hello{
  92.         ctor(){};
  93.         GET = function(name) begin
  94.                 return "hello! " + name; //通过url路径进行参数传递
  95.         end;       
  96. }

  97. class hi{
  98.         ctor(){};
  99.         GET = function() begin
  100.                 var i = ..webaar.input(name1="张三"; name2="李四") //地址?后的query参数, 可以指定默认值
  101.                 return "hi! " + i.name1 +" 和 "+ i.name2
  102.         end;       
  103. }

  104. class demo{
  105.         ctor(){};
  106.         GET = function() begin
  107.                 var title = "电话本"
  108.                 var phones = {
  109.                         {name = "张三"; num = "139-1111-1111"; operator = "移动"};
  110.                         {name = "李四"; num = "130-2222-2222"; operator = "联通"};
  111.                         {name = "王五"; num = "159-3333-3333"; operator = "电信"};
  112.                 }
  113.                
  114.                 var temp = /*
  115. <? var title, phones = ... ?>
  116. <h2><? =title ?></h2>
  117. <table border="1">
  118. <tr>
  119.         <th>姓名</th><th>号码</th><th>运营商</th>
  120. </tr>
  121. <? for(i=1;#phones;1) begin?>
  122.         <tr><td><? =phones[i].name ?></td>
  123.                 <td><? =phones[i].num ?></td>
  124.                 <td><? =phones[i].operator ?></td>
  125.         </tr>
  126. <? end; ?>
  127. </table>
  128. */       
  129.                 return ..webaar.render.load(temp, title, phones);
  130.                 //为了演示方便,用的字符串模版,正常情况应将上面的模版内容保存到/Templates/test.aardio
  131.                 //return ..webaar.render.test(title, phones);
  132.         end;       
  133. }

  134. webaar.application(urls).run()
复制代码


回复

使用道具 举报

2

主题

16

帖子

107

积分

一级会员

Rank: 2

积分
107
发表于 2016-12-24 00:10:56 | 显示全部楼层
IIS也可以单独设置每个目录的映射,实现这功能很简单的。
回复

使用道具 举报

12

主题

82

帖子

769

积分

培训班

积分
769
QQ
发表于 2016-12-24 08:01:31 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

6

主题

100

帖子

729

积分

三级会员

Rank: 4

积分
729
发表于 2016-12-25 15:59:30 | 显示全部楼层
谢谢。
刚想做一个这样的功能。
回复

使用道具 举报

4

主题

20

帖子

136

积分

一级会员

Rank: 2

积分
136
发表于 2017-2-11 10:27:43 | 显示全部楼层
谢谢分享。。。。。。
回复

使用道具 举报

0

主题

15

帖子

109

积分

一级会员

Rank: 2

积分
109
发表于 2017-2-16 22:45:24 | 显示全部楼层
测试了一下,webaar第23行有错误提示:
本机80端口启动web服务器...
请求:  http://127.0.0.1/hi
请求:  http://127.0.0.1/favicon.ico

thread id:9644
thread error:按 Ctrl + C复制错误信息
---------------------------------------------------
错误行号:#23
文件:...webaar网站开发框架\lib\webaar.aardio:
不支持此操作: _get table
定义类型:field(table)
名字:'handler'
类型:null
---------------------------------------------------
调用栈:
        [kernel]: in function 'loadcodex'
        ...webaar网站开发框架\lib\webaar.aardio:49: in function 'webApp'
        ...rdio\lib\wsock\tcp\simpleHttpServer.aardio:456: in function <...rdio\
lib\wsock\tcp\simpleHttpServer.aardio:29>
回复

使用道具 举报

10

主题

49

帖子

289

积分

二级会员

Rank: 3Rank: 3

积分
289
 楼主| 发表于 2018-9-10 12:19:20 | 显示全部楼层
本帖最后由 rbpy 于 2018-9-10 12:25 编辑
xuefu3858 发表于 2017-2-16 22:45
测试了一下,webaar第23行有错误提示:
本机80端口启动web服务器...
请求:  http://127.0.0.1/hi


上面这个报错是因为浏览器自动请求了favicon.ico,但代码中并没有对favicon.ico做处理
下面的代码修改了一下这个问题,没有的就返回404

aardio已经原生的支持了模板语法,session也支持,本身又有强大的桌面开发能力,网站开发涉及的数据库也很容易使用

webaar这个web微框架只做了url路由(可以实现REST风格请求),和方便映射模板文件的工作。再结合aardio原生的能力,使用起来已经很方便了

下面是稍微修改了一点上面bug的完整实例
看下效果

复制下面的代码后,打开aardio,新建一个代码文件,全选再粘贴刚刚复制的代码,F5运行

//webaar网站开发框架
namespace webaar{

input =
function(params) begin
   
var ret = {}
   
if(!params || type(params)!=type.table) return ret;         
   
for(k,v in params){
        ret[k] = ..request.get[..string.lower(k)] : v        
    }
   
return ret;
end;

class application{
   
ctor(urls){
        
var request = ..request
        
var response = ..response               
    };
   
    run =
function() begin        
        
if(!request){
            
//演示三个url请求
            import process
            process.execute(
"http://127.0.0.1/hi?name2=James")  
            process.execute(
"http://127.0.0.1/hello/Bill")
            process.execute(
"http://127.0.0.1/demo")
            
//启动web服务
            return simpleServerRun(urls);
        }
        
if(..string.startWith(request.path, "/static/", true)){
            
//正式环境中static下的静态文件,设置由IIS来处理(演示程序还是由aardio来处理)
//          return error("/static目录下保存静态文件, 请设置web服务器来处理");            
            response.headers["Content-Type"] = ..fsys.mime.fromFile(request.path)
            
return response.write(..string.load(request.path));
        }   
               
        
this.handler, this.params = this.getHandler()
        
if(!this.handler){
            ..console.log(
"404:", request.url)
            
return response.errorStatus(404)
        }
        
var ret = this.handler[request.method](..table.unpack(this.params))
        
if(ret) response.write(ret)
        response.close()
   
end;        
   
    getHandler =
function() begin               
        
for(clsName,path in urls){
            
var params = {..string.match(request.path, "^"++ path ++"$")}
            
if(#params){
               
var cls = eval(".."++ clsName)
               
if(params[1] == request.path) return cls();
               
else return cls(), params;
            }               
        }
   
end;        
}

namespace application{
    simpleServerRun =
function(urls, port=80) begin
        
import console;
        
import wsock.tcp.simpleHttpServer;                        
        
var app = wsock.tcp.simpleHttpServer("127.0.0.1", port);        
        console.log(..string.format(
"本机%d端口启动web服务器...", port))
        app.run(
            
function(response,request){   
               
import console;     
                console.log(
"请求:", request.url)
//              loadcodex("/main.aardio");
                import ide
               
loadcodex(ide.getActiveCode());
            }         
        );        
   
end;        
}

render = {
    dir =
"/templates"; //默认模版路径,可以修改
   
    parseTemp =
function(...) begin
        
loadcodex(owner.fileTemp, ...)
   
end;        
   
    @{
        _get =
function(k) begin
            
if(k = "load") return loadcodex;
            
var fileTemp = owner[["dir"]] ++"/"++ k ++".aardio";
            
if(..io.exist(fileTemp,4)){
               
owner[["fileTemp"]] = fileTemp
               
return owner[["parseTemp"]];
            }
            
else {
                ..response.error(
"Not find: "++ fileTemp)
               
return function(...){}
            }                        
        
end;               
    }        
}
}

/**intellisense(webaar)
webaar = webaar网站开发框架
webaar.input(__/*默认参数表*/) = URL中GET查询参数
render = 模版渲染器
render.dir = 模版文件保存路径,默认为templates,模版文件扩展名为aardio
render.load(.(模版代码或模版文件路径,传递给模版的参数) = 直接加载模版
end intellisense**/



/////////////////////// 分隔符 ///////////////////////
/// 以上是webaar库源码,下面是自己的网站程序main.aardo ///
//import webaar

//url路由, 支持url目录部分传递参数, 每一项与后面的一个类对应
urls = {
        hello =
"/hello/(.*)";
        hi =
"/hi";
        demo =
"/demo";
}

//url处理类,与上面的urls路由对应
class hello{
    GET =
function(name) begin
        
return "hello! " + name; //通过url路径进行参数传递
    end;        
}

class hi{
    GET =
function() begin
        
var i = ..webaar.input(name1="张三"; name2="李四") //地址?后的query参数, 可以指定默认值
        return "hi! " + i.name1 +" 和 "+ i.name2
   
end;        
}

class demo{
    GET =
function() begin
        
var title = "电话本"
        
var phones = {
            {name =
"张三"; num = "139-1111-1111"; operator = "移动"};
            {name =
"李四"; num = "130-2222-2222"; operator = "联通"};
            {name =
"王五"; num = "159-3333-3333"; operator = "电信"};
        }
        
        
var temp = /*
            <? var title, phones = ... ?>
            <h2><? =title ?></h2>
            <table border="1">
            <tr>
                <th>姓名</th><th>号码</th><th>运营商</th>
            </tr>
            <? for(i=1;#phones;1) begin?>
                <tr><td><? =phones[ i ].name ?></td>
                    <td><? =phones[ i ].num ?></td>
                    <td><? =phones[ i ].operator ?></td>
                </tr>
            <? end; ?>
            </table>
        */

      
        
return ..webaar.render.load(temp, title, phones);
        
//为了演示方便,用的字符串模版,正常情况应将上面的模版内容保存到/Templates/test.aardio
        //return ..webaar.render.test(title, phones);
    end;        
}

webaar.application(urls).run()

回复

使用道具 举报

6

主题

50

帖子

370

积分

二级会员

Rank: 3Rank: 3

积分
370
发表于 2018-9-10 13:02:00 | 显示全部楼层
报64行,app为NULL的错误                                                                       
回复

使用道具 举报

10

主题

49

帖子

289

积分

二级会员

Rank: 3Rank: 3

积分
289
 楼主| 发表于 2018-9-10 13:18:16 | 显示全部楼层
80端口被占用了吧,把之前打开的程序关闭了,或者修改一下里面的默认端口
回复

使用道具 举报

6

主题

50

帖子

370

积分

二级会员

Rank: 3Rank: 3

积分
370
发表于 2018-9-10 13:48:57 | 显示全部楼层
嗯,还真是。。。。。。。。。。。。。。。。。,这个能在iis里的fastcgi用吗?
回复

使用道具 举报

10

主题

49

帖子

289

积分

二级会员

Rank: 3Rank: 3

积分
289
 楼主| 发表于 2018-9-10 14:41:21 | 显示全部楼层
人生方程式 发表于 2018-9-10 13:48
嗯,还真是。。。。。。。。。。。。。。。。。,这个能在iis里的fastcgi用吗?


肯定要能在IIS里用啊。把IIS所有请求由main.aardio处理,在main.aardio导入上面的webaar这个库,就可以进行web开发了
把静态文件放到static这个目录中,设置static目录由IIS处理

当然main.aardo你可以进行你自己的模块化,把不同的url路由对应的类,分到不同的代码文件里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 14:39 , Processed in 0.078125 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表