十五、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 所需要的一个字符串,该字符串唯一对 应一个 Controller,controllerKey 仅能定位到 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 节)需要使用 controllerKey与 method 来精确定位,当method 省略时默认值为 index。urlPara 是为了能在 url 中携带参数 值,urlPara 可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可 通过constants. setUrlParaSeparator(String)设置分隔符),在 Controller 中可以通过 getPara(intindex)分别取出这些值。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(){

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 时的版本冲突。