本人以前觉得这两个东西没什么卵用,但直到接触到了Spring框架之后,才知道这个知识点的重要性,经过一系列的整理,本文将描述这个两个的具体使用方法。
1.过滤器
首先创建一个普通类,实现Filter接口
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException{
System.out.println("filter.....init.....");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("拦截请求.......");
chain.doFilter(request,response);//放行操作
System.out.println("拦截相应.......");
}
@Override
public void destroy(){
System.out.println("filter.....destroy.....");
}
}
这里面的init()和destroy()方法和servlet的方法一模一样,不懂的朋友可以查看我的另一篇关于Servlet的博客。
如果没有chain.doFilter()这个方法,程序的进程将一直被卡在那里。
接下来在web.xml中配置相关信息:
<filter>
<filter-name>MyFilter2</filter-name>
<filter-class>Filter.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/MyServlet2</url-pattern>
</filter-mapping>
这里说明一下,filter-name 只要保证上下两个的值是一样的就行了,名字可以随便起。url-pattern的值改成/*则表示拦截所有的请求。
此外:还可以在中加入,内部的值可以参照下面的信息
值 | 作用 |
---|---|
REQUEST | 拦截HTTP请求 get post |
FORWARD | 只拦截 通过请求转发方式的请求 |
INCLUDE | 只拦截通过request.getRequestDispatcher("").include()、通过<jsp:include page="…"> |
ERROR | 只拦截发出的请求 |
2.监听器
创行一个普通,通过选择性的实现以下接口,实现相应的功能
类型 | 对应的接口 |
---|---|
request | ServletRequestListener |
session | HttpSessionListener |
application | ServletContextListener |
本文都实现一下:
public class ContextSessionRequestListener implements ServletRequestListener,HttpSessionListener,ServletContextListener {
//每个监听器 各自提供了2个方法:监听开始、监听结束的方法
//application
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听器ServletContext...销毁ServletContext对象"+sce);
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听器ServletContext...创建ServletContext对象"+sce);
}
//session
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听器HttpSession...创建HttpSession对象"+se);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("监听器HttpSession...销毁HttpSession对象"+se);
}
//request
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听器ServletRequest...销毁ServletRequest对象"+sre);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听器ServletRequest...创建ServletRequest对象"+sre);
}
}
配置web.xml
<listener>
<listener-class>Listener.ContextSessionRequestListener</listener-class>
</listener>
自己运行看结果!
如果想要监听属性的变更,则需要考虑实现以下的接口:
类型 | 对应的接口 |
---|---|
request | ServletRequestAttributeListener |
session | HttpSessionAttributeListener |
application | ServletContextAttributeListener |
本文照样全配:
public class AttributeListener implements ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
String attrName = scae.getName();//目前正在操作的属性名
Object attrValue = scae.getServletContext().getAttribute(attrName);
System.out.println("ServletContext【增加】属性:"+attrName+",属性值为:"+attrValue);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContext【删除】属性:"+scae.getName());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
/*
* application.setAttribute("name","zs");新增Name属性
* applicaation.setAttribute("name","ls");替换name属性
*
* */
String attrName = scae.getName();
Object attrValue = scae.getServletContext().getAttribute(attrName);
System.out.println("ServletContext【替换】属性:"+attrName+",属性值为:"+attrValue);
}
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
String attrName = se.getName();//目前正在操作的属性名
Object attrValue = se.getSession().getAttribute(attrName);
System.out.println("HttpSession【增加】属性:"+attrName+",属性值为:"+attrValue);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("HttpSession【删除】属性:"+se.getName());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
String attrName = se.getName();
Object attrValue = se.getSession().getAttribute(attrName);
System.out.println("HttpSession【替换】属性:"+attrName+",属性值为:"+attrValue);
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
String attrName = srae.getName();//目前正在操作的属性名
Object attrValue = srae.getServletRequest().getAttribute(attrName);
System.out.println("ServletRequest【增加】属性:"+attrName+",属性值为:"+attrValue);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("ServletRequest【删除】属性:"+srae.getName());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
String attrName = srae.getName();
Object attrValue = srae.getServletRequest().getAttribute(attrName);
System.out.println("ServletRequest【替换】属性:"+attrName+",属性值为:"+attrValue);
}
}
同样需要配置web.xml
<listener>
<listener-class>Listener.AttributeListener</listener-class>
</listener>