JSP与Servlet的(二):Filter与Servlet的探究

一.Filter与Servlet的实例

1.过滤器配置思维导图

2.filter的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Archetype Created Web Application</display-name>

    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.hly.jsp.filter.LoginFilter</filter-class>
        <init-param>
            <param-name>user</param-name>
            <param-value>hly</param-value>
        </init-param>
    </filter>
    <!--一个过滤器对应一个映射-->
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

3.filter拦截类

需要拦截的类,这里需要引入servlet包,并实现Filter接口,否则会出现报错。

package com.hly.jsp.filter;
import javax.servlet.*;
import java.io.IOException;
/**
 * @author :hly
 * @github :github.com/SiriusHly
 * @blog :blog.csdn.net/Sirius_hly
 * @date :2018/8/17
 */
public class LoginFilter implements Filter {

    public void init(FilterConfig filterConfig){
        /*获得初始化参数*/
        String user = filterConfig.getInitParameter("user");
        System.out.println("用户名:"+user);
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("user");
        System.out.println("请求传回过滤链");
        filterChain.doFilter(request,response);
    }
    public void destroy(){
        /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
    }

}

4.servlet的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Archetype Created Web Application</display-name>

    <!--Servlet拦截器-->
    <servlet>
        <servlet-name>ServletFilter</servlet-name>
        <servlet-class>com.hly.jsp.filter.ServletFilter</servlet-class>
    </servlet>

     <servlet-mapping>
        <servlet-name>ServletFilter</servlet-name>
        <!--访问的Servlet类的地址-->
        <url-pattern>/ServletFilter</url-pattern>
    </servlet-mapping>

</web-app>

5.要拦截的Servlet类

package com.hly.jsp.filter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author :hly
 * @github :github.com/SiriusHly
 * @blog :blog.csdn.net/Sirius_hly
 * @date :2018/8/17
 */
@WebServlet("/ServletFilter")
public class ServletFilter extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //相应内容类型
        System.out.println("ServletFilter过滤器");
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        out.print("123");
    }

    public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
        doGet(request,response);
    }

}

     在web.xml里面配置servlet过滤器时, <url-pattern>/ServletFilter</url-pattern>即为访问的地址。

6.@WebServlet(value = "/ServletFilter")

Servlet3.0后,不需要再web.xml里面配置地址,可直接@WebServlet(value = "/ServletFilter")配置配置。

package com.hly.jsp.filter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author :hly
 * @github :github.com/SiriusHly
 * @blog :blog.csdn.net/Sirius_hly
 * @date :2018/8/17
 */

@WebServlet(value = "/ServletFilter")
public class ServletFilter extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //相应内容类型
        System.out.println("ServletFilter过滤器");
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();
        out.print("123");
    }
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
        doGet(request,response);
    }

}

/ServletFilter即为访问的地址。

7.WebServlet属性列表

属性名 类型 描述
name String 指定Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
value String[] 该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatterns String[] 指定一组 Servlet 的 URL 匹配模式。等价于<url-pattern>标签。
loadOnStartup int 指定 Servlet 的加载顺序,等价于 <load-on-startup>标签。
initParams WebInitParam[] 指定一组 Servlet 初始化参数,等价于<init-param>标签。
asyncSupported boolean 声明 Servlet 是否支持异步操作模式,等价于<async-supported> 标签。
description String 该 Servlet 的描述信息,等价于 <description>标签。
displayName String 该 Servlet 的显示名,通常配合工具使用,等价于 <display-name>标签。

二.Filter与Servlet的区别

(参考:https://www.cnblogs.com/acmwangpeng/p/5943462.html

1.概念:

        1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
 
         2、filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

2.生命周期:       

         1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
        (1)、装入:启动服务器时加载Servlet的实例;
        (2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成;
        (3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
        (4)、销毁:停止服务器时调用destroy()方法,销毁实例。 
 
        2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)
        (1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
        (2)、每一次请求时都只调用方法doFilter()进行处理;
        (3)、停止服务器时调用destroy()方法,销毁实例。 :


 3.职责:

        1、servlet:

        (1)创建并返回一个包含基于客户请求性质的动态内容的完整的html页面;
        (2)创建可嵌入到现有的html页面中的一部分html页面(html片段);
        (3)读取客户端发来的隐藏数据;
        (4)读取客户端发来的显示数据;
        (5)与其他服务器资源(包括数据库和java的应用程序)进行通信;
        (6)通过状态代码和响应头向客户端发送隐藏数据。
 
       2、filter:
 
        (1)filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:
        (2)在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;
        (3)根据程序需要修改请求和响应;
        (4)在servlet被调用之后截获servlet的执行

4.区别:

       1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.
        2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
        3.filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等

猜你喜欢

转载自blog.csdn.net/Sirius_hly/article/details/81784539