JFinalConfig
1、
Web项目须要一个继承自JFinalConfig的子类,用于对整个项目进行配置
五个抽象方法
一、 configConstant(Constants con)
JFinal常量值,如开发模式常量 devModel,默认视图配置 ViewType
二、 configRoute(Routes re)
配置JFinal访问路由,
如 re.add("/hello",HelloController.class)将"/hello"映射到HelloController上
Route类的两个方法
public Routes add(String controllerKey, Class<? extends Controller> controllerClass, String viewPath)
public Routes add(String controllerKey, Class<? extends Controller> controllerClass)
JFinal的路由规则
url组成 访问目标
controllerKey Controller.index();
controllerKey/v0-v1 Controller.index(),所带url参数值为 v0-v1
controllerKey/method Controller.method();
controllerKey/method/vo-v1 Controller.method(),所带url参数值为v0-v1
即默认是index方法来处理请求,JFinal默认使用"-"来分隔多个值
controllerKey、method、urlPara 必须使用"/"来分隔
也可在方法上使用,如 ActionKey("/login/112-1123") 相似的配置 来更改路由配置
还能够进行路由拆分配置
三、 configPlugin(Plugins plu)
配置c3p0数据库链接池插件,ActiveRecord数据访问插件
JFinal插件架构是其主要扩展方式之一,能够方便地建立插件并应用到项目中
四、 configInterceptor(Interceptors inter)
用来配置JFinal的全局拦截器,全局拦截器拦截全部action请求,除非使用 @clear注解在Controller中清除
Class与Method的Interceptor 见后续
五、 configHandler(Handlers handler)
Handler能够接管全部web请求html
2、afterJFinalStart()与beforeJFinalStop()
JFinalJFinalJFinal 会在系统启动完成后回调 afterJFinalStart()方法,会在系统关闭前回调beforeJFinalStop()方法 。web
3、PropKit
PropKit工具类用来操做外部配置文件
第一个被加载的配置文件可使用 PropKit.get()方法直接操做
菲第一个被加载的配置文件则须要使用 PropKit.use(...).get(...)来操做ajax
1600 Controller
Controller是JFinal的核心类,是MVC的控制器,、
基于JFinal的Web应用的控制器须要继承该类。
一、 Action
Controller以及在其中定义的public 无参方法称为一个Action
Action方法必须是public 且 没有形参
二、 getPara系列方法
获取请求中的参数,
getPara("title") 返回 表单域名为title 的参数值
getParaToInt("age") 返回表单域名为age的参数值并转为 int型
或
getPara(0)/getParaToInt(1)/getParaToInt(2) 返回url请求中的第0/1/2个值,
约定字母 N与n能够表示 负号
getPara() 返回urlPara参数的总体值。
三、getModel()
返回Model对象,很是简单的实体类
public class Blog extends Model<Blog> {
public static final Blog me = new Blog();
}
四、setAttr方法
setAttr(String,Object)
五、getFile文件上传
若是客户端请求为 multipart request(enctype="multipart/form-data"),那么必须先调用getFile方法
文件默认上传至项目根路径下的upload子路径下
六、renderFile文件下载
默认下载路径为项目根路径下的download子路径下
七、session操做方法
setSessionAttr(key,value)能够向session中存放数据
getSessionAttr(key) 能够从session中读取数据
getSession()能够获得session对象。
八、render系列方法
假设在JFinalConfig.configRoute(Route routes) 中有以下的Controller映射配置:
routes.add("/user",UserController.class,"/path"),render(String view)使用以下:
render("test.html") 渲染名为 test.html 的视图,该视图的全路径为"/path/test.html",
render("/other_path/test.html") 渲染名为test.html的视图,该视图的全路径名为 "/other_path/test.html"
其余render方法使用例子
renderFreMarker("test.html") renderVelocity("test.html")
renderJsp("test.html")
renderJson() 将全部经过 Controller.setAttr(String,Object)设置的变量转换成json数据并渲染
renderJson("users",userList) users为根,仅将userList中的数据转换成json数据并渲染
renderJson(user) 将user对象转换成json数据并渲染
renderJson("{\"age\":18}") 直接渲染json字符串
renderJson(new String[]{"user","bolg"}) 仅将setAttr("user",user) 与 setAttr("blog",blog)设置的属性转换成json并渲染,setAttr设置的其余属性并不转换成json
renderFile("test.zip") 渲染名为test.zip的文件,通常用于文件下载
renderText("Hello JFinal") 渲染纯文本内容
renderHtml("Hello Html") 渲染HTML内容
renderError(404,"test.html") 渲染名为test.html的文件,且状态为404;
renderNull(),不渲染,即不向客户端返回数据
render(new XmlRender()) 使用自定的XmlRender来渲染
IE不支持contentType为application/json,在ajax上传文件完成后json返回json IE 提示下载文件,解决办法
render(new JsonRender().forIE())/render(new JsonRender(params).forIE());
除了 renderError方法外,调用render系列的方法,程序并不会当即返回,如需当即返回须要使用return语句,
一个action中屡次调用render方法只有最后一次有效
1719 AOP
一、interceptor
继承Interceptor接口,实现方法
public void intercept(Invocation inv);
Invocation 类提供了不少便利的方法在拦截器中使用
经常使用的
void invoke()
Controller getController() 获取Action调用的Controller,仅用于控制层拦截
String getActionKey() 获取Action调用的action key值,仅用于控制层拦截
String getControllerKey() 获取Action调用的controller key值,仅用于控制层拦截
String getViewPath() 获取Action调用的视图路径,仅用于控制层拦截
二、before
Before注解用来对拦截器进行设置,可配置class、Method级别的拦截器
@Before(AaaInter.class)
public class BlogController extends Controller{
@Before({BbbInter.class,CccInter.class})
public void index(){
}
public void show(){
}
}
在JFinalConfig中能够设置全局拦截器(控制层全局与业务层全局)和Inject拦截器
public class AppConfig extends JFinalConfig{
public void configInterceptor(Interceptor intp){
intp.addGlobalActionInterceptor(new GlobalActionInterceptor());//控制层全局拦截器
intp.addGlobalServiceInterceptor(new GlobalServiceInterceptor());//业务层全局拦截器
}
}
拦截器的执行顺序 Global、Inject、Class、Method,同级中的多个拦截器,配置在前面的先执行。
三、clear
Clear用于清除自身所处层次以上层的拦截器
如clear声明在Method层,将针对Global、Inject、Class进行清除,
clear声明在Class层,将针对Global、Inject进行清除
Clear注解不带参数,清除全部;带参数时,清除指定的拦截器
四、Interceptor的除非
控制层的拦截器的触发,只需发起action请求便可。
业务层的拦截器的触发,须要使用enhance方法对目标对象进行加强
如
public class OrderService{
@Before(Tx.class)
public void payment(int orderId,int userId){
//code
}
}
public class OrederController extends Controller{
public void payment(){
OrederService service = enhance(OrderService.class);
service.payment(getParaToInt("orderId"),getParaToInt("userId"));
}
}
五、Duang、Enhancer
Duang、Enhancer用来对目标进行加强,让其拥有AOP的能力
如:
public class TestMain{
public void main(String[] args){
OrderService service = Duang.duang(OrderService.class);
service.payment(..);
OrderService service = Enhancer.enhance(OrderService.class);
}
}
六、Inject 拦截器
Inject拦截器是指在使用enhance或duang方法加强时,使用参数传入的拦截器。Inject能够对目标彻底无侵入的应用AOP
假如要增长的目标在jar包,没法使用Before注解对其配置拦截器,使用Inject拦截器能够对jar包中目标进行加强。
如
public void injectDemo(){
//为enhance方法传入的拦截器称为Inject拦截器,下的Tx便是Inject拦截器
OrderService service = Enhancer.enhance(OrederService.class,Tx.class);
service.payment(...);
}数据库