简单使用JFinal(三)-JFinalConfig

JFinalConfig

2.1 概述

基于 JFinalweb 项目需要创建一个继承自JFinalConfig类的子类,该类用于对整个web
项目进行配置。

JFinalConfig 子类需要实现五个抽象方法,如下所示:

public class DemoConfig extends JFinalConfig
{ 
publicvoid configConstant(Constants me){} 
public void configRoute(Routesme) {} 
publicvoid configPlugin(Plugins me) {}
public void configInterceptor(Interceptors me) {}
public void configHandler(Handlersme) {}
}


 

2.2 configConstant(Constants me)

  此方法用来配置 JFinal常量值,如开发模式常量devMode的配置,默认视图类型ViewType的配置,如下代码配置了JFinal运行在开发模式下且默认视图类型为JSP

public void configConstant(Constantsme)
 { me.setDevMode(true); 
me.setViewType(ViewType.JSP);
}


  在开发模式下,JFinal会对每次请求输出报告,如输出本次请求的ControllerMethod以 及请求所携带的参数。JFinal支持JSPFreeMarkerVelocity三种常用视图。

 

 

 

 

2.3 configRoute(Routes me)

此方法用来配置 JFinal访问路由,如下代码配置了将”/hello”映射到HelloController这个控 制器 , 通 过 以 下 的 配 置 ,http://localhost/hello将 访 问HelloController.index()方法, 而http://localhost/hello/methodName将访问到 HelloController.methodName()方法。

 

public void configRoute(Routes me) 
{ me.add("/hello", 
HelloController.class);


 

Routes 类主要有如下两个方法:

 

public Routes add(String controllerKey, Class<? extends Controller>
controllerClass, String viewPath)
public Routes add(String controllerKey, Class<? extends Controller>
controllerClass)


 

第一个参数 controllerKey是指访问某个Controller所需要的一个字符串,该字符串唯一对 应一个ControllercontrollerKey仅能定位到Controller

第二个参数 controllerClass是该controllerKey所对应到的Controller

第三个参数 viewPath是指该Controller返回的视图的相对 路径(该参数具体细节将在Controller相关章节中给出)。当viewPath未指定时默认值为controllerKey

JFinal 路由规则如下表:

url  组成

访问目标

controllerKey

YourController.index()

controllerKey/method

YourController.method()

controllerKey/method/v0-v1

YourController.method(),所带url参数值为:v0-v1

controllerKey/v0-v1

YourController.index(),所带url参数值为:v0-v1

从表中可以看出,JFinal访问一个确切的Action(Action定义见3.2)需要使用controllerKeymethod来精确定位,当method省略时默认值为indexurlPara是为了能在url中携带参数 值,urlPara可以在一次请求中同时携带多个值,JFinal默认使用减号“-”来分隔多个值(可 通过constants. setUrlParaSeparator(String)设置分隔符),在Controller 中可以通过getPara(intindex)分别取出这些值。controllerKeymethodurlPara这三部分必须使用正斜杠“/”分隔。 注意,controllerKey 自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2namespace功能。

 

JFinal 在以上路由规则之外还提供了ActionKey注解,可以打破原有规则,以下是代码示 例:

public class UserController extends Controller {
@ActionKey("/login")
public void login() 
{ render("login.html");
}
 


假定 UserControllercontrollerKey值为“/user”,在使用了@ActionKey(“/login”)注解以 后,actionKey由原来的“/user/login”变为了“/login”。该注解还可以让actionKey中使用减号或 数字等字符,如“/user/123-456”

 

如果 JFinal 默认路由规则不能满足需求,开发者还可以根据需要使用 Handler 定制更加个 性化的路由,大体思路就是在 Handler中改变第一个参数String target的值。

JFinal 路由还可以进行拆分配置,这对大规模团队开发特别有用,以下是代码示例:

public class FrontRoutes extends Routes {
public void config(){
add("/",IndexController.class);
add("/blog", BlogController.class);
}
}
 
public class AdminRoutesextends Routes{
public void config(){
add("/admin",AdminController.class);
add("/admin/user", UserController.class);
}
}
 
public class MyJFinalConfigextends JFinalConfig{
publicvoid configRoute(Routesme) 
{ me.add(new FrontRoutes());  // 前端路由 
me.add(new AdminRoutes()); // 后端路由
}
public void configConstant(Constantsme) {}
public void configPlugin(Pluginsme) {}
public void configInterceptor(Interceptorsme) {}
public void configHandler(Handlersme) {}
}


如上三段代码,FrontRoutes类中配置了系统前端路由,AdminRoutes配置了系统后端路由,MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。使用这种拆分配置不仅 可以让MyJFinalConfig文件更简洁, 而且有利于大规模团队开发, 避免多人同时修改MyJFinalConfig时的版本冲突。

 

2.4 configPlugin (Plugins me)

此方法用来配置 JFinalPlugin,如下代码配置了C3p0数据库连接池插件与ActiveRecord数据库访问插件。通过以下的配置,可以在应用中使用ActiveRecord非常方便地操作数据库。

 

public void configPlugin(Pluginsme)
 { loadPropertyFile("your_app_config.txt");
C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"));
me.add(c3p0Plugin);
ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);me.add(arp);
arp.addMapping("user",User.class);


 

JFinal 插件架构是其主要扩展方式之一,可以方便地创建插件并应用到项目中去。

 

2.5 configInterceptor (Interceptors me)

此方法用来配置 JFinal  的全局拦截器,全局拦截器将拦截所有action  请求,除非使用@ClearController中清除,如下代码配置了名为AuthInterceptor的拦截器。

 

public void configInterceptor(Interceptorsme)
 { me.add(newAuthInterceptor());
}
 


JFinal Interceptor非常类似于Struts2,但使用起来更方便,Interceptor配置粒度分为GlobalClassMethod三个层次,其中以上代码配置粒度为全局。ClassMethod级的Interceptor配置将在后续详细介绍。

 

 

2.6 configHandler (Handlers me)

此方法用来配置 JFinalHandler,如下代码配置了名为ResourceHandler的处理器,Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩 展。

public void configHandler(Handlers me) {

    me.add(new ResourceHandler());

}

 

2.7 afterJFinalStart()与 beforeJFinalStop()

JFinalConfig 中的 afterJFinalStart()beforeJFinalStop()方法供开发者在JFinalConfig继承类中 覆盖 。JFinal会在系统启动完成后回调afterJFinalStart()方 法 , 会 在 系 统 关 闭 前 回 调beforeJFinalStop()方法。这两个方法可以很方便地在项目启动后与关闭前让开发者有机会进行 额外操作,如在系统启动后创建调度线程或在系统关闭前写回缓存。

 

2.8 PropKit

PropKit 工具类用来操作外部配置文件。PropKit可以极度方便地在系统任意时空使用,如 下是示例代码:

 

public class AppConfigextends JFinalConfig{
public void configConstant(Constantsme) {
// 第一次使用use加载的配置将成为主配置,可以通过PropKit.get(...)直接取值  PropKit.use("a_little_config.txt");
me.setDevMode(PropKit.getBoolean("devMode"));
}
 
public void configPlugin(Pluginsme) {
// 非第一次使用use加载的配置,需要通过每次使用use来指定配置文件名再来取值 String redisHost= PropKit.use("redis_config.txt").get("host"); int  redisPort= PropKit.use("redis_config.txt").getInt("port"); RedisPlugin rp =new RedisPlugin("myRedis", redisHost, redisPort);me.add(rp);
 
// 非第一次使用 use加载的配置,也可以先得到一个Prop对象,再通过该对象来获取值 Prop p =PropKit.use("db_config.txt");
DruidPlugin dp = new DruidPlugin(p.get("jdbcUrl"), p.get("user")…); me.add(dp);
}
}


 

如上代码所示,PropKit可同时加载多个配置文件,第一个被加载的配置文件可以使用PorpKit.get(…)方法直接操作,非第一个被加载的配置文件则需要使用PropKit.use(…).get(…)来操作。PropKit的使用并不限于在YourJFinalConfig中,可以在项目的任何地方使用,JFinalConfiggetProperty方法其底层依赖于PropKit实现。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值