java和tornado_TornadoJ
#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类似。
java和tornado_TornadoJ相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...
- 查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码
java开发必知必会之看源码,而看源码的第一步则是找到源码
- java基本类型转换,随记
java基本类型转换: double double 转 long double random = Math.round(Math.random()*10000); long l = new Doubl ...
最新文章
- 凸现三围的健身运动法
- Eclipse中各种文件【默认编码格式设置】,防止乱码等问题
- SSM中怎样使用JUnit4+spring-test编写单元测试
- 10 迭代器与生成器
- 小白2分钟学会Visual Studio将引用包打包到NuGet上
- 高露洁、悦诗风吟、Benefit,618大促的数字化难题都是如何解决的?
- php url参数时间戳,AJAX GET 请求 URL 最后面缀的那个类似于时间戳的参数是什么啊?...
- VMware Linux 下 Nginx 安装配置 (一)
- php中echo和print的区别
- angular 9.2升级10.2.2
- 凸优化第四章凸优化问题 4.5几何规划
- 555定时器之内部结构图_20151231
- 感谢周易算命大师元真先生
- 软件测试技术课后习题:第9章软件测试自动化-广东高等教育出版社,主编杨胜利
- 武-NC15522(Dijsktra最短路算法)
- java中日志的级别说明
- 基于VHDL的FPGA简易电子琴(实现三音阶切换与弹奏)
- 易飞ERP客户问题集合之一
- 企业年金个人所得税怎么计算
- Vue vue-jsonp 跨域
热门文章
- HTTP progressive download渐进式传输
- 亲加通讯云郝飞:探讨直播低延迟低流量的粉丝连麦技术
- go uintptr unsafe Pointer offset() 的使用
- leetcode 795. Number of Subarrays with Bounded Maximum | 795. 区间子数组个数(Java)
- MySQL调优(三):索引基本实现原理及索引优化,哈希索引 / 组合索引 / 簇族索引等
- 【PAT甲级 ArrayList存放class】1011 World Cup Betting (20 分) Java版 3/3通过 四舍五入保留两位小数
- java并发之线程封闭(二)
- 使用memcache缓存
- Linux网络编程 之 IO多路复用poll(九)
- leetcode--53. 最大子序和