2
回答
jfinal的url解析问题
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

@JFinal 你好,想跟你请教个问题:

jfinal能不能支持http://somehost/app/controller/method/para1/para2/para3/

这样的url解析呢?

举报
小D
发帖于4年前 2回/284阅
共有2个答案 最后回答: 4年前
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

public class ParamParser {
	/**
	 * 参数标识
	 */
	public static final String PARAM_MARK = "{";
	/**
	 * 匹配所有字符
	 */
	public static final String PARAM_ALL_REGX = "[^/]*";//".*"
	/**
	 * 将字符串以{aa}的形式分组
	 */
	public static final String PARAM_BRACE_REGX = "\\{.*?\\}";
	
	public static final String IS_BRACE = "\\{.*\\}";
	
	
	/**
	 * 请求路径跟controllor中的注解+方法注解的路径是否匹配。<br />
	 * <p>
	 * 请求路径:/hello/Lucy <br />
	 * controllor中的注解+方法注解:/hello/{user} <br />
	 * 这两个路径是匹配的!
	 * </p>
	 * 
	 * @param path 请求路径
	 * @param param controllor中的注解+方法注解
	 * @return
	 */
	public static boolean isMatch(String path,String param){
		
		String paramRegx = null;
		paramRegx = group(param);
		
		Pattern regxPattern = Pattern.compile("^" + paramRegx + "$");
		Matcher regxMatcher = regxPattern.matcher(path);
		
		return regxMatcher.matches();
	}
	
	/**
	 * 将controllor中类注解+方法注解的路径替换成正则表达式形式。<br />
	 * 如:/hello/{user} ----->  /hello/[^/]* <br />
	 * @param param
	 * @return
	 */
	public static String group(String param){
		String ret = param;
		Pattern groupPattern = Pattern.compile(PARAM_BRACE_REGX);
		Matcher groupMatcher = groupPattern.matcher(ret);
		String group = null;
		while (groupMatcher.find()) {
			group = groupMatcher.group();
			ret = StringUtils.replaceOnce(ret, group, PARAM_ALL_REGX);
		}
		return ret;
	}
	
	/**
	 * 解析controllor路径中的参数,记录其在请求路径中的位置
	 * @param param
	 * @return
	 */
	public static List<Integer> getParam(String param){
		List<Integer> pos = new ArrayList<Integer>();
		if(param.startsWith("/"))
			param = param.substring(1);
		String[] arr = param.split("/");
		Pattern groupPattern = Pattern.compile(IS_BRACE);
		Matcher groupMatcher = null;
		for(int i = 0;i < arr.length; ++i){
			groupMatcher = groupPattern.matcher(arr[i]);
			
			if(groupMatcher.matches()){
				pos.add(i);
			}
		}
		
		return pos;
	}
	
	
	public static void main(String[] args) {
		System.out.println(ParamParser.isMatch("/hello/Lucy", "/hello/{user}"));
		System.out.println(ParamParser.isMatch("/hello/Lucy/kkk", "/hello/{user}"));
		
		System.out.println(ParamParser.getParam("/hello/{user}"));
	}
	
}



jfinal 路由设计成 urlPara以减号"-"分隔,主要基于如下几个考虑:

1:避免正则匹配提升路由效率

2:用减号"-"而非"/"可以减少路径层数,有利于SEO

3:用减号"-"作为urlPara的分隔目前来看可以满足应用需求

4:假如非要用 "/" 做为 urlPara 分隔符,仍然可以通过扩展自己的 Handler 来实现


顶部