感觉自己真的太浅薄了,什么都不是很懂,什么都是一知半解,filter,http协议那只是一个缩影而已
可以百度,google出来的问题都不叫问题吧
那些不专业的人们啊,可不可以不要误人子弟?请不要随意在网上回答你不太懂的东西好吗?给网络一片净土吧
Ø 今天用eclipse在JavaEE下写了一个filter:
publicclass EncodeingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig =null;
public EncodeingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException {
System.out.println("我是filter");
System.out.println("title:"+req.getParameter("title"));
chain.doFilter(request,response);
}
public void init(FilterConfig fConfig)throws ServletException {
this.filterConfig = fConfig ;
this.encoding = filterConfig.getInitParameter("encoding");
}
}
Ø 如下配置:
<filter>
filter>
Ø 下面是servlet: changeTitle.java
publicclass changeTitle extends HttpServlet {
private static final long serialVersionUID =1L;
protected void doGet(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {
System.out.println("我是服务器");
}
}
Ø 下面是servlet: sendTitle.jsp
<html>
html>
Ø 把sendTitle.jsp --run as-->Run on server结果是:
我是filter
title:null
我是filter
title:null
Ø 我清空控制台后,输入hu,点击提交后的结果是:
我是filter
title:hu
我是filter
title:hu
我是服务器
Ø 网上有人说:
l 打印两次是因为一次是请求到来打印的,一次是响应到来打印的,如果真的是这样子的话,打印的结果应该是:
我是filter
title:hu
我是服务器
我是filter
title:hu
l 2. chain.doFilter(request,sresponse);
Causes the next filter in the chain to be invoked, or if the calling filter isthe last filter in the chain, causes the resource at the end of the chain to beinvoked.
Ø 于是我就去掉chain.doFilter(request,sresponse);把sendTitle.jsp --run as-->Run on server结果是:
我是filter
title:null
然后sendTitle.jsp页面没有界面的显示,因为chain.doFilter(request, sresponse);的作用是把响应或请求继续向后传递,现在没有了后续,所以就停了
l 3.有人说一次是服务器监听到的,一次是运行时的
Ø 后来我重新写了一个工程,把sendTitle.jsp --run as-->Run on server结果是:
我是filter
title:null
Ø 我清空控制台后,输入hu,点击提交后的结果是:
我是filter
title:hu
我是服务器
Ø 又有人说是xml文件的配置问题吧:
经过仔细检查我发现两个filter文件有一点不同
第一个开头是:
@WebFilter("/*")
public classEncodeingFilter implements Filter
第二个开头是:
@WebFilter("/titleFilter")
public classEncodeingFilter implements Filter
Ø 正解分析:
1.为什么打印两次?因为@WebFilter("/*")等价于
2.为什么有@WebFilter("/*")?因为New --->Filter--->输入文件名--->Next--->在Filtermappings--->
Edit-->/*,这样的操作后的结果并不会反映到web.xml中。
3.为什么两个同时有?我以为没有配置过filter,后来我自己又在web.xml加上了url-pattern>/*