JFinal 文档、资料、学习、API,configRoute(..) 您所在的位置:网站首页 jfinal入门 JFinal 文档、资料、学习、API,configRoute(..)

JFinal 文档、资料、学习、API,configRoute(..)

2023-07-14 19:06| 来源: 网络整理| 查看: 265

1、常用配置

    此方法用来配置访问路由,如下代码配置了将 "/hello" 映射到HelloController这个控制器,通过以下的配置,http://localhost/hello  将访问 HelloController.index() 方法,而http://localhost/hello/methodName  将访问到 HelloController.methodName() 方法。

public void configRoute(Routes me) {     // 如果要将控制器超类中的 public 方法映射为 action 配置成 true,一般不用配置     me.setMappingSuperClass(false);          // 配置 baseViewPath,可以让 render(...) 参数省去 baseViewPath 这部分前缀     me.setBaseViewPath("/view");          // 配置作用于该 Routes 对象内配置的所有 Controller 的拦截器     me.addInterceptor(new FrontInterceptor());          // 路由扫描,jfinal 4.9.03 新增功能。参数 "com.xxx." 表示扫描被限定的包名,     // 扫描仅会在该包以及该包的子包下进行     me.scan("com.xxx.");          // 手工添加路由。注意:使用了路由扫描就不要再使用手工添加路由,两者选其一     me.add("/hello", HelloController.class); }

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

    finalView = baseViewPath + viewPath + view

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

2、路由扫描(jfinal 4.9.03 新增功能)

    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.

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

3、手工配置路由

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

public Routes add(String controllerPath, Class


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有