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
-
Cree un nuevo directorio Catalina en el directorio tomcat/conf (no es necesario crearlo si ya existe)
-
Cree un directorio de host local en el directorio de Catalina (no es necesario crearlo si ya existe)
-
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:
- Descargue un software de servidor Tomcat, dirección del sitio web oficial http://tomcat.apache.org
- Descomprima el Tomcat descargado. Nota: copie el archivo descomprimido a una ruta sin chino ni espacios
- 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)
- Prueba: ingrese la dirección en la página para acceder a http://localhost:8080
- 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:
idea para crear un proyecto web:
proyecto de lanzamiento de ideas:
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.
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:
-
Cree una clase que implemente la interfaz de servlet
-
Anular el método de servicio
-
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:
-
Cree proyectos por encima de JavaEE6 (incluidos 6)
-
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.
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
*
terminarPor ejemplo:
/*
,/aaa/*
-
Coincidencia de extensión (sufijo) :
*.xx
termina 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)
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):
- 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á)
- 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
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
-
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() { } }
-
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.
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)
-
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对象被销毁了..."); } }
-
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)