2012-02-24 25 views
34

Reenviar(): esto se puede hacer de dos maneras por solicitud & ServeletContext. Reenviar una solicitud de un servlet a otro recurso (servlet, JSP archivo o archivo HTML) en el servidor. El reenvío se realiza en el lado del servidor , sin que el cliente lo sepa.¿Diferencia entre mecanismo de inclusión y reenvío para el concepto de envío de solicitud?

Cuando se invoca una petición hacia adelante, la solicitud se envía a otra recurso en el servidor, sin que el cliente será informado de que un recurso diferente va a procesar la solicitud. Este proceso se produce completamente con en el contenedor web.

Simplemente

incluyen: incluirá otro archivo en nuestro archivo actual

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

+7

¿Probaste algo llamado búsqueda de Google? – Santosh

+13

Hice una búsqueda en Google, y así es como llegué aquí. Casi cualquier pregunta puede responderse con "RTFM" o "STFW", pero stackoverflow se ha convertido en un recurso fantástico para mí, ya que ofrece explicaciones sucintas y múltiples perspectivas en trozos de tamaño digerible. Me alegra que la gente haga preguntas que ya tienen respuestas disponibles. – WoodenKitty

+0

Pocas cosas son más irritantes que hacer una búsqueda en Google para encontrar una respuesta y encontrar "¿Probó algo llamado búsqueda de Google?" – Arijit

Respuesta

27

La principal diferencia es que cuando se utiliza hacia adelante la el control se transfiere al próximo servlet/jsp al que está llamando, mientras que incluye retiene el control con el servlet actual, solo incluye el procesamiento realizado por el servlet que llama/jsp (como hacer cualquier out.println o otro procesamiento).

51

La diferencia entre las dos etiquetas es que la forma en que trabajan. Bueno, voy a decir un ejemplo para que pueda 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 completo va a la página B. Cuando finaliza, el control vuelve a página A a partir del siguiente punto de codificación después de la etiqueta de inclusión y continuando al resto de la página A.

Bueno, para hacer las cosas mucho más claras, vamos a decir que tenemos las mismas páginas, páginaA y páginaB, pero esta vez vamos a utilizar la etiqueta hacia adelante en páginaA, no la incluyen etiqueta. De nuevo, el control comenzará en la página A hasta que llamemos a la etiqueta de reenvío en 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 forward , el control no vuelve a la página A otra vez.

+2

+1, todas las respuestas dicen lo mismo, pero ¿cuál me ha gustado leer? Este por supuesto ;-) –

+0

genial! ¡Finalmente lo conseguí! – koryakinp

+0

buena explicación, gracias. – enzo

24

include(request, response);

Si el recurso es estático, la incluyen método permite programática del lado del servidor incluye. 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 confirmar una respuesta.
  • No puede establecer encabezados ni llamar a ningún método, como setCookie, que afecte a 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 desde un componente web.

forward(request, response);

En algunas aplicaciones, es posible que desee tener un componente web de hacer el proceso preliminar de una solicitud y tener otro componente de generar 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 avance se debe utilizar para dar otro recurso responsabilidad para 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 un IllegalStateException.

Enlaces relacionados

6

La diferencia clave entre los dos es que el método forward() cerrará el flujo de salida después de que se ha sido invocado, wh El método de inclusión deja la secuencia de salida ABIERTA.

responder con un ejemplo: deja para tener una página servlet xxx.java llamado y una página JSP llamado yy.jsp

En el yy.jsp

WELCOME to yy.jsp 

En el xxx. java // utilizando adelante()

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 el xxx.java // usando incluir()

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 ITS no sobre el control, porque si ponemos un

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

después de cualquiera de los .forward() o .include() invocación, la salida de la consola se generará en cada caso. Su acerca de la respuesta al cliente

Por lo tanto, la parte básica es si estamos procesando en un componente del lado del servidor y luego hacia adelante a una JSP o servlet con el fin de generar el marcado para un cliente, una vez que la JSP o El servlet ha finalizado el procesamiento, ya no podemos llamar a ningún otro componente para generar el marcado que puede ser enviado 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, por lo 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.

+0

http://www.theserverside.com/tip/Include-vs-Forward-of-the-Servlet-RequestDispatcher? – Preuk

+0

¡Al menos dale crédito al enlace original! –

Cuestiones relacionadas