SendRedirect e Forward

DOMANDA:

Che differenza c'è tra response.sendRedirect() e dispatcher.forward()?



RISPOSTA:

Benché l'effetto apparente sia quasi lo stesso, c'è una profonda differenza tra i due modi di reindirizzamento. Vediamolo nella pratica.


Creiamo una piccola pagina HTML per l'invio dei dati ("index.jsp"):
<html>
<head>
<title>Blog Domande e Risposte JAVA</title>
</head>
<body>

<form method="POST" action="servlet/sendRedirect">
SendRedirect
<input type="hidden" name="param" value="Lancill Blog" />
<input type="submit" value="Invia" />
</form>

<form method="POST" action="servlet/forward">
Forward
<input type="hidden" name="param" value="Lancill Blog" />
<input type="submit" value="Invia" />
</form>

</body>
</html>

E una semplice JSP di reindirizzamento ("paginaDiDestinazione.jsp"):
<html>
<head>
<title>Blog Domande e Risposte JAVA</title>
</head>
<body>
Parametro ricevuto: <%= request.getParameter("param") %>
</body>
</html>

Il file web.xml:
<web-app>
<display-name>Lancill Blog</display-name>

<servlet>
<servlet-name>Forward</servlet-name>
<servlet-class>servlet.ForwardServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SendRedirect</servlet-name>
<servlet-class>servlet.SendRedirectServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Forward</servlet-name>
<url-pattern>/servlet/forward</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SendRedirect</servlet-name>
<url-pattern>/servlet/sendRedirect</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>

La servlet per testare il sendRedirect:
package servlet;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class SendRedirectServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
                          throws ServletException, IOException {

      response.sendRedirect("../paginaDiDestinazione.jsp");
  }
}

con l'esempio sopra stiamo dicendo al client di effettuare una nuova request verso la risorsa indicata nel parametro.
Ecco i passaggi: client -> request -> server -> response.sendRedirect() -> client -> request -> server -> response

La servlet per testare il forward:
package servlet;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class ForwardServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
                           throws ServletException, IOException {

     request.getRequestDispatcher("../paginaDiDestinazione.jsp")
                                  .forward(request, response);

  }
}

in questo caso invece stiamo effettuando un "inoltro" della Request inviata dal client verso la nuova risorsa in maniera totalmente trasparente al client stesso.
In passaggi in questo caso: client -> request -> server -> dispatcher.forward() -> server -> response

Da notare che, mentre nella sendRedirect() tutti gli attributi ed i parametri associati alla prima Request vengono riazzerati perché ne viene ricreata una nuova, nel forward() si conservano tutti quelli inviati dal client la prima volta.


Testando il tutto appare chiaro che, nel Forward sto inoltrando la Request (e quindi anche il parametro che infatti viene correttamente visualizzato), nella SendRedirect il parametro è null perché il client ha creato una Request completamente nuova.



Commenti

  1. Il Forward potrebbe essere preferito al sendRedirect nell'ottica di ottimizzare le performance di un'applicazione web. Infatti nel primo caso non pago una nuova richiesta client-server.

    Bisogna però stare attenti nelle applicazioni web che utilizzando tecnologie particolari come ad esempio ICEfaces (www.icesoft.org). Questi framework sono basati sul concetto di dispose che viene intercettato quando il client cambia url di navigazione. Se usassi un Forward, l'url non cambierebbe e inficerei il corretto funzionamento del framework.

    RispondiElimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java