2.3 configRoute(..)

  1. 此方法用来配置访问路由,如下代码配置了将 "/hello" 映射到HelloController这个控制器,通过以下的配置,[http://localhost/hello](http://localhost/hello) 将访问 HelloController.index() 方法,而[http://localhost/hello/methodName](http://localhost/hello/methodName) 将访问到 HelloController.methodName() 方法。
  1. public void configRoute(Routes me) {
  2. me.setBaseViewPath("/view");
  3. me.addInterceptor(new FrontInterceptor());
  4. me.add("/hello", HelloController.class);
  5. }
  1. Routes.setBaseViewPath(baseViewPath)方法用于为该Routes 内部的所有Controller设置视图渲染时的基础路径,该基础路径与Routes.add(…, viewPath)方法传入的viewPath以及 Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径,规则如下:
  2. finalView = baseViewPath + viewPath + view
  3. 注意:当view “/” 字符打头时表示绝对路径,baseViewPath viewPath 将被忽略。
  4. Routes 类中添加路由的方法有两个:
  1. public Routes add(String controllerKey, Class<? extends Controller> controllerClass, String viewPath)
  2. public Routes add(String controllerKey, Class<? extends Controller> controllerClass)
  1. 第一个参数controllerKey是指访问某个Controller所需要的一个字符串,该字符串唯一对应一个ControllercontrollerKey仅能定位到Controller。第二个参数controllerClass是该controllerKey所对应到的Controller。第三个参数viewPath是指该Controller返回的视图的相对路径(该参数具体细节将在Controller相关章节中给出)。当viewPath未指定时默认值为controllerKey

JFinal路由规则如下表:

8.png

  1. 从表中可以看出,JFinal访问一个确切的Action(Action定义见3.2节)需要使用controllerKeymethod来精确定位,当method省略时默认值为indexurlPara是为了能在url中携带参数值,urlPara可以在一次请求中同时携带多个值,JFinal默认使用减号“-”来分隔多个值(可通过constants. setUrlParaSeparator(String)设置分隔符),在Controller中可以通过getPara(int index)分别取出这些值。controllerKeymethodurlPara这三部分必须使用正斜杠“/”分隔。
  2. 注意,controllerKey自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2namespace功能。
  3. JFinal在以上路由规则之外还提供了ActionKey注解,可以打破原有规则,以下是代码示例:
  1. public class UserController extends Controller {
  2. @ActionKey("/login")
  3. public void login() {
  4. render("login.html");
  5. }
  6. }
  1. 假定 UserController controllerKey值为“/user”,在使用了@ActionKey(“/login”)注解以后,actionKey由原来的“/user/login”变为了“/login”。该注解还可以让actionKey中使用减号或数字等字符,如“/user/123-456”。
  2. 如果JFinal默认路由规则不能满足需求,开发者还可以根据需要使用Handler定制更加个性化的路由,大体思路就是在Handler中改变第一个参数String target的值。
  3. JFinal路由还可以进行拆分配置,这对大规模团队开发十分有用,以下是代码示例:
  1. public class FrontRoutes extends Routes {
  2. public void config() {
  3. setBaseViewPath("/view/front");
  4. add("/", IndexController.class);
  5. add("/blog", BlogController.class);
  6. }
  7. }
  1. public class AdminRoutes extends Routes {
  2. public void config() {
  3. setBaseViewPath("/view/admin");
  4. addInterceptor(new AdminInterceptor());
  5. add("/admin", AdminController.class);
  6. add("/admin/user", UserController.class);
  7. }
  8. }
  1. public class MyJFinalConfig extends JFinalConfig {
  2. public void configRoute(Routes me) {
  3. me.add(new FrontRoutes()); // 前端路由
  4. me.add(new AdminRoutes()); // 后端路由
  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. }
  1. 如上三段代码,FrontRoutes类中配置了系统前端路由,AdminRoutes配置了系统后端路由,MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。使用这种拆分配置不仅可以让MyJFinalConfig文件更简洁,而且有利于大规模团队开发,避免多人同时修改MyJFinalConfig时的版本冲突。
  2. FrontRoutesAdminRoutes中分别使用setBaseViewPath(…)设置了各自Controller.render(view)时使用的baseViewPath
  3. AdminRoutes 还通过addInterceptor(new AdminInterceptor())添加了**Routes 级别的拦截器**,该拦截器将拦截 AdminRoutes 中添加的所有 Controller,相当于业务层的inject拦截器,会在class拦截器之前被调用。这种用法可以避免在后台管理这样的模块中的所有class上使用@Before(AdminInterceptor.class),减少代码冗余。

< 2.2 configConstant(..)

2.4 configEngine(..) >

原文: http://www.jfinal.com/doc/2-3