开篇  概述

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

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

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) {}
}

详解

1.configConstant(..)

此方法用来配置JFinal常量值,如开发模式常量devMode的配置,如下代码配置了JFinal运行在开发模式

public void configConstant(Constants me) {
//开发者模式
me.setDevMode(true);
}

在开发模式下,JFinal会对每次请求输出报告,如输出本次请求的URL、Controller、Method以及请求所携带的参数。

2.configRoute(..)

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

public void configRoute(Routes me) {
me.setBaseViewPath("/view");
me.addInterceptor(new FrontInterceptor());
me.add("/hello", HelloController.class);
}

Routes.setBaseViewPath(baseViewPath)方法用于为该Routes 内部的所有Controller设置视图渲染时的基础路径,该基础路径与Routes.add(…, viewPath)方法传入的viewPath以及 Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径,规则如下:

  

  finalView = baseViewPath + viewPath + view

注意:当view以 “/” 字符打头时表示绝对路径,baseViewPath 与 viewPath 将被忽略。

Routes 类中添加路由的方法有两个:

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

第一个参数controllerKey是指访问某个Controller所需要的一个字符串,该字符串唯一对应一个Controller,controllerKey仅能定位到Controller。第二个参数controllerClass是该controllerKey所对应到的Controller。第三个参数viewPath是指该Controller返回的视图的相对路径(该参数具体细节将在Controller相关章节中给出)。当viewPath未指定时默认值为controllerKey。

JFinal路由规则如下表:

从表中可以看出,JFinal访问一个确切的Action(Action定义见3.2节)需要使用controllerKey与method来精确定位,当method省略时默认值为index。urlPara是为了能在url中携带参数值,urlPara可以在一次请求中同时携带多个值,JFinal默认使用减号“-”来分隔多个值(可通过constants. setUrlParaSeparator(String)设置分隔符),在Controller中可以通过getPara(int index)分别取出这些值。controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。

注意,controllerKey自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2的namespace功能。

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

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

假定 UserController 的 controllerKey值为“/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() {
setBaseViewPath("/view/front");
add("/", IndexController.class);
add("/blog", BlogController.class);
}
}
public class AdminRoutes extends Routes {
public void config() {
setBaseViewPath("/view/admin");
addInterceptor(new AdminInterceptor());
add("/admin", AdminController.class);
add("/admin/user", UserController.class);
}
}
public class MyJFinalConfig extends JFinalConfig {
public void configRoute(Routes me) {
me.add(new FrontRoutes()); // 前端路由
me.add(new AdminRoutes()); // 后端路由
}
public void configConstant(Constants me) {}
public void configEngine(Engine me) {}
public void configPlugin(Plugins me) {}
public void configInterceptor(Interceptors me) {}
public void configHandler(Handlers me) {}
}

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

FrontRoutes与AdminRoutes中分别使用setBaseViewPath(…)设置了各自Controller.render(view)时使用的baseViewPath。

AdminRoutes 还通过addInterceptor(new AdminInterceptor())添加了Routes级别的拦截器,该拦截器将拦截AdminRoutes中添加的所有Controller,相当于业务层的inject拦截器,会在class拦截器之前被调用。这种用法可以避免在后台管理这样的模块中的所有class上使用@Before(AdminInterceptor.class),减少代码冗余。

3.configEngine(..)

此方法用来配置Template Engine,以下是代码示例:

public void configEngine(Engine me) {
me.addSharedFunction("/view/common/layout.html");
me.addSharedFunction("/view/common/paginate.html");
me.addSharedFunction("/view/admin/common/layout.html");
}

上面的方法向模板引擎中添加了三个定义了 template function 的模板文件

4.configPlugin(..)

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

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

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

5.configInterceptor(..)

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

public void configInterceptor(Interceptors me) {
me.add(new AuthInterceptor());
}

JFinal 的 Interceptor 非常类似于 Struts2,但使用起来更方便,Interceptor 配置粒度分为 Global、Inject、Class、Method四个层次,其中以上代码配置粒度为全局。Inject、Class与Method级的Interceptor配置将在后续章节中详细介绍。

6.configHandler(..)

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

public void configHandler(Handlers me) {
me.add(new ResourceHandler());
}

7.回调方法配置

    在 JFinalConfig 继承类中可以添加 afterJFinalStart() 与 beforeJFinalStop(),JFinal 会在系统启动完成之后以及系统关闭之前分别回调这两个方法:

// 系统启动完成后回调
public void afterJFinalStart() {
} // 系统关闭之前回调
public void beforeJFinalStop() {
}

这两个方法可以很方便地在项目启动后与关闭前让开发者有机会进行额外操作,如在系统启动后创建调度线程或在系统关闭前写回缓存 或 处理垃圾回收。

8.PropKit 读取配置

PropKit工具类用来读取外部键值对配置文件,PropKit可以极度方便地在系统任意时空使用,配置文件的格式如下:

userName=james
email=no-reply@jfinal.com
devMode=true

如下是 PropKit 代码示例:

PropKit.use("config.txt");
String userName = PropKit.get("userName");
String email = PropKit.get("email"); // Prop 配合用法
Prop p = PropKit.use("config.txt");
Boolean devMode = p.getBoolean("devMode");

多种用法详解:

如下是在项目中具体的使用示例:

public class AppConfig extends JFinalConfig {
public void configConstant(Constants me) {
// 第一次使用use加载的配置将成为主配置,可以通过PropKit.get(...)直接取值
PropKit.use("a_little_config.txt");
me.setDevMode(PropKit.getBoolean("devMode"));
} public void configPlugin(Plugins me) {
// 非第一次使用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 中,可以在项目的任何地方使用。此外PropKit.use(…)方法在加载配置文件内容以后会将数据缓存在内存之中,可以通过PropKit.useless(…)将缓存的内容进行清除。

JFinal 3.3 学习 -- JFinalConfig (配置web项目)的更多相关文章

  1. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  2. IDEA如何创建及配置Web项目(多图)

    正文之前 在学习Java Web时,第一个遇到的问题就是如何创建或配置Web项目了,今天,就用IntelliJ IDEA 来进行Web项目配置: 创建Web项目 配置web项目 正文 创建Web项目 ...

  3. 【Java Web】IDEA如何创建及配置Web项目(多图)

    正文之前 在学习Java Web时,第一个遇到的问题就是如何创建或配置Web项目了,今天,就用IntelliJ IDEA 来进行Web项目配置: 创建Web项目 配置web项目 正文 创建Web项目 ...

  4. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  5. IDEA--IDEA配置web项目

    参考:https://blog.csdn.net/kfm1376822651/article/details/79666586 记学习springmvc时,使用idea部署web项目至tomcat. ...

  6. javaweb学习路之一--web项目搭建

    概述: 工作闲暇时间想要自己搭建一个web项目玩玩,没想到大半天才弄了一个springMVC+mybatis的网站,简直菜的不行,以下记录所有的步骤加深印象 使用环境 1.jdk1.8 2.maven ...

  7. spring学习(四) ———— 整合web项目(SSH)

    清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置 ...

  8. idea配置web项目启动的详细说明

    每次用完一个编辑器以后 ,再换另一个编辑器使用 过段时间再回来使用idea,总是会忘记些什么  ,毕竟每个编辑器的风格和结构都有所区别 特此记下笔记   方便以后查看 图片文字看不清的   请在图片上 ...

  9. 修改tomcat的server.xml配置web项目

    <!-- VideoWeb:自己编写的web项目名 path:表示当输入访问项目.. 如果path="" URL=localhost:8080就可以访问项目了 如果path= ...

随机推荐

  1. 使用jQuery仿淘宝商城多格焦点图滚动切换效果

    1.效果及功能说明 图片滚动切换特效,高仿2012淘宝商城首页多格子焦点图切换,鼠标滑过焦点图片各个格子区域聚光灯效果展示 2.实现原理 在显示div的下面有一个按钮条在鼠标触及到按钮的时候会改变那妞 ...

  2. 【CodeForces】600 E. Lomsat gelral (dsu on tree)

    [题目]E. Lomsat gelral [题意]给定n个点的树,1为根,每个点有一种颜色ci,一种颜色占领一棵子树当且仅当子树内没有颜色的出现次数超过它,求n个答案——每棵子树的占领颜色的编号和Σc ...

  3. Concat层解析

    Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9 ...

  4. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  5. Python练习-一辆购物车的寂寞都是Alex的错

    Alex大神的购物车需求: 商品列表,选择商品后加入购物车,扣款显示余额,如余额不足则提示购买此商品还需充值的金额,退出后自动结账显示余额; # 编辑者:闫龙 #弱鸡购物车程序,需求:定义金额,选择商 ...

  6. 差分约束系统专题 && 对差分约束系统的理解

    具体能解决的问题: 求最长路,最短路,或者判断解是否存在. 在建边的时候: 一般是给你区间减法的关系,或者是这个点到另一个点的关系.如果给你的关系是除法的话,我们可以通过使用两边同时取log的方式,将 ...

  7. 20155303 实验二 Java面向对象程序设计

    20155303 实验二 Java面向对象程序设计 目录 一.单元测试和TDD 任务一:实现百分制成绩转成"优.良.中.及格.不及格"五级制成绩的功能 任务二:以TDD的方式研究学 ...

  8. JS合并单元格

    在Web中经常需要合并单元格,例如对于下面一个表格: <!DOCTYPE html> <html> <head> <meta charset="UT ...

  9. weblogica 启动managed server 不用每次输入密码

    [weblogic@node2 AdminServer]$ pwd /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains ...

  10. fc26 url

    aarch64 http://linux.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/fedora-secondary/releases/26/Ever ...