博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的JFinal也要PathVariable
阅读量:6515 次
发布时间:2019-06-24

本文共 2719 字,大约阅读时间需要 9 分钟。

  hot3.png

废话不多说,PathVariable的原理无外乎就是正则表达式了。直接上代码吧。 首先要修改 com.jfinal.core.ActionMapping , 写入一个私有属性 actionKeyList ,用来记录每个ActionKey

private final List
actionKeyList = new ArrayList
();

在 buildActionMapping 方法内加上以下代码

void buildActionMapping() {        // 省略原有代码        actionKeyList.clear();        actionKeyList.addAll(mapping.keySet());        Collections.sort(actionKeyList, new Comparator
() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); actionKeyList.remove("/"); actionKeyList.remove(""); }

然后就是修改 getAction 方法啦

Action getAction(String url, String[] urlPara) {        Action action = mapping.get(url);        if (action != null) {            return action;        }        int i = url.lastIndexOf(SLASH);        if (i != -1) {            action = mapping.get(url.substring(0, i));            urlPara[0] = url.substring(i + 1);        }        if (action == null) {            urlPara[0] = null;            if (urlPara.length > 1) urlPara[1] = null;            for (String actionKey : actionKeyList) {                AntPathMatcher matcher = new AntPathMatcher();                if (matcher.match(actionKey, url)) {                    action = mapping.get(actionKey);                    Map
result = matcher.extractUriTemplateVariables(actionKey, url); for (String path : new ArrayList
(result.keySet())) { actionKey = actionKey.replace("{" + path + "}", result.get(path)); } if (actionKey.endsWith("/**")) actionKey = actionKey.substring(0, actionKey.length() - 4); if (url.length() > actionKey.length()) { urlPara[0] = url.substring(actionKey.length() + 1); } if (urlPara.length > 1) urlPara[1] = JSON.toJSONString(result); break; } } } return action; }

代码中主要使用了 SpringFramework 中的 AntPathMatcher,这个在SpringFramework的core包中,添加相关jar即可,或者自己剥离出来这块代码。 上面的代码里面我们扩充了urlPara的个数,相对的我们要在ActionHandler中也扩充一下urlPara的个数,并对Controller进行想对应的改造

String[] urlPara = { null, null };Action action = actionMapping.getAction(target, urlPara);// 省略代码...Controller controller = action.getControllerClass().newInstance();controller.init(request, response, urlPara[0], urlPara[1]);

用法如下

@Clear@ControllerBind(controllerKey = "testt/{uuid}")public class TestController extends Controller {    public void add() {        System.out.println(getPathVAriable("uuid"));        renderError(404);    }}

转载于:https://my.oschina.net/songm/blog/730736

你可能感兴趣的文章
pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
查看>>
NodeJS学习之文件操作
查看>>
AJAX的get和post请求原生编写方法
查看>>
WebSocket 是什么原理?为什么可以实现持久连接
查看>>
Python自学笔记-logging模块详解
查看>>
Head First--设计模式
查看>>
iOS之CAGradientLayer属性简介和使用
查看>>
微信小程序UI组件、开发框架、实用库
查看>>
模块化Javascript代码的两种方式
查看>>
Money去哪了- 每日站立会议
查看>>
Python数据结构和算法学习笔记1
查看>>
正则之从dom字符串中提取url
查看>>
大数据——基础概念
查看>>
机器学习温和指南
查看>>
解决Geoserver请求跨域的几种思路,第二种思路用过
查看>>
最短路-Bellman-Ford算法
查看>>
Object 类有哪些方法
查看>>
oracle 将一个表复制到另外一个表里 .
查看>>
libcurl以get方式请求服务器端文件
查看>>
OpenJudge 2786 Pell数列
查看>>