studio sobre reales proyectos para introducción incluye herramientas fuente desarrollo código con avanzado aplicaciones java servlets java-ee forward

java - sobre - manual android studio avanzado



¿Diferencia entre el mecanismo de inclusión y el de envío para el concepto de envío de solicitud? (4)

Adelante (): esto se puede hacer de dos maneras por Request y ServeletContext. Reenviar una solicitud de un servlet a otro recurso (servlet, archivo JSP o archivo HTML) en el servidor. El reenvío se realiza en el lado del servidor, sin que el cliente lo sepa.

Cuando se invoca una solicitud de reenvío, la solicitud se envía a otro recurso en el servidor, sin que se informe al cliente que un recurso diferente va a procesar la solicitud. Este proceso ocurre completamente con en el contenedor web.

Simplemente

incluir: incluirá otro archivo en nuestro archivo actual

Reenviar: reenviará la solicitud actual a la página de reenvío


incluir (solicitud, respuesta);

Si el recurso es estático, el método de inclusión habilita las aplicaciones programáticas del servidor. Si el recurso es un componente web, el efecto del método es enviar la solicitud al componente web incluido, ejecutar el componente web y luego incluir el resultado de la ejecución en la respuesta del servlet contenedor.

Un componente web incluido tiene acceso al objeto de solicitud, pero está limitado en lo que puede hacer con el objeto de respuesta.

  • Puede escribir en el cuerpo de la respuesta y enviar una respuesta.
  • No puede establecer encabezados ni llamar a ningún método, como setCookie, que afecte los encabezados de la respuesta.

A menudo es útil incluir otro recurso web, como contenido de banner o información de copyright, en la respuesta devuelta por un componente web.

reenviar (solicitud, respuesta);

En algunas aplicaciones, es posible que desee que un componente web realice el procesamiento preliminar de una solicitud y que otro componente genere la respuesta. Por ejemplo, es posible que desee procesar parcialmente una solicitud y luego transferirla a otro componente, según la naturaleza de la solicitud.

Para transferir el control a otro componente web, invoque el método de reenvío de un RequestDispatcher. Cuando se reenvía una solicitud, la URL de solicitud se establece en la ruta de la página reenviada. El URI original y sus partes constituyentes se guardan como atributos de solicitud.

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]

El método de reenvío se debe usar para otorgarle a otro recurso la responsabilidad de responder al usuario. Si ya ha accedido a un objeto ServletOutputStream o PrintWriter dentro del servlet, no puede usar este método; al hacerlo arroja una IllegalStateException .

Enlaces relacionados


La diferencia clave entre los dos es que el método forward () CERRARÁ el flujo de salida después de haber sido invocado, mientras que el método de inclusión deja el flujo de salida ABIERTO.

respondiendo con un ejemplo: tengamos una página de servlet llamada xxx.java y una página jsp llamada yy.jsp

En el yy.jsp

WELCOME to yy.jsp

En xxx.java // usando forward ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

salida

WELCOME to yy.jsp

En xxx.java // usando include ()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

salida

WELCOME to yy.jsp back to servlet

PERO LO MÁS IMPORTANTE NO ES EL CONTROL, PORQUE SI PONEMOS

System.out.println("console output");

después de la .forward() de .forward() o .include() , la salida de la consola se generará en cada caso. Es sobre la respuesta al cliente

Entonces, la parte básica es si estamos procesando en un componente del lado del servidor y luego reenviamos a un JSP o Servlet para generar el marcado para un cliente, una vez que JSP o Servlet ha terminado de procesar, ya no podemos invocar ningún otro componente para generar marcado que se puede enviar al cliente. Una vez que hayamos realizado un forward, la generación de marcado para la solicitud actual y el ciclo de respuesta habrá finalizado.

De forma alternativa, con un include, el flujo de salida permanece abierto, de modo que podemos invocar tantos archivos diferentes para generar el marcado del lado del cliente que necesitamos. De modo que podemos incluir dos o tres archivos JSP e incluso un Servlet en la cadena de componentes que generan el marcado basado en el cliente. Cuando usamos un include, el flujo de salida no se cierra después de la invocación.


La diferencia entre las dos etiquetas es la forma en que funcionan. Bueno, voy a decir un ejemplo para que puedas imaginarlo mejor.

Supongamos que tiene dos páginas, página A y página B. En la página A, escribió la etiqueta de inclusión. En este caso, el control estaba en la página A hasta que llamó a la etiqueta de inclusión. En este punto, el control total pasa a la página B. Cuando finaliza, el control vuelve a la página A a partir del siguiente punto de codificación después de la etiqueta de inclusión y continúa con el resto de la página A.

Bueno, para aclarar las cosas, digamos que tenemos las mismas páginas, página A y página B, pero esta vez usaremos la etiqueta de reenvío en la página A, no la etiqueta de inclusión. De nuevo, el control comenzará en la página A hasta que llamemos a la etiqueta de reenvío en la página A, en este punto, el control se transfiere a la página B, al igual que la etiqueta de inclusión. Pero la diferencia es lo que sucede cuando se completa la página B. En el caso de la etiqueta de reenvío, el control no vuelve a la página A nuevamente.


La diferencia principal es que cuando utiliza el control forward se transfiere al siguiente servlet / jsp que está llamando, mientras que include conserva el control con el servlet actual, solo incluye el procesamiento realizado por el servlet que llama / jsp (como hacer cualquier .println u otro procesamiento).