JFinal框架中自定义Handler实现正则表达式管理路由问题

yoqu 发布于 2016/05/10 10:51
阅读 465
收藏 1

自定义了一个AdminHandler类,继承Handler,在handle方法中进行一个路由的匹配。方法如下所示:

private static final List<String> keys = JFinal.me().getAllActionKeys();
    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        String[] target2 = {target};
        keys.stream().filter(one -> one.contains("{id}")).forEach(after->{
            String match = after.replace(after.substring(after.indexOf("{"),after.lastIndexOf("}")+1),"\\d*");
            if(target.matches(match)){
                target2[0] =after;
            }
        });

        next.handle(target2[0], request, response, isHandled);
    }



匹配使用java8中的一些语法,通过替换字符的方法来让target指定到指定的类和方法中去。例如我的keys里面包含了一个路径为/item/{id}/create的字符串,当用户访问路径/item/2001/create的时候,如果正则匹配,将target替换为/item/{id}/create中。

当我这样替换之后,原来的2001这个值我发现无法传递到controller中的Para中去。请问如何在不动JFinal 框架的前提下,将值注入进去?因为在ActionHandler的时候,才通过反射初始化值到Controller中去,我在前一个handler中并不能对它进行操作

加载中
1
JFinal
JFinal
    将自己的路由规则对应到 jfinal 默认的路由规则,你代码的方向是对的,只需要改变 target 的值即可,关键在于细节,确保next.handle(target2[0], request, response, isHandled); 中的 target2[0] 这个确实对应上了 jfinal 的 action 即可,另外, urlPara 也要对应好
JFinal
JFinal
回复 @yoqu : 你这还算好的,有好些 restful 开源框架都被 url 给套死了,却忽略了 restful 真正的内涵。restful 更重要的是对资源的抽象,状态的迁移,分布式与集群、一致性,这些全是后端的事情,全然与 url 没有关系
yoqu
yoqu
谢谢您的解答,我的思路打开了。的确这种组织方式像你这样写更简单快速一点,我所用的url每次都要过滤匹配,显得代码冗余。换个思路来解决问题。Thanks
1
JFinal
JFinal

   最后,强烈建议使用 jfinal 默认路由规则,jfinal 路由更符合直觉。url 的作用在本质上是方便与系统中的某个对象的某个方法建立起映射关系,以便使用 url 就可以访问得到,所以最简单直白的方式是:将 url 想象成调用某个对象的某个方法的形式,如 "/item/create/p1-p2-pn" 对应着:

item.creat(p1, p2, ..., pn)
     前面的item相当于url中的resource,后面的create方法相当于url 中的 create,最后的p1、p2、pn操作所需要的参数,非常符合直觉。而你希望的用法不符合直觉,却是这样的:item/p1/create,在感觉上是将参数放在了方法的前方。

    这两种 url 的组织方式,在功能上无任何区别,但jfinal除了更符合直觉以外,还具有路由解析方便、简单、快速的优点。

    有很多希望使用 restful 风格的开发者,在思想上往往就被这个 url 给禁锢了,restful 的核心并不是 url 的风格,restful提出者在论文中提到的 url 风格只是一个建议和例子,有些人把这个当成了必须,甚至觉得只要满足了论文中的 url 风格就是 restful了,错得太远了。

JFinal
JFinal
回复 @Dreamlu : 哈哈,现在没理解restful核心,折腾 url 后当作是 restful 的人太多了
如梦技术
如梦技术
:laughing:jfinal很容易被玩坏,主要是开发闲了,就开始瞎折腾了。偏离波总的初衷了
返回顶部
顶部