2008-09-26 26 views
10

¿Hay alguna manera de crear un enlace html utilizando h: outputLink, otra etiqueta o código JSF para crear una solicitud non faces (HTTP GET) con parámetros de solicitud?¿Cómo crear una solicitud GET con parámetros, usando JSF y reglas de navegación?

Por ejemplo tengo el siguiente navegación en reglas

<navigation-rule> 
    <navigation-case> 
     <from-outcome>showMessage</from-outcome> 
     <to-view-id>/showMessage.jsf</to-view-id> 
     <redirect/> 
    </navigation-case> 
</navigation-rule> 

En mi página me gustaría salida el siguiente código html:

<a href="/showMessage.jsf?msg=23">click to see the message</a> 

tan sólo pudiera escribir el código HTML en la página , pero quiero usar la regla de navegación para tener todas las URL definidas en un único archivo configurable.

Respuesta

11

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:

  1. de análisis faces-config.xml en la inicialización y almacenar las reglas en el contexto de aplicación (fácil)
  2. 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)
  3. 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.

+2

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

0

¿Has considerado alguna forma?

<h:form> 
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" /> 
    <h:inputHidden id="msgId" value="#{bean.msgId}"/> 
</h:form> 
+0

tengo;) pero ¿cómo voy a anexar los parametros de solicitud a la cadena de consulta? –

+0

No sé sobre JSF , pero esto es automático con HTML

. –

0

Puede usar un commandLink con etiquetas param anidadas. Este es básicamente el mismo que hubbardr dijo anteriormente:

<h:form> 
    <h:commandLink value="click here" action="${handler.outcome}"> 
    <f:param name="msgId" value="${bean.id}" /> 
    </h:commandLink> 
</h:form> 

Luego, en el bean de respaldo que tiene que hacer:

Map requestMap = FacesContext.getCurrentInstance() 
       .getExternalContext().getRequestParameterMap(); 
String msgId = (String) requestMap.get("msgId"); 

y luego hacer lo que tiene que hacer.

Cuestiones relacionadas