12.18每日总结

  jfinal 4.9.03 新增了路由扫描功能,扫描功能需要在 Controller 声明之处使用 @Path 注解,例如:

  1. @Path("/project")
  2. public class ProjectController extends Controller {
  3.    ...
  4. }
  5.  
  6. // 以下用法为 controller 配置了 viewPath
  7. @Path(value="/", viewPath="/index")
  8. public class IndexController extends Controller {
  9.    ...
  10. }

    @Path 注解可以配置 controllerPath 与 viewPath 两个参数,当 viewPath 省略时默认与第一个参数值相同。上例中的两个 Controller,第一个只配置了 controllerPath,第二个还配置了 viewPath。

    快速掌握:对于已经熟悉了 jfinal 手工注册路由的同学来说,@Path 注解的两个参数完全等价于 Routes.add(controllerPath, controllerClass, viewPath) 方法中的第一与第三个参数。

    使用了 @Path 注解以后,通过如下简单配置即可开启路由扫描功能:

  1. public void configRoute(Routes me) {
  2.    me.scan("com.xxx.");
  3. }

    通过 scan(...) 方法即开启了路由扫描功能,以上代码中的参数 "com.xxx." 表示扫描被限定在 "com.xxx." 包以及子包下面,其它地方不被扫描。

   如果需要对路由进行分类拆分,并且需要分类进行 baseViewPath 配置,以及分类进行 Routes 级别的拦截器配置,可以参考 jfinal 俱乐部项目中使用的如下配置:

  1. public void configRoute(Routes me) {
  2.    /**
  3.     * 扫描后台路由
  4.     */
  5.    me.add(new Routes() {
  6.       public void config() {
  7.          // 添加后台管理拦截器,将拦截在此方法中注册的所有 Controller
  8.          this.addInterceptor(new AdminAuthInterceptor());
  9.          this.addInterceptor(new PjaxInterceptor());
  10.          
  11.          this.setBaseViewPath("/_view/_admin");
  12.          // 如果被扫描的包在 jar 文件之中,需要添加如下配置:
  13.          // undertow.hotSwapClassPrefix = com.jfinal.club._admin.
  14.          this.scan("com.jfinal.club._admin.");
  15.       }
  16.    });
  17.    
  18.    /**
  19.     * 扫描前台路由
  20.     * 
  21.     * 注意:
  22.     * 1:scan(...) 方法要添加 skip 参数,跳过后台路由,否则后台路由会被扫描到,
  23.     *    造成 baseViewPath 以及 routes 级别的拦截器配置错误
  24.     *    
  25.     * 2: 由于 scan(...) 内部避免了重复扫描同一个类,所以需要将扫描前台路由代码
  26.     *    放在扫描后台路由之前才能验证没有 skip 参数造成的后果
  27.     */
  28.    me.add(new Routes() {
  29.       public void config() {
  30.          this.setBaseViewPath("/_view");
  31.       
  32.          // 如果被扫描的包在 jar 文件之中,需要添加如下配置:
  33.          // undertow.hotSwapClassPrefix = com.jfinal.club.
  34.          this.scan("com.jfinal.club.", className -> {
  35.             // className 为当前正扫描的类名,返回 true 时表示跳过当前类不扫描
  36.             return className.startsWith("com.jfinal.club._admin.");
  37.          });
  38.       }
  39.    });
  40. }

    以上配置分别创建了两个拆分的 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,例如:

  1. undertow.hotSwapClassPrefix = com.jfinal.blog.admin.

     该情况只可能出现在开发时,部署环境无需关心。

posted @ 2023-12-18 22:46  听着DJ读童话  阅读(16)  评论(0)    收藏  举报