JavaWeb拾遗(9)Servlet Filter Listener

Filter

filter即过滤器,可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
在这里插入图片描述
要实现一个filter,要实现Filter接口(javax.servlet.Filter)并重写三个方法
void init(FilterConfig filterConfig)

void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

public void destroy()

程序启动会调用init(),结束调用destroy(),如果拦截到符合的请求会调用doFilter();
过滤器链
多个过滤器组成,可以用chain.doFilter(request, response)
将请求传递给下一个过滤器,如果没有下一个,就转发给指向的资源。
(request------>filterA------->filterB–…—>Servlet)
过滤器的顺序可以通过web.xml文件配置。(filter-mapping的先后顺序)

web.xml

 <filter>
    <display-name>MyFilterA</display-name>
    <filter-name>MyFilterA</filter-name>
    <filter-class>filter.MyFilterA</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilterA</filter-name>
    <url-pattern>/MyServlet</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>MyFilterB</display-name>
    <filter-name>MyFilterB</filter-name>
    <filter-class>filter.MyFilterB</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilterB</filter-name>
    <url-pattern>/MyServlet</url-pattern>
  </filter-mapping>

Filter的配置和Servlet很像 (Servlet)
url-pattern拦截,name映射
filter的顺序是由mapping的先后顺序决定的
也可以在mapping中加上任意的dispatcher标签可以设置拦截的请求类型:
默认是 REQUEST
REQUEST :拦截HTTP请求 get post
FORWARD :拦截 请求转发方式
INCLUDE :拦截 request.getRequestDispatcher().include() 或者 jsp:include page=""方式
ERROR : 拦截 error-page方式

MyFilterA MyFilterB

TestA.jsp----->MyFilterA----->MyFilterB------->MyServlet

TestA.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <a href="MyServlet">MyServlet</a>
</body>
</html>

MyServlet



/**
 * Servlet implementation class Myservlet
 */
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("MyServlet启动");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

MyFilterA


/**
 * Servlet Filter implementation class MyFilterA
 */
public class MyFilterA implements Filter {

    /**
     * Default constructor. 
     */
    public MyFilterA() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
        System.out.println("FilterA拦截了请求");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("FilterA接受了响应");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

MyFilterB



/**
 * Servlet Filter implementation class MyFilterB
 */
public class MyFilterB implements Filter {

    /**
     * Default constructor. 
     */
    public MyFilterB() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("FilterB拦截了请求");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("FilterB接收了响应");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

在这里插入图片描述

Listener

监听器就是监听某个对象的的状态变化的组件
被监听的对象:request session servletContext(application)
按监听的对象域和监听的内容可以分为

request域session域servletContext域
监听对象的创建和销毁ServletRequestListenerHttpSessionListenerServetContextListener
监听对象域的属性变更ServletRequestAttributeListenerHttpSessionAttributeListenerServetContextAttributeListener

web.xml

<listener>
    <listener-class>listener.MyListener</listener-class>
  </listener>
  <listener>
    <listener-class>listener.MyAttributeListener</listener-class>
  </listener>

监听对象的创建和销毁

监听器要实现这几个对应的接口:
ServletRequestListener
HttpSessionListener
ServetContextListener

三个接口的方法都大同小异:

//监听创建
void contextInitialized(ServletContextEvent sce);
//监听销毁
void contextDestroyed(ServletContextEvent sce);

MyListener

TestA.jsp------>MyServlet(执行销毁session)

MyListener

public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {

    /**
     * Default constructor. 
     */
    public MyListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了session的创建");
    }

	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent sre)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了request的销毁");
    }

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent sre)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了request的创建");
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了session的销毁");
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了servletContext的销毁");
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
    	System.out.println("监听到了servletContext的创建");
    }
	
}

在这里插入图片描述

监听对象域的属性变化

要实现以下对应的接口
ServletRequestAttributeListener
HttpSessionAttributeListener
ServetContextAttributeListener

要实现三个方法:

//监听增加
void attributeAdded(ServletContextAttributeEvent scae);
//监听删除
void attributeRemoved(ServletContextAttributeEvent scae);
//监听修改
void attributeReplaced(ServletContextAttributeEvent scae);

//对应域中的属性名
String name = scab.getName();
//域中的属性值
String value = (String) scab.getValue();
System.out.println("添加属性" + name + " : " + value);

监听器简单实现网页累计访问

通过servletContext的属性域可以实现
每监听到一个request请求,就将servletContext的访问量+1.

TestA---->TesB(显示访问数)

TesA

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
     <a href="TestB.jsp">TestB</a>
</body>
</html>

TestB

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
       <%
          int visit = (int)application.getAttribute("visit");
          out.print("访问总次数:"+visit);
       %>
</body>
</html>

MyListener

public class MyListener implements ServletContextListener,  ServletRequestListener {

    /**
     * Default constructor. 
     */
    public MyListener() {
        // TODO Auto-generated constructor stub
    }

	

	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent sre)  { 
         // TODO Auto-generated method stub
    }

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent sre)  { 
         // TODO Auto-generated method stub
         //监听到请求就访问量+1
    	int visit = (int) sre.getServletContext().getAttribute("visit");
    	sre.getServletContext().setAttribute("visit", visit+1);
    }


	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
    	
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
         //ServletContext创建时创建访问量
    	 sce.getServletContext().setAttribute("visit", 0);
    }
	
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值