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