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) {} //配置全局拦截器
public void configHandler(Handlers me) {} //配置全局处理器
}
一、configConstant 配置加载常量
Constants 类中的常量值部分时通过创建初始化,部分是默认初始化,只是初始化时机不同,项目使用中并无区别。
//默认初始化值
private boolean devMode = false; //项目是否为开发模式
private String baseUploadPath = "upload"; //文件上传根目录
private String baseDownloadPath = "download"; //文件下载根目录
private String encoding = "UTF-8"; //项目编码
private String urlParaSeparator = "-"; //URL段分隔符
//通过创建初始化值
private ViewType viewType; //视图类型,通过此类型设置项目视图渲染工厂,默认JFINAL_TEMPLATE
private String viewExtension; //视图后缀,默认 .heml
private int maxPostSize; //最多请求数,默认 10485760
private int freeMarkerTemplateUpdateDelay; //非开发模式下模板更新延迟,单位秒,默认3600
private ControllerFactory controllerFactory; //控制器工厂,用于创建 Controller 对象
private int configPluginOrder; //configPlugin(Plugins me) 在 JFinalConfig 中被调用的次序,默认 3
private ITokenCache tokenCache; //设置缓存,默认 HttpSesion
private Map<Integer, String> errorViewMapping; //错误视图映射组
已上是 Constants 中所有的参数,所有参数都有默认值,并且提供 set get 方法。大多数为常规设置,部分为项目间接设置。
viewType 目的为设置视图渲染工厂,用于渲染视图。而这里的参数为枚举类:JFINAL_TEMPLATE, JSP, FREE_MARKER, VELOCITY; 在抽象工厂 RenderFactory 中在根据枚举值设置具体的工厂实现类。
controllerFactory 控制器工厂,通过常量 DEFAULT_CONTROLLER_FACTORY 设置默认的 ControllerFactory 的实现类 FastControllerFactory。用于接管 Controller 的生命周期。对此可以自己实现 ControllerFactory 并设置新的控制器工厂。
errorViewMapping 错误视图映射Map,并不是直接设置 map 值,而是通过 setError404View、setError500View、setErrorView 等方法将配置 put 进 map 中。具体错误页面映射可以具体设置。
2、除了以上 Constants 中出现的参数值,还可以通过此类设置一些其他的项目属性以及一些处理工厂。
//设置国际化基本名称
public void setI18nDefaultBaseName(String defaultBaseName) {
I18n.setDefaultBaseName(defaultBaseName);
}
//设置国际化语言地区
public void setI18nDefaultLocale(String defaultLocale) {
I18n.setDefaultLocale(defaultLocale);
}
//设置 devMode 之下的 action report 是否在 invocation 之后,默认值为 true
public void setReportAfterInvocation(boolean reportAfterInvocation) {
ActionReporter.setReportAfterInvocation(reportAfterInvocation);
}
//设置 Json 转换工厂实现类,目前支持:JFinalJsonFactory(默认)、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);
}
}
//设置验证码缓存
public void setCaptchaCache(ICaptchaCache captchaCache) {
CaptchaManager.me().setCaptchaCache(captchaCache);
}
//设置默认日志工厂
public void setLogFactory(ILogFactory logFactory) {
if (logFactory == null) {
throw new IllegalArgumentException("logFactory can not be null.");
} else {
LogManager.me().setDefaultLogFactory(logFactory);
}
}
//设置代理工厂
public void setProxyFactory(ProxyFactory proxyFactory) {
ProxyManager.me().setProxyFactory(proxyFactory);
}
//设置对 Controller、Interceptor、Validator 进行依赖注入,默认为 false;
public void setInjectDependency(boolean injectDependency) {
AopManager.me().setInjectDependency(injectDependency);
}
//设置对父类进行注入,默认为false;
public void setInjectSuperClass(boolean injectSuperClass) {
AopManager.me().setInjectSuperClass(injectSuperClass);
}
二、configRoute 配置项目路由
路由的配置主要是配置三个方面:请求映射、拦截器和基本路径。
而复杂业务中的路由配置也相应复杂多样,jfinal 的路由配置提供多种方式。
1、最简单的请求地址映射接收方法,添加拦截处理。
me.add("/hello", HelloController.class)
me.addInterceptor(new FrontInterceptor())
2、添加继承 Routes 的类,此子类封装了请求地址映射和拦截处理。
me.add(new IndexRoutes())
3、当多个路由封装类的拦截处理有重叠部分时,可以通过匿名内部类统一添加路由并统一天机拦截处理。重写 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、路由配置展示,注意:当 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 模板引擎的渲染显示的基础。
通过 addSharedObject、addSharedFunction、addSharedFunction 此三个方法共享 java 类,java 方法,engine 模板方法。丰富页面逻辑处理方式,用于页面文件的业务逻辑渲染。
//向系统添加公众类,公众方法,公众模板文件。方法扩展
me.addSharedObject("StrKit", new com.jfinal.kit.StrKit());
me.addSharedMethod("com.jfinal.kit.StrKit().firstCharToLowerCase())");
me.addSharedFunction("/_view/common/_layui.html");
//插件文件模本渲染器使用 engine 类,向插件设置
FileTemplateRender.setEngine(me);
//插件菜单标签使用 engine 类,向插件设置
MenuTag.setEngine(me);
四、configInterceptor 配置全局拦截器
这里添加的拦截器为全局拦截器,全局拦截处理,通常用户登录、国际化等一切全局基本功能。
如果要对具体的请求进行拦截差异化处理,可以使用 configRoute 中的路由配置对具体路由添加拦截器,具体请看第二节内容。
//方法 add 和 addGlobalActionInterceptor 相同,add 为兼容早起版本
me.add(new SessionInViewInterceptor());
me.add(new LoginInterceptor());
me.addGlobalActionInterceptor(new EnhanceI18nInterceptor());
五、configHandler 配置处理器
可以通过处理器的配置对项目惊喜更高层的功能扩展,也可以对 web 请求完全接管,对此可以对 web 请求的处理方式进行切换。
// 全局配置处理器,主要是记录日志和request域值处理
me.add(new GlobalHandler());
// 全局配置处理器,代替Session处理权限依赖的过度方法
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) {
/**
* 处理内容
*/
next.handle(target, request, response, isHandled);
}
}
六、configPlugin 配置插件
用于添加第三方插件或者自己编写的工具类插件,通过实框架提供的 IPlugin 接口即可。可以方便的模块化的使用常用的功能,例如 Druid 数据库连接插件,EhCache 内存缓存插件。
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);
}
七、启动关闭回调配置
onStart() 在系统启动时调用,onStop() 在系统停止时调用。这两个方法给予了开发者在系统启动和关闭时的其他操作空间。
/**
* 系统启动完成时回调
*/
@Override
public void onStart() {
// 加载短信、邮件配置
MessagePropertiesPlugin.loading();
}
/**
* 系统关闭时回调
*/
@Override
public void onStop() {
// 日志停止
ThreadSysLog.stopSaveDBThread();
}