美文网首页
JAVA Web学习(12)___第9章 过滤器和监听器

JAVA Web学习(12)___第9章 过滤器和监听器

作者: 岁月静好浅笑安然 | 来源:发表于2019-08-20 17:32 被阅读0次

第9章 过滤器和监听器

9.1 Servlet过滤器

9.1.1 什么的过滤器

9.1.2 过滤器核心对象

  • Filter 接口
public class LogFilter implements Filter  {}
方法声明 说明
public void init(FilterConfig config) throws ServletException 过滤器初始化方法,该方法在过滤器初始化时调用
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException 对请求进行过滤处理
public void destory 销毁方法以便释放资源

*FilterConfig 接口

方法声明 说明
public String getFilterName() 获取过滤器名字
public ServletContext getServletContext 或是 Servlet上下文
public String getInitParameter(String arg0) 获取过滤器初始化参数值
public Enumeration getInitParameterNames() 获取过滤器所有初始化参数
  • FilterChain 接口
public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        
    }

9.1.3 过滤器创建和配置

  • 创建
public class MyFilter  implements Filter{

    @Override
    public void destroy() {
        
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        
            
    }

}

  • 配置
<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.runoob.test.LogFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>菜鸟教程</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>  

示例代码
统计站点访问次数,初始化访问值为5000
*MyFilter.java

package com.hwp.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class MyFilter implements Filter{
    private int count;
    @Override
    public void destroy() {
        
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
            //访问量自增
            count++;
            HttpServletRequest httpServletRequest=(HttpServletRequest)arg0;
            ServletContext context= httpServletRequest.getSession().getServletContext();
            //将来访数量传递到 ServletContext中
            context.setAttribute("count", count);
            //向下传递过滤器
            arg2.doFilter(arg0, arg1);
    }   

    @Override
    public void init(FilterConfig arg0) throws ServletException {
            //初始化参数
            String param=arg0.getInitParameter("count");
            //将字符串转换为 int   
            count=Integer.valueOf(param);
    }

}

  • web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.hwp.filter.MyFilter</filter-class>
        <init-param>
        <param-name>count</param-name>
        <param-value>5000</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

</web-app>

web.xml配置各节点说明

  • <filter>指定一个过滤器。
    • <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
    • <filter-class>元素用于指定过滤器的完整的限定类名。
    • <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
      在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
  • <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
    • <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    • <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
    • <servlet-name>指定过滤器所拦截的Servlet名称。
    • <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
    • <dispatcher>子元素可以设置的值及其意义
    • REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
    • INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
    • FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
    • ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
      *index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    
  </head>
  
  <body>
   <h2>
   您是本站第<%= application.getAttribute("count")%>位访客!
   </h2>
</html>

9.1.4 字符编码过滤器

  • index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>图书添加</title>
    
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
   <form action="BookServlet" method="post">
   <table border="1" bordercolor="#66B3FF">
   <tr >
   <td align="center" colspan="2">图书添加信息</td>
   </tr>
   <tr>
   <td>图书编号:</td>
   <td><input type="text" name="num"/></td>
   </tr>
   <tr>
   <td>图书名称:</td>
   <td><input type="text" name="name"/></td>
   </tr>
   <tr>
   <td>作者:</td>
   <td><input type="text" name="author"/></td>
   </tr>
   <tr>
   <td>价格:</td>
   <td><input type="text" name="price"/></td>
   </tr>
   <tr>
   <td align="center" colspan="2"><input type="submit" value="添加"/></td>
   </tr>
   </table>
   </form>
  </body>
</html>

  • BookServlet.jsva
package com.hwp;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BookServlet extends HttpServlet {

    
    private static final long serialVersionUID = 1L;
    public BookServlet() {
        super();
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter printWriter = response.getWriter();
        String num=request.getParameter("num");
        String name=request.getParameter("name");
        String author=request.getParameter("author");
        String price=request.getParameter("price");
        printWriter.print("<h2>图书信息添加成功</h2><hr>");
        printWriter.print("图书编号:"+num+"<br>");
        printWriter.print("书名:"+name+"<br>");
        printWriter.print("作者:"+author+"<br>");
        printWriter.print("价格:"+price+"<br>");
        printWriter.flush();
        printWriter.close();
    }

    
    public void init() throws ServletException {
        
    }

}

*AddFilter.java

package com.hwp;


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 AddFilter implements Filter {

    String encoding = null;

    public void destroy() {
        encoding = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain arg2) throws IOException, ServletException {
        if (encoding != null) {
            request.setCharacterEncoding(encoding);
            response.setContentType("text/html; charset=" + encoding);
        }
        arg2.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        encoding = arg0.getInitParameter("encoding");
    }



}

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

    <filter>
        <filter-name>AddFilter</filter-name>
        <filter-class>com.hwp.AddFilter</filter-class>
        <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>AddFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <servlet>
    <servlet-name>BookServlet</servlet-name>
    <display-name>This is the display name of my J2EE component</display-name>
    <description>This is the description of my J2EE component</description>
    <servlet-class>com.hwp.BookServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>BookServlet</servlet-name>
    <url-pattern>/BookServlet</url-pattern>
  </servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

9.2 Servlet监听器

9.2.1 Servlet监听器简介

  • Listener
序号 接口
1 ServletContextListener
2 ServletContextAttributeListener
3 HttpSessionListener
4 HttpSessionActivationListener
5 HttpSessionAttributrListener
6 HttpSessionBindingListener
7 ServletRequestListener
8 ServletRequestAttributeListener
  • Event
序号 接口
1 ServletContextEvent
2 ServletContextAttributeEvent
3 HttpSessionEvent
4 HttpSessionRequestEvent
5 HttpSessionAttributeEvent
6 HttpSessionBindingEvent

9.2.2 Servlet监听器原理

9.2.3 Servlet上下文监听

public class MyListener implements ServletContextListener {
    //通知正在收听的对象,应用程序已经被载出,即关闭
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    //通知正在收听的对象,应用程序已经被加载,即初始化
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }

}
  • web.xml配置监听器才有用
 <listener>
  <listener-class>com.hwp.MyListener</listener-class>
  </listener>

相关文章

网友评论

      本文标题:JAVA Web学习(12)___第9章 过滤器和监听器

      本文链接:https://www.haomeiwen.com/subject/tqxmsctx.html