English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Veamos primero un diagrama de flujo:
El flujo de procesamiento de solicitudes del servidor:
(1Cada vez que el servidor recibe una solicitud, abrirá un nuevo hilo para esta solicitud.
(2El servidor encapsulará los datos de solicitud del cliente en el objeto request, ¡el request es el portador de los datos de solicitud!
(3El servidor también creará un objeto response, este objeto está conectado con el cliente, y se puede usar para enviar respuestas al cliente.
Desde el diagrama de flujo se puede ver que, en las solicitudes y respuestas de JavaWeb, los dos parámetros más importantes son request y response, estos parámetros están en el método service() del Servlet.
1、response概念:
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。
response对象的功能分为以下四种:
(1)设置响应头信息
(2)发送状态码
(3)设置响应正文
(4)重定向
2、response响应正文
response是响应对象,向客户端输出响应正文(响应体)可以使用response的响应流,repsonse一共提供了两个响应流对象:
(1)PrintWriter out = response.getWriter():获取字符流;
(2)ServletOutputStream out = response.getOutputStream():获取字节流;
当然,如果响应正文内容为字符,那么使用response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用response.getOutputStream()。
注意,在一个请求中,不能同时使用这两个流!也就是说,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用这两个流。不然会抛出illegalStateException异常。
3、设置响应头信息
可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!
(1)response.setHeader(“content-type”, "text/html;charset=utf-8”):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8);
(2)response.setHeader("Refresh","5; URL=http://www.baidu.com):5秒后自动跳转到百度主页。
4、设置状态码及其他方法
(1") response.setContentType("text/html;charset=utf-8") es equivalente a llamar a response.setHeader(“content-type”, "text/html;charset=utf-8);
(2) response.setCharacterEncoding("utf-8) configura la codificación del flujo de respuesta de caracteres como utf-8;
(3) response.setStatus(200): configura el código de estado;
(4) response.sendError(404"No se encuentra el recurso que busca") cuando se envía un código de estado de error, Tomcat saltará a una página de error fija pero puede mostrar el mensaje de error.
5y redirección (*****重点*****)
5.1 ¿Qué es la redirección (dos solicitudes)?
cuando accede a http://cuando accede a www.sun.com, verá que la URL en la barra de direcciones del navegador se convertirá en http://www.oracle.com/us/sun/index.htm, esto es una redirección. La redirección es cuando el servidor notifica al navegador que acceda a otra dirección, es decir, realice otra solicitud.
5.2 ¿Cómo se realiza la redirección?
Respuesta: El código de estado de redirección es302primero utilizamos el objeto response para enviar al navegador,302El estado de código, luego configura un Location, es decir, proporciona una URL disponible, que el navegador visitará para acceder a la nueva URL, realizando una redirección.
Ejemplo:
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) lanza ServletException, IOException { response.setStatus(302); response.setHeader("Location", "http://www.baidu.com"); } }
La función del código anterior es: después de acceder a AServlet, notificará al navegador que se redirija a la página principal de Baidu. El navegador del cliente analizará el código de respuesta302sabe que el servidor lo redirige, por lo que inmediatamente obtiene la cabecera de respuesta Location y realiza una segunda solicitud.
Existe también un método de redirección rápido,por ejemplo, el método response.sendRedirect(). En el ejemplo anterior, las dos sentencias pueden usar response.sendRedirect("http://www.baidu.com) en su lugar.
request—encapsula todos los datos de solicitud del cliente
1、resumen de request
request es un parámetro de método Servlet.service(), de tipo javax.servlet.http.HttpServletRequest. Cada vez que el cliente envíe una solicitud, el servidor creará un objeto request y encapsulará los datos de la solicitud en request, y luego pasará el objeto request al método service() en el momento de la llamada al método service(), lo que significa que se puede obtener los datos de la solicitud a través del objeto request en el método service();
Como se muestra en la figura:
La función de request se puede dividir en los siguientes tipos:
(1)Encapsula los datos de encabezado de solicitud;
(2)Encapsula los datos del cuerpo de solicitud, si es una solicitud GET, no hay cuerpo de solicitud;
(3)request es un objeto de dominio, se puede tratar como Map para agregar y obtener datos;
(4)request proporciona la función de reenvío de solicitud y la función de inclusión de solicitud.
2、métodos de dominio request
request es un objeto de dominio! En JavaWeb hay cuatro objetos de dominio en total, donde ServletContext es un objeto de dominio, que se crea solo una vez en toda la aplicación. request es uno de ellos, request puede compartir datos en una solicitud.
Una solicitud crea un objeto request, si se experimentan varios Servlet en una solicitud, varios Servlet pueden compartir datos a través de request. Aún no sabemos cuántos Servlet se experimentarán en una solicitud.
A continuación se presentan los métodos de dominio de request:
(1)void setAttribute(String name, Object value):Se utiliza para almacenar un objeto, también se puede llamar almacenar un atributo de dominio, por ejemplo: servletContext.setAttribute(“xxx”, “XXX”);, se almacenó un atributo de dominio en request, el nombre del atributo de dominio es xxx, y el valor del atributo de dominio es XXX. Tenga en cuenta que si se llama a este método varias veces y se utiliza el mismo name, se sobrescribirá el valor anterior, esta característica es similar a Map;
(2)Object getAttribute(String name):Se utiliza para obtener los datos de request, antes de obtener los datos, es necesario almacenarlos primero, por ejemplo: String value = (String)request.getAttribute(“xxx”);, obtener el atributo de dominio llamado xxx;
(3)void removeAttribute(String name):Se utiliza para eliminar el atributo de dominio de request, si el atributo de dominio especificado por el parámetro name no existe, esta función no hace nada;
(4)Enumeration getAttributeNames():获取所有域属性的名称;
3、request传递参数
最为常见的客户端传递参数方式有两种:
(1)浏览器地址栏直接输入:一定是GET请求;
(2)超链接:一定是GET请求;
(3)表单:可以是GET,也可以是POST,这取决与