Servlet (2)

1. Ciclo de vida del servlet
En Java, cualquier objeto tiene un ciclo de vida y Servlet no es una excepción. El ciclo de vida de un servlet se muestra en la Figura 1.
Inserte la descripción de la imagen aquí

El ciclo de vida de un servlet. Según diferentes funciones, el ciclo de vida de un servlet se puede dividir aproximadamente en cuatro fases, a saber, la fase de instanciación de carga, la fase de inicialización, la fase de operación [solicitud de procesamiento] y la fase de destrucción.
1. Carga de la etapa de creación de instancias
Cuando se inicia el contenedor de Servlet, se cargará el archivo de configuración web.xml del proyecto, y se analizará el nombre del paquete + el nombre de la clase configurados en toda la clase de servlet configurada, y el paquete se instanciado a través del mecanismo de reflexión del objeto de clase Servlet correspondiente al nombre + nombre de la clase.
2. En la fase de inicialización,
cuando el cliente envía una solicitud HTTP al contenedor Servlet para acceder al Servlet, el contenedor Servlet primero analizará la solicitud y verificará si el objeto Servlet ya está en la memoria. Si es así, use el objeto Servlet directamente, de lo contrario, cree un objeto de instancia de Servlet y luego implemente la inicialización del Servlet llamando al método init (). Cabe señalar que en todo el ciclo de vida de un servlet, su método init () solo se puede llamar una vez.
3. Fase de ejecución [solicitud de procesamiento]
Esta es la fase más importante del ciclo de vida del servlet. En esta fase, el contenedor Servlet crea un objeto ServletRequest que representa la solicitud HTTP y un objeto ServletResponse que representa la respuesta HTTP para esta solicitud, y luego toma ellos como parámetros Pasados ​​al método service () del servlet.
El método service () obtiene la información de la solicitud del cliente del objeto ServletRequest y procesa la solicitud, y genera el resultado de la respuesta a través del objeto ServletResponse.
En todo el ciclo de vida de un Servlet, para cada solicitud de acceso de un Servlet, el contenedor de Servlet llamará al método service () del Servlet una vez y creará nuevos objetos ServletRequest y ServletResponse, es decir, el método service () está en toda la vida del Servlet Se llamará varias veces durante el ciclo.
4. Fase de destrucción
Cuando el servidor se apaga o la aplicación web se elimina del contenedor, el servlet se destruye cuando se cierra la aplicación web. Antes de destruir el Servlet, el contenedor de Servlet llamará al método destroy () del Servlet para permitir que el objeto Servlet libere los recursos que ocupa. En todo el ciclo de vida de un servlet, el método destroy () solo se puede llamar una vez.
Cabe señalar que una vez que se crea el objeto Servlet, residirá en la memoria y esperará a que el cliente acceda a él. El objeto Servlet no se destruirá hasta que se cierre el servidor o se elimine la aplicación web del contenedor.

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class TestServlet2 extends HttpServlet{
	@Override
	public void init() throws ServletException {
		System.out.println("初始化阶段调用 init() 方法实现 Servlet 的初始化工作");
	}
	@Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		System.out.println("运行阶段Servlet 容器都会调用一次 Servlet 的 service() 方法,完成请求处理");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源");
	}
}

Inserte la descripción de la imagen aquí

La relación entre el método de servicio de Servlet y el método doGet / doPost 1. El
método de servicio y el método doGet / doPost son ambos métodos de la clase HttpServlet
1.service(ServletRequest req, ServletResponse resp)-desde el Servlet interfaz
2.service(HttpServletRequest req, HttpServletResponse resp)-topadoras Definidos
3.doGet(HttpServletRequest req, HttpServletResponse resp)auto-Definidos
4.doPost(HttpServletRequest req, HttpServletResponse resp)auto definidos
en Al procesar específicamente la solicitud, el contenedor de Servlet llamará al método .service (ServletRequest req, ServletResponse resp) desde la interfaz de Servlet de forma predeterminada para realizar la solicitud. La clase HttpServlet utilizará el método service (ServletRequest req, ServletResponse resp) de la interfaz Servlet para llamar al servicio definido por el propio HttpServlet (HttpServletRequest req, HttpServletResponse resp). Este es el servicio definido por HttpServlet en sí mismo (HttpServlet) cuando se procesa la solicitud (HttpServlet) .req, HttpServletResponse resp). En este momento, el objeto HttpServletRequest se utiliza en el método de servicio (HttpServletRequest req, HttpServletResponse resp) definido por HttpServlet para obtener el método de envío de hidrógeno, y se llama al método doGet / doPost correspondiente para procesar la solicitud juzgando el método de envío de la solicitud.

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";
    @Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		HttpServletRequest arg0=(HttpServletRequest)req;
		HttpServletResponse arg1=(HttpServletResponse)resp;
		service(arg0,  arg1); 
	}
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		String method=arg0.getMethod();
		if(method.equals("get")){
			doGet(arg0, arg1);
		}
		if(method.equals("post")){
			doPost(arg0, arg1);
		}
	}
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
   ..........
}

Mapeo de rutas virtuales de configuración de servlet El mapeo
múltiple de servlet significa que el mismo servlet puede mapearse en múltiples rutas virtuales. En otras palabras, el cliente puede acceder al mismo Servlet a través de múltiples rutas. Hay dos formas de implementar el mapeo múltiple de Servlet.
1) Configurar varios elementos

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestServlet3 / test3
http: // localhost: 8080 / TestServlet3 / test33
Estas dos rutas diferentes anteriores pueden acceder al mismo programa Servlet.
2) Configurar múltiples subelementos Configurar múltiples subelementos
en el elemento

 <servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestServlet3 / test3
http: // localhost: 8080 / TestServlet3 / test33
Estas dos rutas diferentes anteriores pueden acceder al mismo programa Servlet.
Uso de comodines
en rutas de mapeo de servlet En el proceso de desarrollo real, los desarrolladores a veces esperan que todas las rutas de un directorio determinado puedan acceder al mismo servlet. En este momento, se pueden usar comodines " "

en la ruta de mapeo de servlet . Hay dos formatos de caracteres comodín, como se indica a continuación. 1. El formato es " . Extensión", por ejemplo * .do coincide con todas las direcciones URL que terminan en .do.
Haga coincidir todas las direcciones URL que terminan en .hello.

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>*.hello</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestServlet3 / abc.hello
http: // localhost: 8080 / TestServlet3 / hello.hello

2. El formato es / , por ejemplo, / abc / coincide con todas las direcciones URL que comienzan con / abc.
Coincidir con todas las direcciones URL

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/*</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestServlet3 / test3
http: // localhost: 8080 / TestServlet3 / test33
http: // localhost: 8080 / TestServlet3 / abc
http: // localhost: 8080 / TestServlet3 / hello

Coincide con todas las direcciones URL que comienzan con / test.

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test/*</url-pattern>
  </servlet-mapping>

http: // localhost: 8080 / TestServlet3 / test
http: // localhost: 8080 / TestServlet3 / test / abc

Cabe señalar que los dos formatos comodín no se pueden mezclar. Por ejemplo, /abc/*.do es ilegal El mapeo sendero.
Además, cuando el cliente accede a un servlet, si la dirección URL solicitada puede coincidir con varias rutas virtuales, Tomcat adoptará el principio de coincidencia más específico para encontrar la ruta de mapeo virtual más cercana a la URL solicitada.
Por ejemplo, para algunas relaciones de mapeo como se muestra a continuación:
Inserte la descripción de la imagen aquí

Cuando la URL de la solicitud es /abc/a.html----/abc/* y / * puede coincidir con esta URL, Tomcat llamará a Servlet1.
Cuando la URL de la solicitud sea / abc ---- / , / abc / y / abc Ambos pueden coincidir con esta URL y Tomcat llamará a Servlet3.
Cuando la URL de la solicitud es /abc/a.do-----/ , .do y / abc / pueden coincidir con esta URL, Tomcat llamará a Servlet1.
Cuando la URL de la solicitud es /a.do--------/
y .do puede coincidir con esta URL, Tomcat llamará a Servlet2.
Cuando la URL de la solicitud es /xxx/yyy/a.do---- Tanto
.do como / * pueden coincidir con esta URL, y Tomcat llamará a Servlet2.
Servlet predeterminado
Si la ruta de mapeo de un determinado servlet es solo una barra inclinada (/), entonces este servlet es el servlet predeterminado de la aplicación web actual. Cuando el servidor de servlet recibe una solicitud de acceso, si la URL del elemento coincidente no se encuentra en el archivo web.xml, entregará la solicitud de acceso al servlet predeterminado para su procesamiento, es decir, el servlet predeterminado se usa para procesar otros servlets que no serán procesados ​​Solicitud de acceso.
Cabe señalar que también se configura un Servlet predeterminado en el archivo web.xml en la carpeta conf del directorio de instalación de Tomcat. La información de configuración es la siguiente:

<servlet>
    <servlet-name>default</servlet-name>
    <serlet-class>org.apache.catalina.servlets.DefaultServlet</serlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

En la información de configuración anterior, org.apache.catalina.servlets.DefaultServlet se establece como el Servlet predeterminado, que funciona en todas las aplicaciones web en el servidor Tomcat.
Cuando una determinada aplicación web en el servidor Tomcat no tiene un Servlet predeterminado, DefaultServlet se utilizará como Servlet predeterminado. Cuando el cliente accede a un archivo HTML estático en el servidor Tomcat, DefaultServlet determinará si el HTML existe y, si existe, enviará los datos al cliente en forma de flujo; de lo contrario, informará un error 404 .
Inserte la descripción de la imagen aquí

El proceso completo de procesamiento de solicitudes de usuario de servlet Para
cada solicitud de servlet, el servidor web creará objetos HttpServletRequest y HttpServletResponse antes de llamar al método service (). Entre ellos, el objeto HttpServletRequest se utiliza para encapsular el mensaje de solicitud HTTP, denominado objeto de solicitud. El objeto HttpServletResponse se utiliza para encapsular el mensaje de respuesta HTTP, denominado objeto de respuesta. El proceso interactivo del navegador que accede al Servlet se muestra en la Figura 1.
Inserte la descripción de la imagen aquí

En la figura, el navegador envía primero una solicitud HTTP al servidor Web. Según la solicitud recibida, el servidor Web primero crea un objeto HttpServletRequest y HttpServletResponse y luego llama al programa Servlet correspondiente. Cuando el programa Servlet se está ejecutando, primero lee la información de datos del objeto HttpServletRequest, luego procesa el mensaje de solicitud a través del método service () y escribe los datos de respuesta procesados ​​en el objeto HttpServletResponse. Finalmente, el servidor web lee los datos de respuesta del objeto HttpServletResponse y los envía al navegador.
Cabe señalar que durante la fase de ejecución del servidor web, cada Servlet solo creará un objeto de instancia. Para cada solicitud HTTP, el servidor web llamará al método de servicio (solicitud HttpServletRequest, respuesta HttpServletResponse) de la instancia de Servlet solicitada y volverá a crear it. Un objeto de solicitud y un objeto de respuesta.
2. Interfaces, clases y métodos de uso común
en la empresa Servlet Sun proporciona una serie de interfaces y clases para el desarrollo de la tecnología Servlet, la interfaz más importante es javax.servlet.Servlet.
Interfaz 1.Servlet

public abstract interface Servlet 

Inserte la descripción de la imagen aquí

Para la interfaz de Servlet, Sun proporciona dos clases de implementación de interfaz predeterminadas: GenericServlet y HttpServlet. Entre ellos, GenericServlet es una clase abstracta, que proporciona una implementación parcial para la interfaz Servlet, pero no implementa el procesamiento de solicitudes HTTP.

public abstract class GenericServlet implements javax.servlet.Servlet, javax.servlet.ServletConfig, java.io.Serializable {

HttpServlet es una subclase de GenericServlet, hereda todos los métodos de GenericServlet y proporciona métodos de operación específicos para GET y POST en solicitudes HTTP. En circunstancias normales, las clases de Servlet escritas se heredan de HttpServlet y el objeto HttpServlet también se usa en el desarrollo.
la clase pública abstracta HttpServlet extiende GenericServlet { La clase HttpServlet contiene dos métodos comunes

Inserte la descripción de la imagen aquí

2. Interfaz
ServletConfig interfaz pública abstracta ServletConfig
puede necesitar alguna información auxiliar al ejecutar un programa Servlet, como la codificación utilizada por el archivo, la información compartida utilizando el programa Servlet, etc. Esta información puede utilizar uno o más elementos en la web. Archivo xml Configúrelo. Cuando Tomcat inicializa un Servlet, encapsulará la información de configuración del Servlet en el objeto ServletConfig. En este momento, el objeto ServletConfig se puede pasar al Servlet llamando al método init (ServletConfig config).
ServletConfig es una interfaz que encapsula información auxiliar cuando se está ejecutando Servlet.
En la interfaz ServletConfig se definen una serie de métodos para obtener información de configuración.
Inserte la descripción de la imagen aquí

Por ejemplo: obtenga el valor del parámetro de inicialización configurado en el archivo web.xml y el valor de nombre de servlet configurado a través del objeto de interfaz ServletConfig.

<servlet>
    <servlet-name>testservlet4</servlet-name>
    <servlet-class>com.wangxing.servlet.TestServlet4</servlet-class>
    <!-- 配置初始化参数 -->
    <init-param>
    	<param-name>myname</param-name>
    	<param-value>zhangsan</param-value>
    </init-param>
    <init-param>
    	<param-name>mypassword</param-name>
    	<param-value>123456</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>testservlet4</servlet-name>
  	 <url-pattern>/test4</url-pattern>
  </servlet-mapping>

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletConfig接口对象
		ServletConfig config=this.getServletConfig();
		//通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值
		//String getInitParameter(String name)	根据初始化参数名返回对应的初始化参数值
		String myname=config.getInitParameter("myname");
		String mypassword=config.getInitParameter("mypassword");
	System.out.println("初始化参数值myname=="+myname+",mypassword=="+mypassword);
//得到web.xml 中 <servlet-name>元素的值
	    //String getServletName()	返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值
	    String servletName=config.getServletName();
	    System.out.println(" web.xml 中 <servlet-name>元素的值==="+servletName);
	}

Inserte la descripción de la imagen aquí

3. Interfaz ServletContext
Cuando se inicia Tomcat, Tomcat creará un objeto ServletContext único para cada aplicación web para representar la aplicación web actual, que encapsula toda la información de la aplicación web actual. Puede utilizar este objeto para obtener la versión Servlet de la aplicación web, inicializar información, leer archivos de recursos, etc.
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Configurar web.xml

 <!-- 配置初始化信息 -->
  <context-param>
     <param-name>myname</param-name>
     <param-value>lisi</param-value>
  </context-param>
  <context-param>
  	<param-name>myage</param-name>
  	<param-value>24</param-value>
  </context-param>
  <servlet>
    <servlet-name>testservlet5</servlet-name>
    <servlet-class>com.wangxing.servlet.TestServlet5</servlet-class>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>testservlet5</servlet-name>
  	 <url-pattern>/test5</url-pattern>
  </servlet-mapping>

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletContext接口对象
		ServletContext context=this.getServletContext();
		//得到Servlet版本号
		int majorVersion=context.getMajorVersion();
		int minorVersion=context.getMinorVersion();
		System.out.println("Servlet版本号=="+majorVersion+"."+minorVersion);
		//得到初始化信息
		//String  getInitParameter(String)	得到指定的初始化信息<context-param>
		String name=context.getInitParameter("myname");
		String age=context.getInitParameter("myage");
		System.out.println("初始化信息myname=="+name+",age=="+age);
		// 得到包含所有初始化信息名的Enumeration对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (paramNames.hasMoreElements()) {
          String paramname = paramNames.nextElement();
          String value = context.getInitParameter(paramname);
          System.out.println("初始化信息=="+paramname+"="+value);
        }
	}

Inserte la descripción de la imagen aquí

Lectura de archivos de recursos
en una aplicación web En el desarrollo real, a veces es necesario leer algunos archivos de recursos en una aplicación web, como archivos de configuración y archivos de registro. Por esta razón, algunos métodos para leer recursos web se definen en la interfaz ServletContext, y estos métodos son implementados por el contenedor Servlet. El contenedor de servlet devuelve el flujo de E / S del archivo de recursos asociado o la ruta absoluta del archivo de recursos en el sistema de acuerdo con la ruta del archivo de recursos en relación con la aplicación web.
Métodos relevantes utilizados para obtener la ruta de recursos en la interfaz ServletContext.
Inserte la descripción de la imagen aquí

1. Cree un archivo llamado xxxxx.properties en el directorio src del proyecto.

testname=zhangsan
testage=23
testaddress=\u897F\u5B89

2. Escriba una clase de procesamiento de servlet que lea el archivo xxxxx.properties.

package com.wangxing.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet6 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletContext接口对象
		ServletContext context=this.getServletContext();
		//读取资源文件
		//InputStream getResourceAsStream(String path)	返回映射到某个资源文件的 InputStream 输入流对象。
		InputStream in=context.getResourceAsStream("/WEB-INF/classes/mytest.properties");
		Properties pros = new Properties();
	    pros.load(in);
	    String name=pros.getProperty("testname");
	    String age=pros.getProperty("testage");
	    String address=pros.getProperty("testaddress");
	    System.out.println("mytest.properties---testname===="+name);
	    System.out.println("mytest.properties---testage===="+age);
	    System.out.println("mytest.properties---testaddress===="+address);
	}
}

3. Configure web.xml
4. Pruebe

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/guoguo0717/article/details/109080519
Recomendado
Clasificación