jsp之Filter和Listener
过滤器应实现Filter
并重写方法
package web; 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; public class LogFilter implements Filter { @Override public void destroy() { System.out.println("销毁LogFilter"); } /* * tomact启动时会自动实例化Filter, * 然后调用其init()来初始化Filter. * 调用此方法时会传入config,该对象 * 和Filter是一对一的关系,可以给Filter * 预置参数(web.xml).该对象和 * ServletConfig用法完全一样. */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化LogFilter"); } //该方法是处理公共业务的方法. //Filter相当于是Servlet们的管家, //tomcat在调用Servlet之前会将请求 //提交给Filter,Filter有权让请求继续, //也有权让请求终止. //tomcat就是调用doFilter方法让Filter //统一处理请求的,调用前它会创建好 //request和response并传入,创建的类型: //RequestFacade和ResponseFacade @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println("在前面记录日志"); //请求继续,向下执行 chain.doFilter(req, res); System.out.println("在后面记录日志"); } }
xml配置
<filter> <filter-name>log</filter-name> <filter-class>web.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>log</filter-name> <!-- 声明此Filter可以过滤哪些请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
其中chain.doFilter(Request,Response);作用是继续进行请求
过滤器中亦可以预置参数
<init-param> <param-name>city</param-name> <param-value>北京</param-value> </init-param>
我们可以再写一个小例子
GuolvFilter.java
package web; 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; public class GuolvFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println("ahead"); chain.doFilter(req, res); System.out.println("after"); } @Override public void init(FilterConfig cfg) throws ServletException { System.out.println(cfg.getInitParameter("city")); } }
xml
<filter> <filter-name>guolv</filter-name> <filter-class>web.GuolvFilter</filter-class> <init-param> <param-name>city</param-name> <param-value>北京</param-value> </init-param> </filter> <filter-mapping> <filter-name>guolv</filter-name> <!-- 声明此Filter可以过滤哪些请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
Listener implements ServletRequestListener,ServletRequestAttributeListener
public void attributeAdded(ServletRequestAttributeEvent srae)
public void attributeRemoved(ServletRequestAttributeEvent srae)
public void attributeReplaced(ServletRequestAttributeEvent srae)
//tomcat销毁request前自动调用此方法
@Override
public void requestDestroyed(ServletRequestEvent e)
//tomcat创建request后自动调用此方法
@Override
public void requestInitialized(ServletRequestEvent e)
MyListener.java
package web; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; public class MyListener implements ServletRequestListener,ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("向request内添加了一个值"); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { } //tomcat销毁request前自动调用此方法 @Override public void requestDestroyed(ServletRequestEvent e) { System.out.println("销毁request"); } //tomcat创建request后自动调用此方法 @Override public void requestInitialized(ServletRequestEvent e) { System.out.println("创建request"); System.out.println(e.getServletRequest()); } }
xml
<listener> <listener-class>web.MyListener</listener-class> </listener>