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 JSF
A 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 Servlet
Este 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.