JFinal学习笔记

JFinalConfig
一、
Web项目需要一个继承自JFinalConfig的子类,用于对整个项目进行配置
五个抽象方法
1、 configConstant(Constants con)
JFinal常量值,如开发模式常量 devModel,默认视图配置 ViewType
2、 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") 类似的配置 来更改路由配置

还可以进行路由拆分配置

3、 configPlugin(Plugins plu)
配置c3p0数据库连接池插件,ActiveRecord数据访问插件
JFinal插件架构是其主要扩展方式之一,可以方便地创建插件并应用到项目中
4、 configInterceptor(Interceptors inter)
用来配置JFinal的全局拦截器,全局拦截器拦截所有action请求,除非使用 @clear注解在Controller中清除
Class与Method的Interceptor 见后续
5、 configHandler(Handlers handler)
Handler可以接管所有web请求

二、afterJFinalStart()与beforeJFinalStop()
JFinalJFinalJFinal 会在系统启动完成后回调 afterJFinalStart()方法,会在系统关闭前回调beforeJFinalStop()方法 。

三、PropKit
PropKit工具类用来操作外部配置文件
第一个被加载的配置文件可以使用 PropKit.get()方法直接操作
菲第一个被加载的配置文件则需要使用 PropKit.use(...).get(...)来操作

1600 Controller
Controller是JFinal的核心类,是MVC的控制器,、
基于JFinal的Web应用的控制器需要继承该类。
1、 Action
Controller以及在其中定义的public 无参方法称为一个Action
Action方法必须是public 且 没有形参
2、 getPara系列方法
获取请求中的参数,
getPara("title") 返回 表单域名为title 的参数值
getParaToInt("age") 返回表单域名为age的参数值并转为 int型

getPara(0)/getParaToInt(1)/getParaToInt(2) 返回url请求中的第0/1/2个值,
约定字母 N与n可以表示 负号
getPara() 返回urlPara参数的整体值。
3、getModel()
返回Model对象,非常简单的实体类
public class Blog extends Model<Blog> {
public static final Blog me = new Blog();
}
4、setAttr方法
setAttr(String,Object)
5、getFile文件上传
如果客户端请求为 multipart request(enctype="multipart/form-data"),那么必须先调用getFile方法
文件默认上传至项目根路径下的upload子路径下
6、renderFile文件下载
默认下载路径为项目根路径下的download子路径下
7、session操作方法
setSessionAttr(key,value)可以向session中存放数据
getSessionAttr(key) 可以从session中读取数据
getSession()可以得到session对象。
8、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
1、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调用的视图路径,仅用于控制层拦截
2、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,同级中的多个拦截器,配置在前面的先执行。

3、clear
Clear用于清除自身所处层次以上层的拦截器
如clear声明在Method层,将针对Global、Inject、Class进行清除,
clear声明在Class层,将针对Global、Inject进行清除
Clear注解不带参数,清除所有;带参数时,清除指定的拦截器
4、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"));
}
}
5、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);
}
}
6、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(...);
}

原文地址:https://www.cnblogs.com/yexingzhiguang/p/6427284.html