2.3 configRoute(..)

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

    finalView = baseViewPath + viewPath + view

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

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

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

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

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

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

    从表中可以看出,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注解,可以打破原有规则,以下是代码示例:

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

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

    1. public class FrontRoutes extends Routes {
    2.        setBaseViewPath("/view/front");
    3.        add("/", IndexController.class);
    4.        add("/blog", BlogController.class);
    5.     }
    6. }
    1. public class MyJFinalConfig extends JFinalConfig {
    2.     public void configRoute(Routes me) {
    3.        me.add(new FrontRoutes());  // 前台路由
    4.     }
    5.     
    6.     public void configConstant(Constants me) {}
    7.     public void configEngine(Engine me) {}
    8.     public void configPlugin(Plugins me) {}
    9.     public void configInterceptor(Interceptors me) {}
    10.     public void configHandler(Handlers me) {}
    11. }

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

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

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

    jfinal 3.6 新增了如下配置方法:

    该方法用于配置是否要将控制器父类中的 public 方法映射成 action。默认配置为 false,也即父类中的所有方法都不会成为 action。

    注意:由于该配置是 3.6 版才引入,所以老版本 jfinal 项目升级时,如果控制器父类中存在 action 的需要开启这个配置为 true。因为 MsgController 中的 index() 需要被映射成 action 才能正常分发微信服务端的消息。

    引入该配置本质是一个性能优化。可以加快项目启动速度。如果 Routes 被拆分成了多个子 Routes,建议在需要该配置的子 Routes 中进行配置,因为该配置可以在子 Routes 内独立生效,其它没有该配置的 Routes 仍然可以使用到该性能优化,