#TornadoJ是一个纯JAVA Web框架
##小巧精致,很少的依赖,注解配置,可插接,易于内嵌到现有系统##
需要JDK1.5,Servlet 2.5支持
##快速开始##
TornadoJ就像大多数插件系统一样,会在Web服务器启动时加载注解的类及插件接口,并缓存起来,所以第一步需要做的是指定一个Java包前缀,在tornadoj.properties中,
plugin.package.prefix = test,可以指定多个,以;分割。
我们从五个部分来熟知TornadoJ,路由配置、API创建、插件系统、页面布局以及安全认证。
@WebModule(name = "user")
public class RouteTest {
/**
* url:/user/profile/1.html
*
* @param context
*/
@Route(name = "profile", paramPatterns = "\\d+")
public void profile(HttpContext context) {
int id = context.paramInt(0);
Log.info(String.format("%d", id));
context.putData("userId", id);
context.render("testlayout.ftl");
}
/**
* url:/user/business/vip-2.html
*
* @param context
*/
@Route(name = "/business", paramPatterns = "\\w+-\\d+", paramExtractor = "\\w+")
public void business(HttpContext context) {
String type = context.param(0);
int id = context.paramInt(1);
Log.info(String.format("%s", type));
Log.info(String.format("%d", id));
context.render("testlayout.ftl");
}
/**
* Url: /user/financial/2013-11-11_2014-11-11.html
*
* @param context
*/
@Route(name = "/financial", paramPatterns = "\\d{4}-\\d{2}-\\d{2}_\\d{4}-\\d{2}-\\d{2}", paramExtractor = "\\d{4}-\\d{2}-\\d{2}")
public void financial(HttpContext context) {
Date from = context.paramDate(0, "yyyy-MM-dd");
Date to = context.paramDate(1, "yyyy-MM-dd");
Log.info(DateFormatUtils.format(from, "yyyy/MM/dd"));
Log.info(DateFormatUtils.format(to, "yyyy/MM/dd"));
context.putData("fromDate", from);
context.putData("toDate", to);
context.render("testlayout.ftl");
}
}
二:API创建 针对不同客户端数据请求,API方式是不可缺少的,特别像手持设备。可参考@.Api,@Function说明。
@Api(name = "com.domain.app.mymodule")
public class ApiTest {
/**
* url:/api/com.domain.app.mymodule/users
*
* @param context
* @return
*/
@Function(name = "users")
public Object list(HttpContext context) {
ApiResult r = new ApiResult();
r.setSuccess(true);
r.setData(new String[]{"jay", "tom"});
/**
* 安置扩展点
*/
List plgs = ClassLoaderUtil.getPlugin(IPluginTest.class);
for(IPluginTest t : plgs){
r.setData(t.doInPluginTest());
}
return r;
}
/**
* url:/api/com.domain.app.mymodule/cache?id=1
* HttpRequest参数占位,组合成缓存Key。
* @param context
* @return
*/
@Function(cacheName = "tornadoj", cacheKey = "test_{id}")
public Object cache(HttpContext context) {
ApiResult r = new ApiResult();
r.setSuccess(true);
r.setData(new String[]{"jay", "tomcat"});
return r;
}
}
三:插件系统
第一步:定义扩展点
@Point()
public interface IPluginTest {
public Object doInPluginTest();
}
第二步:安置扩展点
public Object list(HttpContext context) {
ApiResult r = new ApiResult();
r.setSuccess(true);
r.setData(new String[]{"jay", "tom"});
/**
* 安置扩展点
*/
List plgs = ClassLoaderUtil.getPlugin(IPluginTest.class);
for(IPluginTest t : plgs){
r.setData(t.doInPluginTest());
}
return r;
}
四:页面布局 熟悉Tornado的开发者对下面介绍的应该不会陌生。提示:不支持嵌套继承
首先定义母板页面 master.layout
{% block title %}{% block head %}
{% block body %}
{% block menu %}
{% block other %}
然后子页继承母板页面,重定义母板中的块,例如 testlayout.ftl
{% extends "master.layout" %}
{% block title %}布局测试{% end %}
{% block head %}
function show(){
alert('wwww');
}
{% end %}
{% block body %}
Show!
{% end %}
五:安全认证
路由及API都有auth属性,开启此属性后,只要在HttpSession中存在 HttpContext.SESSION_CURRENT_USER项,该项保存当前登录用户唯一标识,ID或者用户名等。这也与Tornado类似。