12.18每日总结
jfinal 4.9.03 新增了路由扫描功能,扫描功能需要在 Controller 声明之处使用 @Path 注解,例如:
- @Path("/project")
- public class ProjectController extends Controller {
- ...
- }
- // 以下用法为 controller 配置了 viewPath
- @Path(value="/", viewPath="/index")
- public class IndexController extends Controller {
- ...
- }
@Path 注解可以配置 controllerPath 与 viewPath 两个参数,当 viewPath 省略时默认与第一个参数值相同。上例中的两个 Controller,第一个只配置了 controllerPath,第二个还配置了 viewPath。
快速掌握:对于已经熟悉了 jfinal 手工注册路由的同学来说,@Path 注解的两个参数完全等价于 Routes.add(controllerPath, controllerClass, viewPath) 方法中的第一与第三个参数。
使用了 @Path 注解以后,通过如下简单配置即可开启路由扫描功能:
- public void configRoute(Routes me) {
- me.scan("com.xxx.");
- }
通过 scan(...) 方法即开启了路由扫描功能,以上代码中的参数 "com.xxx." 表示扫描被限定在 "com.xxx." 包以及子包下面,其它地方不被扫描。
如果需要对路由进行分类拆分,并且需要分类进行 baseViewPath 配置,以及分类进行 Routes 级别的拦截器配置,可以参考 jfinal 俱乐部项目中使用的如下配置:
- public void configRoute(Routes me) {
- /**
- * 扫描后台路由
- */
- me.add(new Routes() {
- public void config() {
- // 添加后台管理拦截器,将拦截在此方法中注册的所有 Controller
- this.addInterceptor(new AdminAuthInterceptor());
- this.addInterceptor(new PjaxInterceptor());
- this.setBaseViewPath("/_view/_admin");
- // 如果被扫描的包在 jar 文件之中,需要添加如下配置:
- // undertow.hotSwapClassPrefix = com.jfinal.club._admin.
- this.scan("com.jfinal.club._admin.");
- }
- });
- /**
- * 扫描前台路由
- *
- * 注意:
- * 1:scan(...) 方法要添加 skip 参数,跳过后台路由,否则后台路由会被扫描到,
- * 造成 baseViewPath 以及 routes 级别的拦截器配置错误
- *
- * 2: 由于 scan(...) 内部避免了重复扫描同一个类,所以需要将扫描前台路由代码
- * 放在扫描后台路由之前才能验证没有 skip 参数造成的后果
- */
- me.add(new Routes() {
- public void config() {
- this.setBaseViewPath("/_view");
- // 如果被扫描的包在 jar 文件之中,需要添加如下配置:
- // undertow.hotSwapClassPrefix = com.jfinal.club.
- this.scan("com.jfinal.club.", className -> {
- // className 为当前正扫描的类名,返回 true 时表示跳过当前类不扫描
- return className.startsWith("com.jfinal.club._admin.");
- });
- }
- });
- }
以上配置分别创建了两个拆分的 Routes,并分别对其配置了 setBaseViewPath,后台路由还配置了 Routes 级别的拦截器,最后分别对 scan(...) 扫描方法限定了扫描范围。
以上配置的关键是第一个 scan("com.jfinal.club._admin.") 的参数包含了 "._admin." 这个包路径,所以扫描范围被限定为只扫描后台管理部分的路由。而第二个 scan("com.jfinal.club.", skip) 的第一个参数虽然会同时扫描到前台与后台管理的路由,但是第二个参数 skip 跳过了后台控管理那部分的路由。
常见问题:当被扫描路由在 jar 包之中,如果路由扫描不成功,需要将 scan(basePackage) 中的 basePackage 参数配置在 undertow.txt 中(未使用 undertow 不必关心该问题),需要配置的变量为 undertow.hotSwapClassPrefix,例如:
- undertow.hotSwapClassPrefix = com.jfinal.blog.admin.
该情况只可能出现在开发时,部署环境无需关心。

浙公网安备 33010602011771号