我编写的一个过滤器程序,功能是对客户端提交的请求中的某些字符进行转换,具体代码如下:
package michael;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public final class MyRequestWrapper extends HttpServletRequestWrapper
{
public MyRequestWrapper(HttpServletRequest request)
{
super(request);
}
//重点看这个地方,我的这个类是从HttpServletRequestWrapper继承而来,父类中也有个getParameter().
public java.lang.String getParameter(java.lang.String name)
{
String value=super.getParameter(name);
if(null!=value)
return toHtml(value.trim());
else
return null;
}
private String toHtml(String str)
{
if(str==null)
return null;
StringBuffer sb=new StringBuffer();
int len=str.length();
for(int i=0; i<len; i++)
{
char c=str.charAt(i);
switch(c)
{
case ' ':
sb.append(" ");
break;
case '\n':
sb.append("<br>");
break;
case '\r':
break;
case '\'':
sb.append("'");
break;
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '&':
sb.append("&");
break;
case '"':
sb.append(""");
break;
case '\\':
sb.append("\");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
}
重点看上面注释的地方,我不过是覆盖了父类的一个方法,而且该方法在父类中是public的,按道理应该不可能出错的,可是编译的时候就给我报这个错,如下图所示,我用的是jdk1.5,tomcat6.0.16。大家帮忙给我看下,谢谢了!
[color=blue][b]不是吧,至少一个少一个isRequestedSessionIdFromUrl() 的错误啊。应为在自己的实现中,没有调用覆盖的方法啊。[/b][/color]
[b]你叙述的错误和你图片上的错误不一致啊。
图片上报的错误时getRealPath 和 isRequestedSessionIdFromURL这个2个方法[/b]
[color=blue]
[b]装饰模式,所以要把所有的方法都装饰一下。看HTTPServletRequestWrapper的源码:[/b]
[/color]
[code="java"] public boolean isRequestedSessionIdFromUrl() {
return this._getHttpServletRequest().isRequestedSessionIdFromUrl();
}[/code]
[b][color=blue]里面的所有方法,都是调用内部的HttpServletRequest的那个实例的方法。
不幸的是,在HttpServletRequest标识了isRequestedSessionIdFromUrl()这个方法为Deprecated.而在HTTPServletRequestWrapper中,却未能标注为Deprecated。
这下你的疑惑应该解开了吧。因为是装饰模式,所以必须要用这个方法,但是却忘了标注为Deprecated了。[/color]
PS:你使用应该是Servlet2.3 ,因为HttpServletRequestWrapper是2.3引入的。2.3之后就是3.0,不过现在的基于Servlet3.0的Tomcat还在测试中,还未发布正式版[/b]
应该把你的完整代码贴出来, 不然让我们猜呀 8)
[color=blue]
[b]仿照HttpServletRequestWrapper写一个MyHttpRequestWrapper ,这个MyHttpRequestWrapper与HttpServletRequestWrapper不同之处在于最后一个方法。
然后public final class MyRequestWrapper extends MyHttpRequestWrapper ,试试[/b][/color]
[code="java"]public class MyHttpRequestWrapper extends ServletRequestWrapper implements HttpServletRequest {
public MyHttpRequestWrapper (HttpServletRequest request) {
super(request);
}
private HttpServletRequest _getHttpServletRequest() {
return (HttpServletRequest) super.getRequest();
}
public String getAuthType() {
return this._getHttpServletRequest().getAuthType();
}
public Cookie[] getCookies() {
return this._getHttpServletRequest().getCookies();
}
public long getDateHeader(String name) {
return this._getHttpServletRequest().getDateHeader(name);
}
public String getHeader(String name) {
return this._getHttpServletRequest().getHeader(name);
}
public Enumeration getHeaders(String name) {
return this._getHttpServletRequest().getHeaders(name);
}
public Enumeration getHeaderNames() {
return this._getHttpServletRequest().getHeaderNames();
}
public int getIntHeader(String name) {
return this._getHttpServletRequest().getIntHeader(name);
}
public String getMethod() {
return this._getHttpServletRequest().getMethod();
}
public String getPathInfo() {
return this._getHttpServletRequest().getPathInfo();
}
public String getPathTranslated() {
return this._getHttpServletRequest().getPathTranslated();
}
public String getContextPath() {
return this._getHttpServletRequest().getContextPath();
}
public String getQueryString() {
return this._getHttpServletRequest().getQueryString();
}
public String getRemoteUser() {
return this._getHttpServletRequest().getRemoteUser();
}
public boolean isUserInRole(String role) {
return this._getHttpServletRequest().isUserInRole(role);
}
public java.security.Principal getUserPrincipal() {
return this._getHttpServletRequest().getUserPrincipal();
}
public String getRequestedSessionId() {
return this._getHttpServletRequest().getRequestedSessionId();
}
public String getRequestURI() {
return this._getHttpServletRequest().getRequestURI();
}
public StringBuffer getRequestURL() {
return this._getHttpServletRequest().getRequestURL();
}
public String getServletPath() {
return this._getHttpServletRequest().getServletPath();
}
public HttpSession getSession(boolean create) {
return this._getHttpServletRequest().getSession(create);
}
public HttpSession getSession() {
return this._getHttpServletRequest().getSession();
}
public boolean isRequestedSessionIdValid() {
return this._getHttpServletRequest().isRequestedSessionIdValid();
}
public boolean isRequestedSessionIdFromCookie() {
return this._getHttpServletRequest().isRequestedSessionIdFromCookie();
}
public boolean isRequestedSessionIdFromURL() {
return this._getHttpServletRequest().isRequestedSessionIdFromURL();
}
// 注意改变在这里
public boolean isRequestedSessionIdFromUrl() {
return this._getHttpServletRequest().isRequestedSessionIdFromURL();
}[/code]