1.urlRewriter 用UrlRewriteWrappedResponse 重写了Response的encodeURL方法。
2.帮助文档中说明中,jsp 可以通过
<%
response.endoceURL("/hello.do?param=1");
%>
或者
<c:url value="/hello.do?param=1">
说明response会编 url
来由urlRewriter来自动转成你在<outbound-rule>标签中想要的url
在standrad中找到org.apache.taglibs.standard.tag.common.core.UrlSupport.class
用jadx 反编译出来的某段源代码如下:
HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
result = response.encodeURL(result);
也是response.encodeURL();
结论
说明:实现自定义url标签的时候,可以像c:url一样通过调用 response.encodeURL() 来实现urlRewriter的 页面url转换
或者自己实现urlRewriter 通过extends HttpServletResponseWrapper
实现它的encodeurl方法 来重写页面上的url
简单模拟下:
response package com.isvi.web.filter; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class URLReWriterResponse extends HttpServletResponseWrapper { public URLReWriterResponse(HttpServletResponse response) { super(response); } @Override public String encodeUrl(String url) { System.out.println("encode url"); return "myURLRewirter 页面 href 转换"; } @Override public String encodeURL(String url) { // TODO Auto-generated method stub System.out.println("encode url 2"); return "myURLRewirter 页面 href 转换2"; } }
filter package com.isvi.web.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyURLRewriter extends FilterWrapper { @Override public void doFilter(HttpServletRequest arg0, HttpServletResponse arg1, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter"); URLReWriterResponse ur=new URLReWriterResponse(arg1); chain.doFilter(arg0, ur); } }
测试jsp
<c:url value="测试"></c:url> 被改写成下边 myURLRewirter 页面 href 转换2