### Servlet 生命周期

1、当客户端请求 Servlet 时,Tomcat 会查询当前目标 Servlet 的实例化对象是否存在,如果不存在,则执行第 2 步,如果存在,则执行第 4 步。

2、通过反射机制创建 Servlet 的实例化对象(Tomcat 完成)。

3、调用 init 方法完成初始化的操作。

4、调用 service 方法完成具体的业务逻辑。

5、当关闭 Tomcat 应用的时候,Tomcat 会调用 destory 方法,释放当前 Servlet 对象占用的资源。



### Servlet 生命周期方法

- 构造函数,只调用一次,创建对象。
- init 方法,只调用一次,初始化对象。
- service 方法,调用多次,执行多少请求,就调用多少次。
- destory 方法,只调用一次,卸载对象。



init 方法获取的 ServletConfig,可以用来获取 Servlet 相关配置。

1、getServletName() 获取当前 Servlet 的name,由 web.xml 中配置的 servlet-name 来决定。

2、getInitParamter() 获取当前 Servlet 的初始化参数,配置在 web.xml 中。

3、getServletContext() 获取当前 Servlet 的上下文对象。

4、getInitParameterNames() 获取当前 Servlet 的所有初始化参数名。

```java
@Override
public void init(ServletConfig servletConfig) throws ServletException {
  System.out.println(servletConfig.getServletName());
  System.out.println(servletConfig.getServletContext());
  System.out.println(servletConfig.getInitParameter("username"));
  Enumeration<String> names = servletConfig.getInitParameterNames();
  while(names.hasMoreElements()){
    System.out.println(names.nextElement());
  }
}
```



### ServletConfig 和 ServletContext 的区别

我们可以通过 ServletConfig 对象获取当前 Servlet 的配置信息。

ServletContext 是当前 Servlet 的上下文,Servlet 的管理者,可以获取当前 Servlet 对象相关的各种资源。

ServletConfig 作用于某个特定的 Servlet 对象,每个 Servlet 对象都有一个 ServletConfig。

ServletContext 作用于整个 Web 应用,多个 Servlet 共用同一个 ServletContext,一个 Web 应用只能有一个 ServletContext,但是可以有多个 ServletConfig。

ServletContext 是全局变量,ServletConfig 是局部变量。



### ServletContext 的常用方法

- getInitParameter(String key) 获取全局参数。
- getServerInfo() 获取当前 Tomcat 容器信息。
- getContextPath() 获取当前 Web 应用的工程名。
- getRealPath() 获取当前 Web 应用的绝对路径。

HelloServlet.java

package com.southwind.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ServletConfg:"+config.getInitParameter("username"));
        System.out.println("ServletContext:"+config.getServletContext().getInitParameter("username"));
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
    }
}

 

MyGenericServlet.java

package com.southwind.servlet;

import javax.servlet.*;
import java.io.IOException;

public class MyGenericServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String idStr = servletRequest.getParameter("id");
        System.out.println(idStr);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destory...");
    }
}

 

MyHttpServlet.java

package com.southwind.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String method = request.getMethod();
        switch (method){
            case "GET":
                doGet(request,response);
                break;
            case "POST":
                doPost(request,response);
                break;
        }
    }

    public void doGet(HttpServletRequest request,HttpServletResponse response){
        System.out.println("doGet");
    }

    public void doPost(HttpServletRequest request,HttpServletResponse response){
        System.out.println("doPost");
    }
}

 

MyServlet.java

package com.southwind.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;

public class MyServlet extends MyHttpServlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("ServletConfg:"+servletConfig.getInitParameter("username"));
        System.out.println("ServletContext:"+servletConfig.getServletContext().getInitParameter("username"));
        System.out.println(servletConfig.getServletContext().getServerInfo());
        System.out.println(servletConfig.getServletContext().getContextPath());
        System.out.println(servletConfig.getServletContext().getRealPath(""));
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {

    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {

    }

    @Override
    public void destroy() {
        System.out.println("destory...");
    }
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-02
  Time: 20:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>

web.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">

    <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.southwind.servlet.HelloServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>hello</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello.do</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.southwind.servlet.MyServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123123</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test.do</url-pattern>
    </servlet-mapping>
    
</web-app>

 

posted on 2019-07-13 23:34  HiJackykun  阅读(253)  评论(0编辑  收藏  举报