English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Cómo implementar solicitudes y respuestas en javaweb

 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,这取决与

的method属性值;

GET请求和POST请求的区别:

(1)GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;

请求参数长度限制长度在1K之内;

GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

(2)POST请求:

请求参数不会显示浏览器的地址栏,相对安全;

请求参数长度没有限制;

4、请求转发和请求包含(*****重点*****)

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径

请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
    > 一个请求跨多个Servlet,需要使用转发和包含。
 > 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)            即当前Servlet设置的相应头有效,相应体无效。
    > 请求包含:由两个Servlet共同未完成响应体!(都留)                                                                     都有效。     
    > ¡Sea cual sea la retransmisión de solicitudes o la inclusión de solicitudes, todas están dentro de un rango de solicitudes! Se utiliza el mismo request y response!  

Comparación entre reenvío de solicitudes y contenido de solicitud:

(1) Si se realiza un reenvío de solicitudes desde AServlet a BServlet, no se permite que AServlet genere un cuerpo de respuesta, es decir, no se puede usar response.getWriter() y response.getOutputStream() para enviar datos al cliente, este trabajo debe ser realizado por BServlet; si se utiliza el contenido de solicitud, no hay esta limitación;

(2) Aunque el reenvío de solicitudes no puede generar un cuerpo de respuesta, aún se puede configurar la cabecera de respuesta, por ejemplo: response.setContentType(”text/html;charset=utf-8";

(3) Las solicitudes contienen se aplican principalmente en las páginas JSP, para completar la combinación de múltiples páginas;

(4) El reenvío de solicitudes se aplica principalmente en Servlet, y los objetivos de reenvío son principalmente páginas JSP;

Como se muestra en la figura:


Comparación de reenvío de solicitudes

(1) El reenvío de solicitudes es una solicitud, mientras que la redirección es dos solicitudes;

(2) Después del reenvío de solicitudes, la barra de direcciones del navegador no cambiará, mientras que la redirección sí lo hará, porque la redirección es dos solicitudes;

(3) El objetivo del reenvío de solicitudes puede ser un recurso de esta aplicación, mientras que el objetivo de la redirección puede ser otra aplicación;

(4) El método de solicitud de reenvío para AServlet y BServlet es el mismo, es decir, o bien ambos son GET, o bien ambos son POST, porque el reenvío de solicitudes es una solicitud;

(5La segunda solicitud de redirección siempre es GET;

 Eso es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos lo apoyen mucho en el tutorial de grito.

Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y sube por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará