项目中有一个include方法(页面是html),但是是实现上有一些问题,记录下来,有缘人看到希望能帮到你。
当运用jsp include(我这里是用的html,里面自己写了一个include方法)的时候,如果主页面请求带了参数,比如:/home.jsp?id=1,但是在页面include的时候:detail.jsp?name=1&id=2,在这种情况下,我们从request里面获取到的id就是 ,这有时候让人有点头痛,那么怎么才能把上一次的request里面的参数清空呢,大多数人都会想到如下方法:
request.getParameterMap().clear();
那么我恭喜你,思路对了,但是方法错了,等待你的将是:No modifications are allowed to a locked ParameterMap瞬间头大了,当然我这里要说的不是他,既然不能直接清空request里面的参数,那么我们需要将request重写,如下:
class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private Map params;
public MyHttpServletRequestWrapper(HttpServletRequest originalRequest) {
super(originalRequest);
params = new HashMap();
}
public Map getParameterMap() {
return params;
}
public String getParameter(String name) {
return (String) params.get(name);
}
public Enumeration getParameterNames() {
return Collections.enumeration(params.keySet());
}
public String[] getParameterValues(String name) {
return (String[]) params.get(name);
}
}
将request里面获取和设置参数的方法重写过后,这里面的参数就可以随意更改和设置了
MyHttpServletRequestWrapper msr = new MyHttpServletRequestWrapper(request); // 清空
String url_path = includePath.indexOf("?") > 0 ? includePath.substring(0, includePath.indexOf("?")) : includePath;
String query = includePath.indexOf("?") > 0 ? includePath.substring(includePath.indexOf("?") + 1) : "";
String[] params = query.split("&");
for (String param : params) {
if ((param != null) && (!param.equals(""))) {
String[] list = param.split("=");
if (list.length == 2) {
msr.params.put(list[0], new String[]{list[1]});
}
}
}