• Fourth Week (补充完整)


    1.introduce servlet filter

    一、Filter简介

           Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

    二、Filter是如何实现拦截的?

    Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

    1. 调用目标资源之前,让一段代码执行。
    2. 是否调用目标资源(即是否让用户访问web资源)。
    3. 调用目标资源之后,让一段代码执行。

      web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

    三、Filter的生命周期

    4.1、Filter的创建

      Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

    4.2、Filter的销毁

      Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。

    4.3、FilterConfig接口

      用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
      String getFilterName():得到filter的名称。
      String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
      Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
      public ServletContext getServletContext():返回Servlet上下文对象的引用。

    2.hello2 source analisis

    2.hello2代码分析

    Responseservlet.java:
    package javaeetutorial.hello2;  #软件包名为javaeetutorial.hello2


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

      #导入io 和 serverlet相关的各类包
    @WebServlet("/response")

      #注解WebServerlet 为response
    public class ResponseServlet extends HttpServlet {

      #定义类ReponseServerlet从HttpServerlet拓展而来

    @Override

      #注解Override
    public void doGet(HttpServletRequest request,

      #定义对象doGet ,定义HttpServerletRequest 为request

    HttpServletResponse response)

      #定义HttpServerResponse 为response
    throws ServletException, IOException {

      #抛出异常
    try (PrintWriter out = response.getWriter()) {

      #将response的getWeite方法赋值给PrintWrite的out,response的getWrite方法来自于HttpServletResponse接口方法
    String username = request.getParameter("username");

      #将request的getParameter方法获得的username赋值给字符串username,requset来自于HttpServerletRequest接口方法
    if (username != null && username.length() > 0) {

      #当username字符串不为空且username的长度大于0时
    out.println("<h2>Hello, " + username + "!</h2>");

      #调用out的println打印Hello,和字符串
    }
    }
    }

    @Override
    public String getServletInfo() {
    return "The Response servlet says hello.";

      #定义字符串getServerletinfo,返回内容

    }
    }

     

    GreetingServlet.java:

    package javaeetutorial.hello2;  

      #包名hello2

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

      #导入各类需要的资源包

    @WebServlet("/greeting")  

      #注解名greeting
    public class GreetingServlet extends HttpServlet {

      #拓展类GreetingServlet从HttpServlet接口

    @Override

      #注解Override
    public void doGet(HttpServletRequest request,
    HttpServletResponse response)

      #同上定义对象 HttpServletRequest名为request,HttpServletResponse名为response
    throws ServletException, IOException {

      #抛出异常

    response.setContentType("text/html");

      #定义文本类型为text,html
    response.setBufferSize(8192);

      #定义缓冲池大小8192
    try (PrintWriter out = response.getWriter()) {
    out.println("<html lang="en">"
    + "<head><title>Servlet Hello</title></head>");

    // then write the data of the response
    out.println("<body bgcolor="#ffffff">"
    + "<img src="resources/images/duke.waving.gif" "
    + "alt="Duke waving his hand">"
    + "<form method="get">"
    + "<h2>Hello, my name is Duke. What's yours?</h2>"
    + "<input title="My name is: " type="text" "
    + "name="username" size="25"/>"
    + "<p></p>"
    + "<input type="submit" value="Submit"/>"
    + "<input type="reset" value="Reset"/>"
    + "</form>");

      #以上是打印网页页面相关内容

    String username = request.getParameter("username");
    if (username != null && username.length() > 0) {
    RequestDispatcher dispatcher =
    getServletContext().getRequestDispatcher("/response");
      #将response响应赋给dispatcher分发调度
    if (dispatcher != null) {
    dispatcher.include(request, response);
    }

      #当匹配到处理请求响应的处理服务时,就返回请求和response.java的响应内容结果
    }
    out.println("</body></html>");
    }
    }

    @Override
    public String getServletInfo() {
    return "The Hello servlet says hello.";

      #在页面返回响应的文字

    }
    }

  • 相关阅读:
    数组的简单操方法
    Java Script 流程控制语句(if判断、switch选择和循环)
    HTML,表单
    CSS盒子定位
    CSS基础选择器简单介绍
    java操作redis
    ios选择城市
    格式化java对象为json
    java冒泡排序法
    mongoDB group分组
  • 原文地址:https://www.cnblogs.com/fengzimu/p/10714813.html
Copyright © 2020-2023  润新知