首先众所周知,过滤器是与ervlet容器支持的,拦截器是与Spring容器支持的。
先谈谈Servlet(小服务程序)=Service+Applet(小应用程序):
Servlet是一个供其他Java程序调用的Java类,不能独立运行。Servlet的生命周期是由Servlet容器控制的,分为三个阶段:初始化,运行,销毁。Servlet的生命周期在百科中都有,概括而言就是由web容器调用,客户端发送请求的时候,实例化Servlet对象并初始化,再调用Service()方法离得doPost()或者doGetI()或者其他最后销毁。{需要注意的是Servlet一般只被初始化一次,即再次请求的时候不用init()直接调用service()方法}。
在eclipse中使用如下:
见附件,现在用的是4.4版本的好像web.xml就没有以前的servlet-mapping和servlet-name还有url了,说的不对请指出谢谢。
那Servlet说完了该说正点了Filter(过滤器):
<filter>
<filter-name>mainPageFilter</filter-name>
<filter-class>com.meihf.hjoyblog.filter.MainPageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>mainPageFilter</filter-name>
<url-pattern>/main/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
class对应你项目下的类目录,url-pattern是拦截请求。2.4版本后新增的<dispatcher>标签有REQUEST,FORWARD,INCLUDE,ERROR分别解释为:通过客户端传来的请求,通过forward传来的请求,通过include传来的请求和<error-page>传来的请求,默认是REQUEST。
package com.hanyx.hjoyblog.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpUtils;
import org.springframework.web.filter.OncePerRequestFilter;
public class MainPageFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain fc)
throws ServletException, IOException {
@SuppressWarnings("deprecation")
CharSequence requestPath = HttpUtils.getRequestURL(request);
int start = requestPath.toString().lastIndexOf("main")+4;
String subPath = (String) requestPath.subSequence(start,requestPath.length());
request.setAttribute("subPath", "/HJoyBlog/main"+subPath);
request.getRequestDispatcher("/main").forward(request, response);
}
}
你所写的拦截器的类继承OncePerRequestFilter,这是为什么呢?
因为要确保一次 请求只通过一次拦截器不需重复。
再来说说interceptor(拦截器)是利用发射来管理这个类。拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求都起作用。另外在action的生命周期中,拦截器可以多次被调用,而过滤器只在初始化的时候被调用一次。
拦截器是做一些业务逻辑的操作。具体怎样使用如下代码:
这里先空出来,暂时还没有写这里的代码,配置的话同理写一个拦截器,然后在struts.xml中进行配置,等我写了我会再贴出来。
后续再补充还有SpringMVC的interceptor也会补充,谢谢。说的不对请大家指出。