Esta es una idea interesante. Me gustaría saber cómo se desarrolla en la práctica.
Aplicación de las normas de navegación
navegación es manejado por el NavigationHandler. Conseguir NavigationHandler no es difícil, pero la API no expone las reglas que usa.
mi punto de vista, se puede:
- de análisis faces-config.xml en la inicialización y almacenar las reglas en el contexto de aplicación (fácil)
- implementar su propio NavigationHandler que hace caso omiso de las reglas en faces-config.xml o los complementa con su propio archivo de reglas y expone su conjunto de reglas de alguna manera (realizable, pero toma un poco de trabajo)
- imite su propio FacesContext y páselo al controlador de navegación existente (muy difícil hacer dos coexisten FacesContext objeto en mismo hilo y extremadamente ineficiente)
Ahora, tiene otro problema también. ¿Dónde vas a guardar las asignaciones para buscar las vistas? ¿Codificarlos en los frijoles?
Usando las reglas de navegación
Off lado, puedo pensar en dos formas en que podría construir URL que contiene los parámetros-desde el back-end. Ambos implican definir un bean de algún tipo.
<managed-bean>
<managed-bean-name>navBean</managed-bean-name>
<managed-bean-class>foo.NavBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
Fuente:
package foo;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
public class NavBean implements Serializable {
private String getView() {
String viewId = "/showMessage.faces"; // or look this up somewhere
return viewId;
}
/**
* Regular link to page
*/
public String getUrlLink() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
String navUrl = context.getExternalContext().encodeActionURL(
extContext.getRequestContextPath() + viewId);
return navUrl;
}
/**
* Just some value
*/
public String getValue() {
return "" + System.currentTimeMillis();
}
/**
* Invoked by action
*/
public String invokeRedirect() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
try {
String charEncoding = extContext.getRequestCharacterEncoding();
String name = URLEncoder.encode("foo", charEncoding);
String value = URLEncoder.encode(getValue(), charEncoding);
viewId = extContext.getRequestContextPath() + viewId + '?' + name
+ "=" + value;
String urlLink = context.getExternalContext().encodeActionURL(
viewId);
extContext.redirect(urlLink);
} catch (IOException e) {
extContext.log(getClass().getName() + ".invokeRedirect", e);
}
return null;
}
}
GET
Para una petición GET, puede utilizar los UIParameters para establecer los valores y dejar que el procesador de construir la lista de parámetros.
<h:outputLink value="#{navBean.urlLink}">
<f:param name="foo" value="#{navBean.value}" />
<h:outputText value="get" />
</h:outputLink>
POSTAL
Si desea establecer la dirección URL a una vista durante una acción POST, puede hacerlo utilizando una redirección en una acción (invocado por un botón o commandLink).
<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
<h:outputText value="post" />
</h:commandLink>
Notas
Tenga en cuenta que ExternalContext.encodeActionURL se usa para codificar la cadena. Esta es una buena práctica para producir código que sea portátil en todos los contextos (portlets, etcétera). Utilizaría encodeResourceURL si estaba codificando un enlace a una imagen o descargando un archivo.
Tenga en cuenta que escribí esta respuesta antes de que saliera JSF2/JEE6. JSF2 agrega soporte para los parámetros de vista. Cualquier persona atrapada en JSF1.2/JEE5 debería considerar usar Seam. – McDowell