Comunicación entre Aplicaciones JSF y Servlets / JSP's
Podemos comunicarmos en ambos sentidos entre aplicaciones intercambiando además datos con un determinado alcance (request, session.... ).
Invocación Servlet/JSP desde JSFA través de
FacesContext deberemos notificar al sistema que no realice la fase de render JSF y posteriormente propagar la petición HTTP mediante
ExternalContext.forward() que es equivalente a recuperar el tradicional
RequestDispatcher y realizar la redirección.
Ejemplo:
FacesContext ctx = FacesContext.getCurrentInstance(); ctx.responseComplete(); ctx.getExternalContext().dispatch("/miPath");
Sin embargo, nótese que el path al que nos redirigimos no debería llevar (si es una página JSP o HTML) rutas relativas puesto que se ejecutará desde varios niveles de path debido a que venimos de una JSF. Si no se requiere pasar información como atributos de un determinado alcance sería más conveniente redirigirse mediante un
redirect proporcionado directamente en la clase
ExternalContext.
Ejemplo:
FacesContext ctx = FacesContext.getCurrentInstance(); ExternalContext ec = ctx.getExternalContext(); String appContext = ec.getRequestContextPath(); ctx.getExternalContext().redirect(appContext + "/miPath");
Nótese que por contra, el método
redirect fuerza a que el cliente haga otra petición, con lo cual no podremos pasar información como atributos.
Esta última forma será preferida frente a la primera cuando no haya que pasar información (o ésta se pase en la request).
Invocación JSF desde ServletEste caso es más sencillo ya que se trata de acceder desde la capa más general a una capa implementada bajo ésta. Simplemente tendremos que redirigir a la página JSF teniendo en cuenta el
servlet-path del servlet que gestiona las páginas JSF's.
Ejemplo:
request.getRequestDispatcher("/faces/miJSF.jsp").forward(request, response);
Desde la página JSF o desde su controlador se podrá recuperar información compartida (mediente el uso de atributos con un determinado alcance) por el Servlet (o JSP) que invoca.