### 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>