Jfinal 項目配置:
public class DemoConfig extends JFinalConfig {
public void configConstant(Constants me) {} //配置項目使用常量值
public void configRoute(Routes me) {} //配置項目路由
public void configEngine(Engine me) {} //配置模板引擎
public void configPlugin(Plugins me) {} //配置項目插件,項目擴展的重要途徑
public void configInterceptor(Interceptors me) {} //配置全局?jǐn)r截器
public void configHandler(Handlers me) {} //配置全局處理器
}
一、configConstant 配置加載常量
Constants 類中的常量值部分時通過創(chuàng)建初始化,部分是默認(rèn)初始化,只是初始化時機不同,項目使用中并無區(qū)別。
//默認(rèn)初始化值
private boolean devMode = false; //項目是否為開發(fā)模式
private String baseUploadPath = "upload"; //文件上傳根目錄
private String baseDownloadPath = "download"; //文件下載根目錄
private String encoding = "UTF-8"; //項目編碼
private String urlParaSeparator = "-"; //URL段分隔符
//通過創(chuàng)建初始化值
private ViewType viewType; //視圖類型,通過此類型設(shè)置項目視圖渲染工廠,默認(rèn)JFINAL_TEMPLATE
private String viewExtension; //視圖后綴,默認(rèn) .heml
private int maxPostSize; //最多請求數(shù),默認(rèn) 10485760
private int freeMarkerTemplateUpdateDelay; //非開發(fā)模式下模板更新延遲,單位秒,默認(rèn)3600
private ControllerFactory controllerFactory; //控制器工廠,用于創(chuàng)建 Controller 對象
private int configPluginOrder; //configPlugin(Plugins me) 在 JFinalConfig 中被調(diào)用的次序,默認(rèn) 3
private ITokenCache tokenCache; //設(shè)置緩存,默認(rèn) HttpSesion
private Map<Integer, String> errorViewMapping; //錯誤視圖映射組
已上是 Constants 中所有的參數(shù),所有參數(shù)都有默認(rèn)值,并且提供 set get 方法。大多數(shù)為常規(guī)設(shè)置,部分為項目間接設(shè)置。
viewType 目的為設(shè)置視圖渲染工廠,用于渲染視圖。而這里的參數(shù)為枚舉類:JFINAL_TEMPLATE, JSP, FREE_MARKER, VELOCITY; 在抽象工廠 RenderFactory 中在根據(jù)枚舉值設(shè)置具體的工廠實現(xiàn)類。
controllerFactory 控制器工廠,通過常量 DEFAULT_CONTROLLER_FACTORY 設(shè)置默認(rèn)的 ControllerFactory 的實現(xiàn)類 FastControllerFactory。用于接管 Controller 的生命周期。對此可以自己實現(xiàn) ControllerFactory 并設(shè)置新的控制器工廠。
errorViewMapping 錯誤視圖映射Map,并不是直接設(shè)置 map 值,而是通過 setError404View、setError500View、setErrorView 等方法將配置 put 進 map 中。具體錯誤頁面映射可以具體設(shè)置。
2、除了以上 Constants 中出現(xiàn)的參數(shù)值,還可以通過此類設(shè)置一些其他的項目屬性以及一些處理工廠。
//設(shè)置國際化基本名稱
public void setI18nDefaultBaseName(String defaultBaseName) {
I18n.setDefaultBaseName(defaultBaseName);
}
//設(shè)置國際化語言地區(qū)
public void setI18nDefaultLocale(String defaultLocale) {
I18n.setDefaultLocale(defaultLocale);
}
//設(shè)置 devMode 之下的 action report 是否在 invocation 之后,默認(rèn)值為 true
public void setReportAfterInvocation(boolean reportAfterInvocation) {
ActionReporter.setReportAfterInvocation(reportAfterInvocation);
}
//設(shè)置 Json 轉(zhuǎn)換工廠實現(xiàn)類,目前支持:JFinalJsonFactory(默認(rèn))、JacksonFactory、FastJsonFactory
//分別支持 JFinalJson、Jackson、FastJson
public void setJsonFactory(IJsonFactory jsonFactory) {
if (jsonFactory == null) {
throw new IllegalArgumentException("jsonFactory can not be null.");
} else {
JsonManager.me().setDefaultJsonFactory(jsonFactory);
}
}
//設(shè)置驗證碼緩存
public void setCaptchaCache(ICaptchaCache captchaCache) {
CaptchaManager.me().setCaptchaCache(captchaCache);
}
//設(shè)置默認(rèn)日志工廠
public void setLogFactory(ILogFactory logFactory) {
if (logFactory == null) {
throw new IllegalArgumentException("logFactory can not be null.");
} else {
LogManager.me().setDefaultLogFactory(logFactory);
}
}
//設(shè)置代理工廠
public void setProxyFactory(ProxyFactory proxyFactory) {
ProxyManager.me().setProxyFactory(proxyFactory);
}
//設(shè)置對 Controller、Interceptor、Validator 進行依賴注入,默認(rèn)為 false;
public void setInjectDependency(boolean injectDependency) {
AopManager.me().setInjectDependency(injectDependency);
}
//設(shè)置對父類進行注入,默認(rèn)為false;
public void setInjectSuperClass(boolean injectSuperClass) {
AopManager.me().setInjectSuperClass(injectSuperClass);
}
二、configRoute 配置項目路由
路由的配置主要是配置三個方面:請求映射、攔截器和基本路徑。
而復(fù)雜業(yè)務(wù)中的路由配置也相應(yīng)復(fù)雜多樣,jfinal 的路由配置提供多種方式。
1、最簡單的請求地址映射接收方法,添加攔截處理。
me.add("/hello", HelloController.class)
me.addInterceptor(new FrontInterceptor())
2、添加繼承 Routes 的類,此子類封裝了請求地址映射和攔截處理。
me.add(new IndexRoutes())
3、當(dāng)多個路由封裝類的攔截處理有重疊部分時,可以通過匿名內(nèi)部類統(tǒng)一添加路由并統(tǒng)一天機攔截處理。重寫 Routes 類的 add 方法,返回添加過攔截處理的 routes。
me.add(new Routes() {
public Routes add(Routes routes) {
routes.addInterceptor(apiHandle);
return super.add(routes);
}
public void config() {
add(new AgreementRoutes());
}
});
4、路由配置展示,注意:當(dāng) view 以 “/” 字符打頭時表示絕對路徑,baseViewPath 與 viewPath 將被忽略。
public void configRoute(Routes me) {
me.setBaseViewPath("/view");
me.addInterceptor(new FrontInterceptor());
me.add("/hello", HelloController.class);
//封裝形式配置
me.add(new IndexRoutes());
me.add(new LoginRoutes().addInterceptor(apiHandle));
me.add(new WxUserRoutes().addInterceptor(apiHandle).addInterceptor(openId));
me.add(new Routes() {
@Override
public Routes add(Routes routes) {
routes.addInterceptor(apiHandle);
return super.add(routes);
}
@Override
public void config() {
add(new AgreementRoutes());
}
});
}
三、configEngine 配置模板引擎
模板引擎,Jfinal 中重要且非常常用的模塊,頁面渲染處理中需要擴展的方法需要用到,在諸多擴展插件中渲染器處理也用到。是 Enjoy 模板引擎的渲染顯示的基礎(chǔ)。
通過 addSharedObject、addSharedFunction、addSharedFunction 此三個方法共享 java 類,java 方法,engine 模板方法。豐富頁面邏輯處理方式,用于頁面文件的業(yè)務(wù)邏輯渲染。
//向系統(tǒng)添加公眾類,公眾方法,公眾模板文件。方法擴展
me.addSharedObject("StrKit", new com.jfinal.kit.StrKit());
me.addSharedMethod("com.jfinal.kit.StrKit().firstCharToLowerCase())");
me.addSharedFunction("/_view/common/_layui.html");
//插件文件模本渲染器使用 engine 類,向插件設(shè)置
FileTemplateRender.setEngine(me);
//插件菜單標(biāo)簽使用 engine 類,向插件設(shè)置
MenuTag.setEngine(me);
四、configInterceptor 配置全局?jǐn)r截器
這里添加的攔截器為全局?jǐn)r截器,全局?jǐn)r截處理,通常用戶登錄、國際化等一切全局基本功能。
如果要對具體的請求進行攔截差異化處理,可以使用 configRoute 中的路由配置對具體路由添加攔截器,具體請看第二節(jié)內(nèi)容。
//方法 add 和 addGlobalActionInterceptor 相同,add 為兼容早起版本
me.add(new SessionInViewInterceptor());
me.add(new LoginInterceptor());
me.addGlobalActionInterceptor(new EnhanceI18nInterceptor());
五、configHandler 配置處理器
可以通過處理器的配置對項目驚喜更高層的功能擴展,也可以對 web 請求完全接管,對此可以對 web 請求的處理方式進行切換。
// 全局配置處理器,主要是記錄日志和request域值處理
me.add(new GlobalHandler());
// 全局配置處理器,代替Session處理權(quán)限依賴的過度方法
me.add(new QxHandler());
一般情況不對 web 請求的進行接管的處理器的擴展,寫法如下在完成具體處理邏輯后傳遞下一個處理器 next.handle(target, request, response, isHandled);
public class QxHandler extends Handler {
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
/**
* 處理內(nèi)容
*/
next.handle(target, request, response, isHandled);
}
}
六、configPlugin 配置插件
用于添加第三方插件或者自己編寫的工具類插件,通過實框架提供的 IPlugin 接口即可??梢苑奖愕哪K化的使用常用的功能,例如 Druid 數(shù)據(jù)庫連接插件,EhCache 內(nèi)存緩存插件。
public void configPlugin(Plugins me) {
DruidPlugin dp = new DruidPlugin(jdbcUrl, userName, password);
me.add(dp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
arp.addMapping("user", User.class);
me.add(arp);
}
七、啟動關(guān)閉回調(diào)配置
onStart() 在系統(tǒng)啟動時調(diào)用,onStop() 在系統(tǒng)停止時調(diào)用。這兩個方法給予了開發(fā)者在系統(tǒng)啟動和關(guān)閉時的其他操作空間。
/**
* 系統(tǒng)啟動完成時回調(diào)
*/
@Override
public void onStart() {
// 加載短信、郵件配置
MessagePropertiesPlugin.loading();
}
/**
* 系統(tǒng)關(guān)閉時回調(diào)
*/
@Override
public void onStop() {
// 日志停止
ThreadSysLog.stopSaveDBThread();
}