本帖最后由 rbpy 于 2018-9-10 12:25 编辑
上面这个报错是因为浏览器自动请求了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()
|