Guía de inicio de Java Web Project (http, Servlet, Request, Response, ServletContext, tecnología de sesión [cookie, session], Filter, Listener)

descripción general

Resumen de servidores web, proyectos, recursos

servidor web : un servidor al que se puede acceder mediante un navegador

Servidores web comunes:

  • tomcat: software de servidor de tamaño pequeño y mediano, gratuito y de código abierto, compatible con los productos JSP y Servlet de la empresa apache
  • WebLogic: un producto de Oracle Corporation, que actualmente es el servidor web más utilizado y admite la especificación J2EE. WebLogic es un servidor de aplicaciones Java para desarrollar, integrar, implementar y administrar grandes aplicaciones web distribuidas, aplicaciones de red y aplicaciones de bases de datos. Software de servidor de pago a gran escala
  • WebSphere: el producto de IBM admite la especificación JavaEE. WebSphere es la plataforma de software más importante en la era del comercio electrónico bajo demanda, que las empresas pueden utilizar para desarrollar, implementar e integrar la nueva generación de aplicaciones de comercio electrónico. Software de servidor de pago a gran escala

proyecto web : implementado en el servidor web, el navegador puede acceder directamente al proyecto.Características: la estructura del proyecto debe seguir las reglas especificadas

recurso web :

  • Recursos estáticos: se refiere a datos codificados e inalterables en la página, como HTML, CSS, JS, imágenes, audio y video.
  • Recursos dinámicos: se refiere a los datos navegados en la página web generados por el programa, y ​​el contenido que se ve al visitar la página web en diferentes puntos de tiempo es diferente. Por ejemplo: el contenido de los temas candentes buscados en Weibo en diferentes momentos es diferente. Estos datos son generados por programas y se pueden completar tecnologías como /Servlet, ASP y PHP.

arquitectura de software

Hay muchas computadoras en la red, y su intercambio directo de información se llama: interacción.

En el proceso de interacción de Internet, existen dos métodos de interacción muy típicos: el modelo de interacción B/S y el modelo de interacción C/S.

  • Arquitectura C/S Cliente/Servidor Cliente/Servidor

    Características: Necesidad de instalar un cliente, por ejemplo: QQ cliente juego varios clientes Thunder cliente

    Ventajas: el efecto es más deslumbrante, atractivo.

    Desventajas: ocupa espacio en el disco duro, siempre que el servidor esté actualizado, el cliente debe actualizar

  • Arquitectura B/S Navegador/Servidor Navegador/Servidor

    Características: No es necesario instalar el cliente, un navegador es suficiente, por ejemplo: página web Taobao página web Jingdong página web 12306

    Ventajas: no ocupará espacio en el disco duro, siempre que el servidor esté actualizado, no es necesario actualizarlo

    Desventajas: El efecto no es deslumbrante, toda la presión está en el servidor

El mismo punto: ambos necesitan interactuar con el servidor para obtener datos. Todos primero tienen una solicitud y luego dan una respuesta. La solicitud y la respuesta deben estar en pares.


servidor tomcat

Estructura de directorios de Tomcat

bin		里面存放的都是tomcat的二进制命令  关注点:开启服务: startup.bat   关闭服务:shutdown.bat
conf	里面存放的都是tomcat的配置文件   关注点:server.xml(配置端口) web.xml
lib		里面存放的都是tomcat运行过程中提供支撑的jar包
logs	里面存放的都是日志文件  关注点:错误信息的日志文件查看 catalina.2020-xx-xx.log
temp	里面存放的是tomcat运行过程中创建的临时文件 由tomcat维护
work	里面存放的内容和jsp相关
webapps(核心)	用来存放web项目 存放在这个里面的项目可以被浏览器直接访问到 http://localhost:8080 --> webapps文件夹下

Elementos de publicación de rutas virtuales

Método 1: Configurar un archivo xml independiente

  1. Cree un nuevo directorio Catalina en el directorio tomcat/conf (no es necesario crearlo si ya existe)

  2. Cree un directorio de host local en el directorio de Catalina (no es necesario crearlo si ya existe)

  3. Cree un archivo de configuración xml en localhost, llamado: xxx.xml (el nombre xxx es el alias de acceso del navegador del proyecto)

    El código en xxx.xml es el siguiente:

    <Context docBase="项目所在的硬盘位置" />
    

Beneficios: el uso del archivo de configuración para implementar y desinstalar el proyecto no requiere reiniciar Tomcat y no afecta el archivo de configuración general de Tomcat.


Método 2: configurar server.xml y agregar etiquetas de contexto

Agregue el siguiente código al final del archivo de configuración server.xml:

<Context path="项目的浏览器访问别名" docBase="项目所在的硬盘位置" />

Nota: use con precaución (es mejor separar un archivo de configuración por separado)


Instalar Tomcat en la computadora (entender)

Instale un software tomcat en la computadora para convertir la computadora en un servidor web, pasos:

  1. Descargue un software de servidor Tomcat, dirección del sitio web oficial http://tomcat.apache.org
  2. Descomprima el Tomcat descargado. Nota: copie el archivo descomprimido a una ruta sin chino ni espacios
  3. Inicie el servicio tomcat: ingrese la ruta bin, haga doble clic en el servidor startup.bat para iniciarlo (por defecto, ocupa el puerto 8080 de la computadora)
  4. Prueba: ingrese la dirección en la página para acceder a http://localhost:8080
  5. Cierre el servicio tomcat: ciérrelo directamente o vaya a la ruta del contenedor y haga doble clic en shutdown.bat

Resumen de problemas comunes en el inicio de Tomcat

1、一闪而过
原因:没有配置环境变量JAVA_HOME 或者配置错误
解决:配置环境变量JAVA_HOME,因为tomcat在启动的时候会去找环境变量JAVA_HOME
Tomcat的底层需要JDK的支撑
	JAVA_HOME=jdk的安装路径(不要加bin目录)
	path=%JAVA_HOME%\bin


2、报错 java.net.BindException:  Address already in use: bind
原因:端口号被占用
解决:
	方式1:结束正在占用端口的进程
		1) netstat -ano 查看端口对应的pid
		2) 打开任务管理器 结束pid对应的进程
    方式2:改变自己的端口号
    	修改conf文件夹中的server.xml  大概在69行的位置
    	或者修改端口号为80: 80是默认端口号.可以不写

idea entorno Tomcat integrado (entender)

idea usa automáticamente la ruta virtual para administrar Tomcat

Pasos de Tomcat de integración de ideas:

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

idea para crear un proyecto web:

inserte la descripción de la imagen aquí

proyecto de lanzamiento de ideas:

inserte la descripción de la imagen aquí


Protocolo HTTP

Concepto y función

concepto :

Protocolo: especifica las reglas que todos los objetos restringidos deben cumplir

protocolo http:

  • Es el protocolo más utilizado entre navegadores y servidores en Internet, que estipula las reglas a seguir entre navegadores y servidores.
  • Siempre que el navegador acceda al servidor o el servidor responda, el navegador debe seguir algunas reglas formuladas por el protocolo http.
  • El protocolo http es el contrato entre nuestro navegador y el servidor, ambas partes deben acatar las disposiciones de este contrato

efecto:

  • Estipula qué datos debe traer el navegador al solicitar el servidor, y en qué formato se deben transmitir los datos
  • Especifica a qué datos debe responder el servidor cuando responde al navegador y en qué formato se deben transmitir los datos.

inserte la descripción de la imagen aquí


Contenido de la solicitud: línea de solicitud encabezado de solicitud cuerpo de solicitud

El contenido de la solicitud se divide en:

  • línea de solicitud (primera línea)

    POST        /web02_1/demo1.html       HTTP/1.1
    提交方式     要请求的服务器资源         使用的是http协议的那个版本(固定)
    
  • encabezado de solicitud (clave:valor)

    El formato de los datos: datos de pares clave-valor

    Datos de encabezado comunes: agente de usuario de referencia

    • Remitente: la dirección de origen de la página actual, que puede resolver el enlace anti-leech
    • Agente de usuario: la información de la versión del navegador del usuario, que puede resolver la descarga
  • Cuerpo de la solicitud (datos de la página que se pasarán al servidor)

    Solo el envío posterior tiene el contenido de los datos del formulario de página para pasar al servidor


Contenido de respuesta: línea de respuesta encabezado de respuesta cuerpo de respuesta

El contenido de la respuesta se divide en:

  • línea de respuesta

    // 组成部分:
    HTTP/1.1 		200
    固定协议版本	   状态码
    
    // 常见的响应状态码:
    200		OK 请求已成功,响应也没问题。出现此状态码是表示正常状态。
    302		资源重定向
    304		去找缓存数据
    403		服务器拒绝执行 (文件或文件夹加了权限)
    404		请求的资源没找到
    405		请求的方法不存在
    500		服务器错误 (代码写的有问题)
    
  • encabezado de respuesta

    Encabezados de respuesta comunes:

    • ubicación: operación de redireccionamiento, generalmente le indica al navegador que envíe una solicitud a esta dirección de inmediato
    • actualizar: operación de actualización de tiempo, salta a la página especificada después del tiempo especificado
    • disposición de contenido: informar al navegador cómo obtener los datos (mostrar los datos directamente o como un archivo adjunto) – descargar
    • tipo de contenido: informe al navegador del tipo de recurso y el formato de codificación devuelto; maneje los caracteres chinos ilegibles de los datos de respuesta
  • cuerpo de respuesta

    El contenido que debe analizar y mostrar la página del navegador es el contenido del cuerpo de la respuesta.


La diferencia entre obtener el envío y el envío posterior

  • Los datos enviados por get no son seguros, porque todos los datos del formulario de página están en la línea de solicitud, lo que significa que los recursos están expuestos en la barra de direcciones.

    Los datos enviados por correo son seguros, porque todos los datos del formulario de la página están en el cuerpo de la solicitud, lo que significa que los recursos no estarán expuestos en la barra de direcciones.

  • Hay un límite de tamaño para los envíos de obtención, pero no hay límite de tamaño para los envíos de publicaciones.

  • Obtenga envíos sin un cuerpo de solicitud, todos los datos del formulario están en la línea de solicitud

    la publicación tiene un cuerpo de solicitud, todos los datos del formulario están en el cuerpo de la solicitud


proyecto web Java

estructura del proyecto

En la especificación JavaEE, el proyecto WEB tiene una determinada estructura de directorios, la estructura específica es la siguiente

   web项目(myweb)
	|| ------ 静态资源(如html、css、js、img等)、二级目录等
	||
	|| 
	|| ------ WEB-INF目录(放在该目录下的资源浏览器是不能直接访问到)
		|| ------ classess目录:放的都是java代码的 .class
		|| ------ lib目录:放入项目需要的jar
		|| ------ web.xml:配置文件(配置的是项目的内容) 是tomcat首先会去加载的配置文件
				    servlet如果是2.5的版本这个web.xml文件必须有
				    servlet如果是3.0的版本这个web.xml文件可以不要  用注解代替

Tres tecnologías: Servlet, Filter, Listener

El servidor de proyectos web Java tiene tres tecnologías principales: Servlet, Filter, Listener

  • servlet : es esencialmente una clase que implementa la especificación Servlet proporcionada por java.

    Puede manejar solicitudes y respuestas del navegador

  • filtro : Esencialmente una clase, esta clase necesita implementar la especificación de filtro proporcionada por java.

    Puede interceptar el acceso del navegador a los recursos del servidor. Puede liberarse si se cumplen las condiciones y no liberarse si no se cumplen las condiciones.

  • listener : es esencialmente una clase que implementa la especificación Java Listener y puede escuchar los cambios de estado de otros objetos (dominios)


servlet

descripción general

Servlet es un applet de Java que se ejecuta en el lado del servidor.Es un conjunto de especificaciones proporcionadas por Sun para procesar las solicitudes de los clientes y responder a los recursos dinámicos de los navegadores.

La esencia del servlet es el código Java, que genera contenido de forma dinámica para el cliente a través de la API de Java.

El papel de los servlets :

  • Acepte los datos de la solicitud (línea de solicitud, encabezado de solicitud, cuerpo de solicitud) traídos por el navegador en el lado del servidor
  • Datos de respuesta al navegador (línea de respuesta, encabezado de respuesta, cuerpo de respuesta)

La diferencia entre el servlet y el programa java ordinario:

  • Debe implementar la interfaz de servlet
  • Debe ejecutarse en un contenedor de servlet (servidor)
  • El programa servlet puede recibir parámetros de solicitud de usuario y datos de salida al navegador

Inicio rápido

**Forma de Servlet2.5: ** debe tener un archivo de configuración web.xml

Tres pasos para crear un servlet:

  1. Cree una clase que implemente la interfaz de servlet

  2. Anular el método de servicio

  3. Configurar la clase creada en el archivo web.xml (establecer la relación correspondiente entre la ruta de la solicitud y el programa java)

    Tan pronto como se inicie tomcat, cargará el archivo web.xml, solo una vez

    Siempre que este archivo de configuración web.xml se modifique en cualquier lugar, se debe volver a cargar Tomcat

    Tomcat completa automáticamente el método de creación y servicio del servlet y la ejecución del servicio.


La forma de servlet3.0 : sin archivo de configuración web.xml

paso:

  1. Cree proyectos por encima de JavaEE6 (incluidos 6)

  2. Cree una clase que implemente la interfaz de servlet y marque la anotación @WebServle en la clase de implementación

    Atributos de la anotación @WebServlet :

    • atributo de nombre : nombre del servlet, equivalente a <nombre del servlet> en web.xml
    • Atributo urlPatterns : ruta de solicitud

    Ejemplo: @WebServlet(nombre = "HolaServlet", urlPatterns = "/hola")


ciclo de vida del servlet

El proceso de un objeto desde la creación hasta la muerte es el ciclo de vida.

Tres métodos relacionados con el ciclo de vida de los servlets:

// Servlet对象只要一创建出来就会调用的方法  
void init(ServletConfig var1)

// 处理浏览器交互的方法  
void service(ServletRequest var1, ServletResponse var2)
    
// 销毁的方法
void destroy()

Ciclo de vida del servlet:

  • Cuando el navegador accede al servlet por primera vez, crea el objeto del servlet y ejecuta el método de inicialización init, que se crea solo una vez, y todas las solicitudes usan el mismo objeto de servlet (objeto singleton), y el subproceso no es seguro
  • El navegador ejecutará el método de servicio de servicio cada vez que visite, y lo ejecutará una vez cada visita
  • Cuando se cierra el servidor, el servlet se destruirá y se ejecutará el método de destrucción.

inserte la descripción de la imagen aquí


Arquitectura de servlets

  • Sistema de herencia de Servlet: HttpServlet (más funcional) extiende GenericServlet implementa la interfaz de Servlet

  • En el servlet, cuando el método de servicio es el que realmente ejecuta la lógica del programa, la inicialización y destrucción del servlet generalmente son llamadas y ejecutadas por el servidor, y los propios desarrolladores no necesitan preocuparse por ello.

    Desarrollo empresarial: para heredar HttpServlet, solo necesita reescribir los métodos doget y dopost, y las herramientas de desarrollo han proporcionado plantillas, que se pueden usar directamente


Configuración de servlet

configuración de patrón de URL (regla de ruta)

Después de crear el servlet, si desea que el servlet sea accesible, debe configurarlo en el archivo web.xml.

La etiqueta url-pattern se usa para determinar la ruta para acceder a un servlet

Ejemplo:

 <servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
 </servlet>
 <servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/sd1</url-pattern>
        <url-pattern>/sd2</url-pattern>
        <url-pattern>/sd3</url-pattern>
        <url-pattern>/sd</url-pattern>
</servlet-mapping>

<servlet-mapping>
      <servlet-name>ServletDemo2</servlet-name>
      <!-- 完全匹配 -->
      <url-pattern>/aaa</url-pattern> 
</servlet-mapping>

<servlet-mapping>
      <servlet-name>ServletDemo3</servlet-name>
      <!-- 扩展名匹配 -->
      <url-pattern>*.do</url-pattern>
</servlet-mapping>

Nota:

  • Un servlet también se puede mapear por diferentes rutas, pero generalmente en desarrollo, solo se necesita configurar una ruta válida

  • Cómo configurar la asignación de rutas:

    • Coincidencia exacta : debe comenzar con /

      Por ejemplo: /ms1, /aaa/ms1, /aaa/bb/cc/ms1

    • Coincidencia de directorio : debe comenzar con / y *terminar

      Por ejemplo: /*,/aaa/*

    • Coincidencia de extensión (sufijo) : *.xxtermina con (xx representa el sufijo). Nota: no puede comenzar con /

      Por ejemplo: *.action,*.do

  • Múltiples prioridades de coincidencia: coincidencia exacta > coincidencia de directorio > coincidencia de extensión

    Solo se ejecutará un servlet y el resultado de la ejecución se ejecutará de acuerdo con la prioridad


configuración de carga al inicio (prioridad)

La etiqueta de carga al inicio puede establecer la prioridad de carga del servlet y si el contenedor carga el servlet al inicio

  • Cuando el valor es 0 o mayor que 0, significa que el servlet se carga cuando se inicia el contenedor. Cuanto menor sea el valor positivo, mayor será la prioridad de cargar el servlet al inicio.

  • Si es un número negativo, el servlet no se cargará cuando se inicie el contenedor, solo se cargará cuando se seleccione el servlet.

    La creación predeterminada del servlet es cuando se accede por primera vez

Ejemplo:

<servlet>
        <servlet-name>ServletDemo1</servlet-name>
        <servlet-class>cn.itcast.web.ServletDemo1</servlet-class>
        <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>ServletDemo1</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

Nota:

  • El número 1 está ocupado por el servlet predeterminado de tomcat. Puede ver que también se usa un servlet en el web.xml de tomcat.

  • Cuando se inicie Tomcat, cargará dos archivos web.xml, uno es el web.xml personalizado por el proyecto y el otro es el web.xml de Tomcat.

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

    Tomcat crea el servlet y se usa principalmente para manejar solicitudes que otros servlets no pueden manejar.

    Por ejemplo, los recursos a los que no se puede acceder en el entorno actual usarán el servlet, y la capa inferior del servlet usará la página escrita de forma predeterminada (404 500...)


ruta del servlet

Hay dos tipos de rutas de acceso para los servlets:

  • camino absoluto

    • ruta absoluta con protocolo

      El modo de dirección de la barra de direcciones se usa generalmente para acceder a recursos externos, por ejemplo: http://localhost:8080/web02/ms5

    • Ruta absoluta sin protocolo

      Omita el protocolo y el nombre del puerto, y solo podrá acceder a los recursos de la máquina local para siempre, que generalmente se usa para acceder a los recursos internos, por ejemplo: /web02/ms5,

      Características: comienza con / y termina con el nombre del recurso

  • Ruta relativa: la comparación relativa es la dirección en la barra de direcciones

    Características: los directorios del mismo nivel y por debajo comienzan con ./ y terminan con el nombre del recurso (./ también se puede omitir)

    El directorio principal comienza con .../, devuelve el directorio principal


Objetos relacionados con el servlet

Objeto de solicitud HttpServletRequest

descripción general

El objeto HttpServletRequest representa la solicitud del navegador. Cuando el navegador accede al servidor a través del protocolo HTTP, toda la información de la solicitud HTTP se encapsula en este objeto. A través de la API de este objeto, el desarrollador puede obtener los datos pasados ​​por el cliente a través del navegador. .

La función del objeto HttpServletRequest: encapsular los datos de solicitud del navegador (línea de solicitud, encabezado de solicitud, cuerpo de solicitud)

inserte la descripción de la imagen aquí


API

HttpServletRequest extiende ServletRequest

Obtener datos de la línea de solicitud (método de solicitud, acceso al recurso, versión del protocolo)

// 获取请求方式
String getMethod()
// 获取请求行中的资源名部分
String getRequestURI()
// 获取客户端请求完整URL
StringBuffer getRequestURL()
// 获取请求协议和版本
String getProtocol()
// 获取端口
int getLocalPort()
// 获取请求者的ip地址
String getRemoteAddr()
// 获取当前的项目名路径
String getContextPath()

Obtener datos del encabezado de la solicitud (datos clave/valor del par clave/valor)

// 根据请求头的key获取value
String getHeader(String key)
	// 例如:Referer可以获取到来源地址(没有来源为null:直接访问) --防盗链
	// 例如:User-Agent可以获取用户的浏览器版本信息  --下载必备、处理下载乱码的

// 返回此请求包含的所有头名称 
Enumeration getHeaderNames()

Obtener datos del cuerpo de la solicitud (datos de formulario enviados por todos los navegadores)

// 获取单一name对应的value值
String getParameter(String name)  
// 获取多个name对应的多个value值
String[]  getParameterValues(String name)  
// 获取页面所有的value值
Map<String,String[]>  getParameterMap() 
	// 注意:key:对应的是表单中name属性名,value对应的的是表单的name属性的value值
// 设置编码。一般设置为 utf-8,否则请求中中文可能会乱码
void setCharacterEncoding(String var1)

Acceder y eliminar como datos de contenedor (la solicitud también se denomina objeto de dominio)

// 存储数据
void setAttribute(String name, Object o)
// 获取数据
Object getAttribute(String name)
// 移除数据
void removeAttribute(String name)

Nota: si desea utilizar la solicitud para transferir datos entre varios servlets, debe asegurarse de que se utilice el mismo objeto de solicitud entre varios servlets y que se pueda utilizar el reenvío de solicitudes.

request.getRequestDispatcher("/servlet的地址").forward(request, response);

Objeto HttpServletResponse

descripción general

Objeto HttpServletResponse: un objeto utilizado por el servidor para escribir contenido en el navegador

Si el servidor tiene datos y quiere enviarlos al navegador: solo se pueden enviar en tres direcciones según el protocolo http: línea de respuesta, encabezado de respuesta y cuerpo de respuesta


API

  • línea de respuesta de acción

    Formato: código de estado de protocolo/versión

    Ejemplo: HTTP/1.1 200

    significado del código de estado

    200  请求响应已成功
    302  重定向
    304  去找缓存数据
    403  服务器拒绝执行 (文件或文件夹加了权限)
    404  请求的资源没找到
    405  请求的方法不存在
    500  服务器错误 (代码写的有问题)
    
  • Encabezado de respuesta de operación

    Formato: clave:valor

    Métodos API:

    // 设置键值对形式的响应头
    setHeader(String key,String value)
    

    Encabezados de respuesta comunes:

    // content-type:通知浏览器响应的内容是什么类型的,并且用什么编码解析内容。解决响应回去的中文乱码问题
    response.setHeader("content-type","文件的类型;charset=utf-8");				
    // 简写
    response.setContentType("文件的类型;charset=utf-8");
    
    // location:重定向 
    response.setHeader("location", "/day31/sd4");
    response.setStatus(302);
    // 简写
    response.sendRedirect("url");
    
    // refresh:定时刷新 
    response.setHeader("refresh","秒数;url=跳转的路径");
    
    // content-disposition:通知浏览器写回去的东西要以附件形式打开 (只用于下载)。默认情况下都是页面直接展示写回去的数据
    response.setHeader("content-disposition","attachment;filename=" + aaa.jpg);
    
  • Cuerpo de respuesta de acción

    Qué mostrar en la página

    Métodos API:

    // 字符流
    PrintWriter getWriter()
    // 字节流 (二进制)	
    ServletOutputStream getOutputStream()
    

    Características:

    • Si el contenido que se puede escribir usa flujos de caracteres, todos los demás usan flujos de bytes (solo para descargar)
    • no puede aparecer al mismo tiempo
    • El servidor cerrará automáticamente estas 2 transmisiones.

Objeto ServletContext

descripción general

ServletContext: objeto de contexto de servlet (objeto administrador global), es un espacio global para almacenar información.

Un proyecto web tiene solo un administrador global (objeto SevletContext)

  • ciclo vital:
    • Cuando se carga la aplicación web, el ciclo de vida de ServletContext comienza (se crea)
    • Cuando la aplicación web se elimina del contenedor, el ciclo de vida de ServletContext finaliza (destruido)
  • Ámbito de actuación: toda la aplicación web
  • efecto:
    • Los datos se pueden compartir en toda la aplicación web (entre múltiples servlets)
    • Puede obtener la dirección del proyecto y el flujo de recursos del proyecto (ruta y flujo)

API

Obtenga el objeto ServletContext de forma nativa

En la clase personalizada que hereda HttpServlet o GenericServlet, obtenga directamente el objeto ServletContext a través del método de la clase principal getServletContext()

public ServletContext getServletContext()

El proyecto Spring obtiene el objeto ServletContext

  • Inyección automática mediante inyección de resorte (recomendado)

    @Autowired
    private ServletContext servletContext;
    
  • A través del objeto HttpServletRequest

    @GetMapping("/test")
    public String test(HttpServletRequest request) {
          
          
        ServletContext servletContext = request.getServletContext();
        return "success";
    }
    
  • Implemente la interfaz WebApplicationInitializer y anule el método onStartup()

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import org.springframework.web.WebApplicationInitializer;
    
    public class ApplicationInitializer implements WebApplicationInitializer {
          
          
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
          
          
            System.out.println(servletContext);
        }
    }
    
  • Cree un oyente que implemente ServletContextListener

    // 必不可少,声明为监听器,注册到web容器中
    @WebListener
    public class InitContextListener implements ServletContextListener {
          
          
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
          
          
            ServletContext servletContext = servletContextEvent.getServletContext();
            System.out.println(servletContext);
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
          
          
    
        }
    }
    
  • A través de la clase ContextLoader

    ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
    

    Nota: De esta manera, el objeto servletContext solo se puede obtener después de inicializar webApplicationContext, de lo contrario, el valor obtenido es nulo y provoca una excepción de puntero nulo.


Manipulación del objeto ServletContext

Operación de acceso a datos : los datos almacenados en ServletContext son compartidos globalmente por el proyecto y pueden usarse para transferir datos de información entre múltiples servlets

// 存。特点:可以存多对 但是存在key值覆盖
void setAttribute(String name, Object value)
// 取。特点: \没取到返回null  
Object getAttribute(String name)
// 删
void removeAttribute(String name)

Cómo leer los recursos del proyecto

// 获取WEB项目的磁盘路径。场景:上传
String getRealPath(String path)   
// 根据WEB项目的磁盘资源获取流。场景:下载
InputStream getResourceAsStream(String path)
// 获取web.xml中<context>标签的参数内容 
String getInitParameter(String name)

Tecnología de sesión: cookie, sesión

descripción general

El papel de la tecnología de sesión: se utiliza para almacenar N datos generados por la interacción entre el navegador y el servidor durante la sesión

Clasificación de las Tecnologías Conversacionales:

  • Cookie (tecnología de sesión del lado del cliente): se utiliza para almacenar más de N datos generados por la interacción entre el navegador y el servidor durante la sesión, y la cookie completa se guarda en el navegador.
  • sesión (tecnología de sesión del lado del servidor): se utiliza para almacenar N datos generados por la interacción entre el navegador y el servidor durante la sesión, y toda la sesión se mantiene en el servidor

Escenarios donde se utilizan cookies o sesiones para almacenar datos generados durante la interacción entre el navegador y el servidor:

  • Cuando los usuarios tienen datos privados que deben pasar entre varios servlets, pueden optar por utilizar la tecnología de sesión (cookie y sesión)

Cookies: tecnología de sesión del lado del cliente

descripción general

Rol: almacenar datos para la transmisión

Características:

  • Toda la cookie se almacena en el navegador.
  • Creado por el servidor y guardado por el navegador

Todo el proceso de uso de cookies (transferencia completa de datos privados entre múltiples servlets):

  1. El servidor crea una cookie para almacenar datos ==> pasa la cookie completa al navegador ==> el navegador guarda automáticamente la cookie (el valor de la clave se sobrescribirá)
  2. Visite nuevamente: el navegador transferirá automáticamente la cookie guardada al recurso del servidor ==> el servidor obtiene los datos de la cookie pasada ==> use los datos de la cookie

Escenarios de aplicación de cookies

  • Recordar nombre de cuenta
  • Inicio de sesión automático (recordar usuario y contraseña)
  • Registrar la última hora de acceso del usuario
  • Historial de elementos del navegador

Aviso:

  • No pueden aparecer símbolos especiales en las cookies, como: espacios, punto y coma (;), comas (,)

    Si los datos almacenados no son válidos, aparecerá un error:

    java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
    

    Las cookies pueden almacenar símbolos básicos, números y letras.

    Si debe guardar datos ilegales en la cookie, puede convertir los datos ilegales en símbolos, números y letras para almacenarlos y luego convertirlos en datos normales (decodificar) cuando quiera usarlos.

  • Los datos almacenados en la cookie tienen un límite de tamaño de 4kb


método común

galleta :

// 创建cookie对象
Cookie(String name, String value)
// 获取cookie的名称
String getName()
// 获取cookie的值
String getValue()
// 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
void setMaxAge(int expiry) 
// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri) 

HttpServletRespuesta :

// 将cookie发送给浏览器。注意:服务器可以给浏览器传递多个cookie,浏览器都会保存,但存在key值覆盖
void addCookie(Cookie cookie)

HttpServletSolicitud :

// 获取浏览器发送的cookie
Cookie[] getCookies()

Aviso:

  • La singularidad de la cookie está determinada principalmente por el nombre y la ruta.

    Por ejemplo: lo siguiente muestra dos cookies, aunque el nombre es el mismo, pero la ruta es diferente, por lo que pueden existir dos cookies al mismo tiempo.

    /día04/a/b/cookie1

    /día04/a/galleta1

    Si la ruta y el nombre son los mismos, la cookie agregada más tarde anulará la anterior.


Análisis del principio de la tecnología de cookies

inserte la descripción de la imagen aquí


Ciclo de vida de las cookies, ruta válida

El ciclo de vida de una cookie

  • Cookies de nivel de sesión: de forma predeterminada, las cookies se destruyen cuando se cierra el navegador.

  • Cookies de nivel persistente: puede configurar el tiempo de supervivencia de la cookie especificado en el navegador, y la cookie no se destruirá cuando se cierre el navegador

    // 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
    void setMaxAge(int expiry) 
      // >0 : 有效时间
      // =0 :过期(清除)
    

    Aviso:

    • Cuando el tiempo es 0, significa eliminar esta cookie inmediatamente (requisito previo: la ruta y el nombre deben ser consistentes)

      Para eliminar una cookie existente, el nombre y la ruta de la cookie sobrescrita deben ser los mismos que los de la cookie original.


Rutas válidas para las cookies

// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri) 
  • No escrito de forma predeterminada: significa que la ruta efectiva de la cookie actual es la ruta de recursos superior del servlet actual, siempre que el navegador acceda a la ruta de recursos, la cookie se llevará
  • / : En nombre del navegador para acceder a los recursos del proyecto en todo el servidor, la cookie se llevará
  • /web05 : cuando el navegador accede a los recursos de todo el proyecto /web05, la cookie se transportará y no se transportará al acceder a otros recursos del proyecto (de uso común)
  • /web05/cs5 : esta cookie solo se llevará cuando se acceda al recurso /web05/cs5

sesión: tecnología de sesión del lado del servidor

descripción general

La sesión es una tecnología de sesión guardada en el lado del servidor. Por lo general, la sesión utiliza tecnología de cookies para transferir atributos de identificación.

La función de sesión: guardar los datos generados en la sesión

Características:

  • Los datos guardados en la sesión están en el lado del servidor. creado por el servidor
  • la sesión es en realidad un objeto de dominio, método xxxAttribute() para almacenar datos

Ámbito de actuación:

  • Los datos de la sesión se comparten dentro de una sesión.

    Porque en una sesión, a cuantos servlets se accede, la sesión obtenida es la misma

    Pero si no está en una sesión, el objeto de sesión generado en múltiples servlets ya no es el mismo

    La razón subyacente es que el jessionid (id de sesión) que llevan las cookies en diferentes sesiones es diferente

ciclo vital:

  • Crear: java piensa que el objeto de sesión se crea cuando el navegador ejecuta el método request.getSession por primera vez

  • destruir:

    • Destrucción pasiva: de forma predeterminada, la sesión actual se destruirá si no se usa durante 30 minutos

    • Destrucción activa: session.invalidate()

    • La sesión se destruirá si el servidor se cierra de forma anormal

      La sesión no se destruirá cuando el servidor se cierre normalmente, sino que persistirá en el disco duro.Después de encender el servidor, volverá al servidor desde el disco duro de forma predeterminada.


La diferencia entre sesión y cookie.

Galleta sesión
Dónde se guardan los datos de la sesión navegador servidor
seguridad de datos inseguro Seguridad
¿Hay un límite para almacenar datos? tener. 4kb, y solo cadenas ninguno

Almacenar datos y obtener API de datos

  • HttpServletRequest

    // 获取session对象
    HttpSession getSession()
    
  • Sesión Http

    // 在session中保存数据 
    void setAttribute(String name, Object value)
    // 从session中获取数据。注意:返回值是Object,因此需要将返回值强制转换才能方便使用
    Object getAttribute(String name)
    // 从session中移除数据
    void removeAttribute(String name)
    

Anatomía de una sesión

En una sesión, el mismo objeto de sesión se utiliza para el análisis:

  • Todo sobre la sesión comienza con request.getSession()

  • Cuando el programa ejecuta el método request.getSession(), primero determinará si el navegador del usuario lleva jsessionid

    • El navegador del usuario no lleva jsessionid:

      Tomcat abrirá un espacio en el servidor (creará un nuevo objeto de sesión) para almacenar datos, luego creará una cookie, registrará la dirección de este espacio en la cookie (clave: jessionid) y luego volverá a escribir la cookie en el navegador del visitante ( nivel de sesión)

    • El navegador del usuario lleva el jsessionid:

      Tomcat ya no abrirá el espacio (crear sesión), pero encontrará la dirección de la sesión de acuerdo con el jessionid traído por el navegador y sacará los datos de la sesión.


filtro: filtro

descripción general

Casos de uso para filtros:

  • En proyectos reales, las solicitudes de acceso a ciertos recursos deben examinarse y filtrarse según las condiciones.
  • Solo cuando la solicitud cumple ciertas condiciones, se puede permitir que la solicitud acceda al recurso de destino. Si no se cumple la condición, no se permite el acceso al recurso de destino.
  • Por ejemplo: para una solicitud de acceso a una función de administrador, se debe realizar un juicio de autoridad de administrador sobre dicha solicitud. Si el usuario actual tiene privilegios de administrador, se puede acceder. De lo contrario no es posible.

Filtro: es una interfaz predefinida en Java que puede filtrar diferentes contenidos. La forma de filtrar requiere específicamente que el usuario defina una clase de implementación, luego implemente el método de filtrado en la interfaz y escriba las condiciones de filtrado en el método. filter es para filtrar los recursos a los que accede el cliente, si se cumplen las condiciones se liberará, y si no se cumplen las condiciones no se liberará.

Función principal: interceptar y filtrar las solicitudes del navegador


El uso de filtros

API de interfaz de filtro

// 过滤器的初始化方法
void init(FilterConfig filterConfig)
// 过滤器的核心过滤方法。写具体的过滤逻辑
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
// 过滤器的销毁方法
void destroy()

Pasos para el uso

  1. Cree una clase java, implemente la interfaz de filtro e implemente el método doFilter()

    //@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")
    public class MyFilter implements Filter{
          
          
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
          
          }
    
        //核心过滤方法
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          
          
            System.out.println("MyFilter进行服务器资源的过滤了...");
            //默认是拦截不放行的   手动放行(固定代码)
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {
          
          }
    }
    
  2. filtro de registro

    Método 1: agregue la anotación @WebFilter a la clase de filtro personalizado :

    @WebFilter(filterName = "MyFilter1", urlPatterns = "/sd1")
    
    • atributo filterName: nombre del filtro

    • Atributo urlPatterns: la ruta de la interfaz donde el filtro tiene efecto

      Las reglas de configuración de ruta son las mismas que las de los servlets (coincidencia exacta, coincidencia de directorio, coincidencia de extensión)

    Método 2: configurar los recursos que interceptará el filtro en web.xml

    	<!--配置filter要拦截的服务器资源-->
        <filter>
            <!--filter的名称-->
            <filter-name>MyFilter</filter-name>
            <!--全限定名  包名+类名-->
            <filter-class>cn.itcast.filter.MyFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <!--filter的名称-->
            <filter-name>MyFilter</filter-name>
            <!--要拦截的服务器资源路径-->
            <url-pattern>/sd1</url-pattern>
        </filter-mapping>
    

Orden de ejecución, flujo de ejecución y ciclo de vida del filtro

Cadena de filtros : cuando la misma solicitud debe filtrarse varias veces para diferentes servicios, se pueden configurar varios filtros. Solo cuando todos los filtros hayan liberado la solicitud, esta podrá acceder al recurso de destino. Siempre que haya varios filtros Si solo un filtro no libera la solicitud, entonces la solicitud no puede acceder al recurso de destino. Una colección de filtros se llama cadena de filtros. Además, los filtros en la cadena de filtros se ejecutan uno por uno. Después de ejecutar un filtro, se ejecutará el siguiente filtro y se accederá al recurso de destino solo si no hay filtros detrás. Mientras no se libere uno de los filtros, los filtros detrás de este filtro no se ejecutarán.

Orden de ejecución de varios filtros en una cadena de filtros:

  • Método de anotación: si varios filtros interceptan el mismo recurso, el orden de ejecución está de acuerdo con el orden de clasificación natural de los nombres de archivo de filtro
  • Método del archivo de configuración: si varios filtros interceptan el mismo recurso, el orden de ejecución es el orden de arriba a abajo del archivo de configuración

El flujo de ejecución del filtro.

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí


ciclo de vida del filtro

Desde el nacimiento del filtro hasta la muerte del filtro, existen 3 métodos:

  • init() : el método de inicialización del filtro

    Ejecute el método init una vez después de que el contenedor de servlet cree el objeto de filtro cuando se inicie el servidor

    El método init debe completarse con éxito antes de pedirle al filtro que realice cualquier trabajo de filtrado.

    void init(FilterConfig filterConfig)
    

    Descripción de parámetros:

    • filterConfig: el objeto de configuración del filtro actual

      efecto:

      • El nombre del filtro actual se puede obtener: getFilterName()
      • Puede obtener el objeto ServletContext: getServletContext()
  • dofilter() : el método de filtrado central del filtro

    Cuando la solicitud coincida con la ruta de intercepción del filtro, se ejecutará el método doFilter y se ejecutará una vez por cada visita.

    void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
    

    Descripción de parámetros:

    • cadena: Puede hacer la liberación del filtro actual: chain.dofilter(req, resp)

    Aviso:

    • Si necesita pasar la solicitud a través del filtro y continuar accediendo al recurso de destino, debe llamar al método doFilter del objeto FilterChain; de lo contrario, el filtro interceptará la solicitud.
    • El método doFilter del objeto FilterChain indica que la solicitud se libera
  • destroy() : El método de destrucción del filtro

    Se ejecuta cuando el filtro actual se destruye cuando se apaga el servidor


método de interceptación del filtro

De forma predeterminada, el filtro solo intercepta Solicitudes (solicitudes del navegador, incluida la redirección) y no intercepta Reenviar (solicitudes dentro del servidor, es decir, reenvío de solicitudes)

Si desea que el filtro intercepte solicitudes dentro del servidor:

  • método de anotación

    Configure el atributo dispatcherTypes, agregue DispatcherType.FORWARD al valor del atributo

    @WebFilter(dispatcherTypes = {
          
          DispatcherType.REQUEST, DispatcherType.FORWARD})
    

    Esta configuración de atributo de anotación no solo interceptará la solicitud del navegador, sino que también interceptará la solicitud interna del servidor.

  • configuración xml

    <filter-mapping> Agregue una etiqueta a la etiqueta <dispatcher>FORWARD</dispatcher> , pero esta configuración anula el método de interceptación predeterminado del filtro. Solo interceptará las solicitudes dentro del servidor y ya no interceptará las solicitudes predeterminadas del navegador.

    Deje que el filtro intercepte las solicitudes internas del servidor e intercepte las solicitudes del navegador:

    	<filter-mapping>
            <filter-name>MyFilter2</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>FORWARD</dispatcher>  <!-- 配置拦截服务器内部请求 -->
            <dispatcher>REQUEST</dispatcher>  <!-- 配置拦截浏览器的请求 -->
    	</filter-mapping>
    

Casos de uso

Resuelve los caracteres ilegibles de toda la estación.

Cualquier solicitud enviada por el navegador se procesará uniformemente con caracteres chinos ilegibles a través del filtro.

@WebFilter(filterName = "EnCodingFilter",urlPatterns = "/*")
public class EnCodingFilter implements Filter {
    
    
     @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        // 在执行servlet获取数据和响应数据之前执行该代码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        // 放行之前 处理中文乱码
        chain.doFilter(req, resp);
    }
    
    @Override
    public void destroy() {
    
    }

Intercepción de personajes ilegales

@WebFilter(filterName = "FeifaFilter",urlPatterns = "/sd3")
public class FeifaFilter implements Filter {
    
    
    private List<String> list;
    
    //服务器启动就执行 且只执行一次
    @Override
    public void init(FilterConfig config) throws ServletException {
    
    
        // 加载一个非法字符的文档(properties)
        	//底层:会自动去src下加载后缀名为properties的文件
        ResourceBundle bundle = ResourceBundle.getBundle("feifa");
        String value = bundle.getString("feifa"); 
        // 读取文档中的数据,放入到集合中
        String[] arr = value.split(",");
        list = Arrays.asList(arr);
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
       // 获取用户发表的言论
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;

        String info = request.getParameter("info");
        // 判断言论是否合法
        	// 遍历循环集合,将集合的非法字符和接受到的数据做包含
			// 包含上:就是非法  没包含上:就是合法
        for(String value:list){
    
    
             if(info.contains(value)){
    
    
                 // 不合法--不放行 直接给浏览器响应信息
                 // 包含上:就是非法
                 response.getWriter().print("你发表的言论有非法行为,请思考后再发表...");
                 return;
             }
        }

        //合法--直接放行
        chain.doFilter(request, resp);
    }
    
    @Override
    public void destroy() {
    
    }

Oyente: oyente

descripción general

Un web listener es una clase especial en Servlet que puede ayudar a los desarrolladores a monitorear eventos específicos en la web, como la creación y destrucción de ServletContext, HttpSession y ServletRequest. Puede agregar procesamiento antes y después de ciertas acciones para lograr el monitoreo.

El rol del Listener: monitorear los cambios de estado de los tres objetos de dominio de ServletContext, HttpSession y ServletRequest (creación y destrucción de los tres objetos de dominio)

Escenas a utilizar:

  • Información de inicialización al iniciar el sistema

    ServletContextListenner se usa para monitorear la creación y destrucción de objetos ServletContext

    Cuando se inicia el proyecto y se crea el objeto servletContext, se llamará al método contextInitialized de ServletContextListenner, por lo que la información requerida por el proyecto se puede inicializar en este método.

    Nota: el marco de resorte lo usará

  • Contar el número de personas en línea

    Cada vez que un usuario accede al proyecto, se crea una sesión. Entonces se crea la sesión actual, el usuario en línea actual +1, cada vez que se destruye la sesión, el usuario en línea actual -1

    HttpSessionListener se puede usar para monitorear la creación y destrucción de objetos de sesión, por lo que puede controlar la suma y resta de la cantidad de usuarios en línea en el método de monitoreo de creación y destrucción de objetos de sesión en HttpSessionListener

Java proporciona especificaciones de escucha, y diferentes especificaciones de escucha tienen diferente contenido de escucha

Oyentes comunes:

  • ServletContextListener (usado comúnmente): monitorea la creación y destrucción de objetos ServletContext

    Por ejemplo: el archivo de configuración del marco se ejecuta cuando se inicia el servidor

  • ServletRequestListener: monitorea la creación y destrucción de objetos ServletRequest

  • HttpSessionListener: monitorea la creación y destrucción de objetos HttpSession


El uso de los oyentes

API

  • Interfaz ServletContextListener

    // 监听 servletcontext 对象的创建
    void contextInitialized(ServletContextEvent sce)
    // 监听 servletcontext 对象的销毁
    void contextDestroyed(ServletContextEvent sce)
    
  • Interfaz ServletRequestListener

    // 监听 ServletRequest 对象的创建
    void requestInitialized(ServletRequestEvent servletRequestEvent)
    // 监听 ServletRequest 对象的创建
    void requestDestroyed(ServletRequestEvent servletRequestEvent)
    
  • Interfaz HttpSessionListener

    // 监听 HttpSession 对象的创建
    void sessionCreated(HttpSessionEvent httpSessionEvent)
    // 监听 HttpSession 对象的创建
    void sessionDestroyed(HttpSessionEvent httpSessionEvent)
    

Pasos para usar (tome el oyente ServletContextListenner como ejemplo)

  1. Cree una clase que implemente la interfaz ServletContextListenner e implemente los métodos contextInitialized() y contextDestroyed()

    // 监听servletContext对象的创建和销毁。需实现java提供的监听器规范(ServletContextListener)
    //@WebListener
    public class ServletContextLoaderListener implements ServletContextListener {
          
          
    
        // 当servletContext对象被创建了,监听器触发,该方法执行
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
          
          
            System.out.println("servletContext对象被创建了...");
    
            // 让服务器一加载,就读取框架的配置信息,进行加载
            ServletContext servletContext = servletContextEvent.getServletContext();
            String value = servletContext.getInitParameter("spring");
            System.out.println("就可以正式根据获取到的配置文件名,对该文件的内容进行加载了:"+value);
            System.out.println("正在加载该配置文件中....");
    
        }
    
        @Override //当servletContext对象被销毁了 监听器触发 该方法执行
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
          
          
            System.out.println("servletContext对象被销毁了...");
        }
    }
    
  2. registrar oyente

    • Método 1: agregue la anotación @WebListene en la clase de implementación

    • Método 2: Configurar en xml

      <listener> 
          <listener‐class>com.itheima.listenner.MyServletContextListenner1</listener‐class> </listener>
      

el caso

Número actual en línea del sitio web estadístico HttpSessionListener

Oyente de sesión, cuente el número de sesiones

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener()
public class MyHttpSession implements HttpSessionListener {
    
     
    //当前在线人数的属性名称 
    private static final String NUMBER = "NUMBER";
    
    /* 
     * session 创建时触发 
     */ 
    @Override 
    public void sessionCreated(HttpSessionEvent event) {
    
     
        //会话创建了,有新用户访问网站
        HttpSession session = event.getSession();
        //新创建的会话对象 
        ServletContext servletContext = session.getServletContext();
        //获取当前项目环境对象 
        System.out.println("session创建了" + session.getId()); 
        Integer n = (Integer) servletContext.getAttribute(NUMBER);
        //当前在线人数 
        if( n== null){
    
    
            //如果 n==null 说明是第一个用户 ,直接设置n=1 
            servletContext.setAttribute(NUMBER, 1); 
        }else{
    
    
            //如果n != null 直接累加 
            servletContext.setAttribute(NUMBER, ++n); 
        }
        //如果 n==null 说明是第一个用户 ,直接设置n=1 
        //如果 n != null 直接累加 
    }
    
    /* 
    * session销毁时触发 
    */ 
    @Override 
    public void sessionDestroyed(HttpSessionEvent event) {
    
     
        //会话销毁了,有用户的会话对象销毁了 
        HttpSession session = event.getSession();
        //新创建的会话对象 
        ServletContext servletContext = session.getServletContext();
        //获取当前项目环境对象 
        System.out.println("session销毁了" + session.getId()); 
        Integer n = (Integer) servletContext.getAttribute(NUMBER);
        //当前在线人数 //直接减1 
        servletContext.setAttribute(NUMBER, ‐‐n);
    }
}

expandir

Procesamiento ilegible chino interactivo del navegador y el servidor

  • Los datos chinos de la página del navegador se solicitan al servidor. Si la publicación se usa para enviar, el servidor aceptará caracteres ilegibles.

    Solución: procesamiento de datos chinos solicitados caracteres ilegibles

    request.setCharacterEncoding("utf-8"); 
    
  • Cuando el servidor envía datos chinos al navegador, el navegador tendrá un comportamiento ilegible.

    Solución: manejar los datos chinos confusos de la respuesta

    response.setContentType("text/html;charset=utf-8"); 
    
  • Cuando el servidor envía un cuadro de archivo adjunto al navegador, hay caracteres chinos en el cuadro de archivo adjunto y se producirá un comportamiento confuso (el cuadro de archivo adjunto solo aparecerá después de la descarga)

    resolver:

    • Obtener la versión del navegador del usuario

      Navegador de la versión Firefox: configure la codificación base64 para el archivo adjunto devuelto en chino

      Otras versiones de navegadores: configure la codificación utf-8 para el archivo adjunto devuelto en chino

    String value = request.getHeader("user-agent");
    String encode;
    if(value.contains("Firefox")){
          
          
        //火狐浏览器中文(base64)
        Base64.Encoder encoder = Base64.getEncoder();
        encode = "=?utf-8?B?" + encoder.encodeToString(fileName.getBytes("utf-8")) + "?=";
    } else {
          
          
        //其它浏览器中文(utf-8)
        encode = URLEncoder.encode(fileName, "utf-8");
    }
    //小说.txt  --%E5%B0%8F%E8%AF%B4.txt
    response.setHeader("content-disposition", "attachment;filename=" + encode); 
    

La diferencia entre el reenvío de solicitudes y la redirección

  • Redirigir varias solicitudes, solicitud para reenviar una solicitud

  • La redirección significa que el navegador envía acceso al servidor, y el reenvío de solicitudes significa que los recursos internos del servidor acceden entre sí.

  • La redirección es la API del objeto de respuesta y el reenvío de solicitudes es la API del objeto de solicitud

  • La redirección puede acceder a su propio proyecto o a otros proyectos, y el reenvío de solicitudes solo puede acceder al propio proyecto actual a

    // 重定向。可以访问外部项目
    response.sendRedirect(request.getContextPath() + "/sd11"); 
    // 请求转发。只能访问当前项目
    request.getRequestDispatcher("/sd7").forward(request,response);
    

Resumen de objetos de dominio

Los objetos de dominio pueden transferir datos entre múltiples servlets/jsp

Hay 3 objetos de dominio en el backend de Java:

  • ServletContext (datos públicos)

    Crear: Cree tan pronto como se inicie el servidor, y solo uno

    Destruir: Destruir cuando el servidor está cerrado

    Alcance de los datos almacenados: compartido por todos los servlets en todo el proyecto web

    Debido a que solo hay un ServletContext en todo el proyecto web, todos los servlets obtienen el mismo objeto ServletContext

  • pedido

    Crear: solicitud para crear uno a la vez

    Destruir: la respuesta se destruye

    Alcance de los datos almacenados: solo puede compartir datos en múltiples reenvíos de una solicitud

    Solo varios servlets involucrados en el reenvío múltiple de una solicitud usan un objeto de solicitud

  • sesión (datos privados)

    Crear: java piensa que el objeto de sesión se crea cuando el navegador ejecuta el método request.getSession por primera vez

    destruir:

    • Destrucción pasiva: de forma predeterminada, la sesión actual se destruirá si no se usa durante 30 minutos

    • Destrucción activa: session.invalidate()

    • La sesión se destruirá si el servidor se cierra de forma anormal

      La sesión no se destruirá cuando el servidor se cierre normalmente, sino que persistirá en el disco duro.Después de encender el servidor, volverá al servidor desde el disco duro de forma predeterminada.

    Alcance de los datos almacenados: Múltiples servlets involucrados en una sesión pueden compartir datos

    Porque en una sesión, la sesión obtenida en múltiples sevlets es la misma


API para manipulación de objetos de dominio

// 存放数据
void setAttribute(String name, Object value)
// 获得数据
Object getAttribute(String name)
// 删除数据
void removeAttribute(String name)

Supongo que te gusta

Origin blog.csdn.net/footless_bird/article/details/128530157
Recomendado
Clasificación