import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//import org.b3log.latke.servlet.RequestProcessors;
public class test_pathVariableValueMap {
/**
* URI path pattern.
*/
private static String uriPattern;
/**
* the paramNames in pattern.
*/
private List<String> paramNames = new ArrayList<String>();
/**
* the posSpan in pattern.
*/
private List<Integer> posSpan = new ArrayList<Integer>();
/**
* the character after the pattern.
*/
private List<Character> afertCharacters = new ArrayList<Character>();
String handleMappingString() {
final Pattern pattern = Pattern.compile("\\{[^}]+\\}");
final Matcher matcher = pattern.matcher(uriPattern);
final StringBuilder uriMapping = new StringBuilder(uriPattern);
int fixPos = 0;
char[] tem;
int lastEnd = 0;
while (matcher.find()) {
tem = new char[matcher.end() - matcher.start() - 2];
uriMapping.getChars(matcher.start() - fixPos + 1, matcher.end() - fixPos - 1, tem, 0);
paramNames.add(new String(tem));
if (lastEnd == 0) {
posSpan.add(matcher.start());
} else {
posSpan.add(matcher.start() - lastEnd);
}
uriMapping.replace(matcher.start() - fixPos, matcher.end() - fixPos, "*");
fixPos = fixPos + matcher.end() - matcher.start() - 1;
lastEnd = matcher.end();
if (matcher.end() - fixPos < uriMapping.length()) {
afertCharacters.add(uriMapping.charAt(matcher.end() - fixPos));
} else {
afertCharacters.add(null);
}
}
return uriMapping.toString();
}
public Map<String, String> pathVariableValueMap(final String requestURI) throws Exception {
final Map<String, String> ret = new HashMap<String, String>();
final int length = requestURI.length();
int i = 0;
StringBuilder chars;
for (int j = 0; j < paramNames.size(); j++) {
int step = 0;
while (step < posSpan.get(j)) {
i++;
step++;
}
chars = new StringBuilder();
while (i < length && Character.valueOf(requestURI.charAt(i)) != afertCharacters.get(j)) {
chars.append(requestURI.charAt(i));
i++;
}
ret.put(paramNames.get(j), URLDecoder.decode(chars.toString(), "UTF-8"));
}
return ret;
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String requestURI="去了{丰宁}坝上,{诺尔盖大草原}秒杀之";
uriPattern=requestURI;
//RequestProcessors.ProcessorMethod.pathVariableValueMap(requestURI);
test_pathVariableValueMap chengDe=new test_pathVariableValueMap();
String daTong=chengDe.handleMappingString();
System.out.println(daTong);
Map<String,String> heJinIsGood=chengDe.pathVariableValueMap(requestURI);
System.out.println(heJinIsGood);
System.out.println(heJinIsGood.size());
System.out.println(heJinIsGood.get("丰宁"));
System.out.println(heJinIsGood.get("诺尔盖大草原"));//为毛这句打不出任何东西还不null
}
}
输出:
去了*坝上,*秒杀之
{诺尔盖大草原=, 丰宁={丰宁}坝上,{诺尔盖大草原}秒杀之}
2
{丰宁}坝上,{诺尔盖大草原}秒杀之