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(...);
}