1. 新建java类
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class ActionFilter implements Filter
{
public void doFilter(ServletRequest request, ServletResponseresponse, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("ActionFilter.doFilter()and url=" +httpRequest.getRequestURL());
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig)
throws ServletException
{
System.out.println("ActionFilter.init()");
System.out.println("filterConfig=" + filterConfig);
}
public void destroy()
{
System.out.println("ActionFilter.destroy()");
}
}
package init;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class GaoStruts2Init implementsServletContextListener
{
public void contextInitialized(ServletContextEvent sce)
{
System.out.println("GaoStruts2Init.contextInitialized()");
}
public void contextDestroyed(ServletContextEvent sce)
{
System.out.println("GaoStruts2Init.contextDestroyed()");
}
}
2. 修改web.xml添加过滤器和监听器
<filter>
<filter-name>actionFilter</filter-name>
<filter-class>filter.ActionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>actionFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<listener>
<listener-class>init.GaoStruts2Init</listener-class>
</listener>
</web-app>
3. 运行
1) 启动tomcat
访问: http://localhost:2000/Gao_struts2/struts/Admin_add.action
页面显示:Admin add success!
4. 总结
1) 启动tomcat后,控制台打印了GaoStruts2Init.contextInitialized()和ActionFilter.init(),说明系统启动后先调用监听器GaoStruts2Init的contextInitialized()方法,然后会启动过滤器ActionFilter的init()方法。
2) 访问http://localhost:2000/Gao_struts2/struts/Admin_add.action后,控制台打印ActionFilter.doFilter() andurl=http://localhost:2000/Gao_struts2/struts/Admin_add_db.action,说明过滤器根据*.action的规则,过滤到请求,于是调用了ActionFilter的doFilter方法。
3) ActionFilter的doFilter方法中的chain.doFilter(request,response)是必不可少的代码,否则页面就不会跳转到Admin_add_success.jsp,原因是ActionFilter需要将请求传送给下一个过滤器即struts2的过滤器struts,完成最终页面的跳转。
4) 如果想通过该过滤器的请求都跳转到index.jsp,则将chain.doFilter(request,response)改为httpRequest.getRequestDispatcher("../index.jsp").forward(request,response)即可,我们可以想象struts2最终就是这么做的!
5) 在web.xml中过滤器和监听器的执行顺序是由上到下的,而过滤器和监听器相比较,则监听器会优先处理。
6) 自定义的过滤器最好放在struts2的过滤器前,否则你会发现过滤器不起作用,原因很简单就是struts2最终没有调用chain.doFilter(request,response),而是跳转到对应的页面了!