Servlet入门到入土——生命周期

Servlet入门到入土——生命周期

通过本篇博客您将学到如下知识:Servlet生命周期、客户端HTTP请求、编写过滤器、

生命周期

  • 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
  • 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
  • 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
  • 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
  • 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作

​ 简单来说:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。

init()方法

  • 只能调用一次,在第一次创建servlet时被调用

  • Servlet创建于用于第一次调用该Servlet的URL时,也可以是指定Servlet在服务器第一次启动时被加载

  • 当用户公用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet或者doPost方法。

  • 定义

    public void init() throws ServletException {
      // 初始化代码...
    }
    

servlet()方法

  • 其是执行实际任务的主要方法。
  • Servlet容器(Web服务器)调用servlet()方法来处理来自客户端的请求,并把格式化的响应写回给客户端
  • 每次服务器接收到一个Servlet请求时,服务器都会产生一个新的线程并调用服务。Service()方法会检查HTTP的请求类型(Get、Post、Put、DELETE等),然后在合适的时候调用相应的方法

下面是该方法的特征:

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}

doGet()方法

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

doPost()方法

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

destroy()方法

  • 也是只会调用一次,在Servlet生命周期结束时被调用。
  • 可以让Servlet关闭数据库连接,停止后台线程,把Cookie列表或点击计数器写到磁盘中,并执行其他类似的清理活动

客户端HTTP请求

  • 可以使用方法在Servlet程序中读取HTTP头,这些方法通过 HttpServletRequest 对象可用
  • 使用 getHeaderNames() 方法读取 HTTP 头信息。该方法返回一个枚举,包含与当前的 HTTP 请求相关的头信息。
  • 我们可以以标准方式循环枚举,使用 hasMoreElements() 方法来确定何时停止,使用 nextElement() 方法来获取每个参数的名称。

Http状态码

  • 方法:
    • public void setStatus ( int statusCode ):该方法设置一个任意的状态码。setStatus 方法接受一个 int(状态码)作为参数。如果您的响应包含了一个特殊的状态码和文档,请确保在使用 PrintWriter 实际返回任何内容之前调用 setStatus。
    • public void sendRedirect(String url)
      该方法生成一个 302 响应,连同一个带有新文档 URL 的 Location 头。
    • public void sendError(int code, String message)
      该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息。

编写过滤器

  • Servlet过滤器作用:可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
    • 在客户端的请求访问后端资源之前,拦截这些请求
    • 在服务器的响应发送到客户端之前,处理这些响应
  • 过滤器通过Web部署描述符中的xml标签来声明,然后映射到Servlet或者URL模式。当Web容器启动Web应用时,会在声明的每一个过滤器创建一个实例
  • Filter的执行顺序与它在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有Servlet之前

FilterConfig使用

  • xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>LogfiLtertest</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>
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>demo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

</web-app>
  • Servlet过滤器实例
/**
 * Created with IntelliJ IDEA
 * Description:
 * Author: sun mingzhi
 * Date:  2019/10/30 15:41
 * Company: Inspur
 */
import javax.servlet.*;
import java.util.*;

//实现 Filter 类
public class LogfiLtertest implements Filter  {
    public void  init(FilterConfig config) throws ServletException {
        // 获取初始化参数
        String site = config.getInitParameter("Site");

        // 输出初始化参数
        System.out.println("网站名称sdas: " + site);
    }
    public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {

        // 输出站点名称
        System.out.println("站点网址:https://blog.csdn.net/issunmingzhi");

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

效果图:

在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/106443317
今日推荐