Diferencias entre forward y redirect

Un redirect implica enviar un codigo http 300 con la url de redirección al cliente, y será este ultimo quien realizará una nueva petición a esa url. En cambio un forward es un mecanismo interno del servidor de aplicaciones que sirve para seguir gestionando la misma petición con otro elemento (otro jsp, otro servlet, etc) pero, en cualquier caso, no hay comunicación con el cliente.

Si haces un forward, el objecto que gestione la solicitud a partir de ese momento tendrá acceso a la misma instancia de HttpServletRequest que antes del forward (ya que es la misma peticion). Un ejemplo claro de forward que aparece en struts y en cualquier mvc es entre el controlador (tu Action) y la vista (tu jsp).

<send:Redirect to="/supagina.html" />

<send:forward to="/supagina.html" />


Es mas común y eficiente usar un forward, el redirect tiene sentido si necesitas que el nuevo recurso del redirect que va a atender la petición sepa cual es la url del cliente.

En scriptlet un redirect, se invoca directamente sobre el objeto impliticto response, sería algo así:

response.sendRedirect("/suPagina.html");


El scriptlet para hacer un forward, se invoca sobre un objeto RequestDispatcher que primero habrá que instanciar:

RequestDispacher rd = request.getRequestDispacher("/resource.jsp");

rd.forward(request,response);


Otro metodo util del request dispatcher es el include, permite incluir el texto de un fichero dentro de la página:

RequestDispacher rd = request.getRequestDispacher("/resource.jsp");

rd. include (request,response);



La forma de hacerlo con un tag sería la siguiente:

<jsp:include page="sub_botonera.jsp" flush="true">



Tambien se le puede pasar parametros, que se pueden recoger de la "request.getParameter":

<jsp:include page="scripts/login.jsp">

<jsp:param name="username" value="jsmith" />

</jsp:include>


Un include tambien puede hacerse de esta foram pero tiene menos juego:

<%@ page include="/pagina.jsp" %>

Comentarios