2010-08-31 13 views
30

De una acción en mi bean, estoy intentando redirigir a otra página esperando un parámetro de vista. ¿Cuál es la forma recomendada de hacer esto en JSF2?¿Cómo se pasan los parámetros de visualización cuando se navega desde una acción en JSF2?

Por ejemplo, decir que mi página de origen es: http://localhost/page1.xhtml

tiene un commandButton que llama a una acción:

<h:commandButton value="submit" action="#{myBean.submit}" /> 

donde mi frijol se ve así:

@ManagedBean 
@RequestScoped 
public class MyBean { 

private int id; 

public String submit() { 
    //Does stuff 
    id = setID(); 
    return "success"; 
} 

Y ahora, Quiero que el retorno de la acción 'enviar' navegue al http://localhost/page2.xhtml?id=2

He intentado hacer esto con un parámetro de vista en mi caja de navegación, pero con resultados extraños. El fragmento de caras-config tiene el siguiente aspecto:

<navigation-rule> 
    <from-view-id>/page1.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>success</from-outcome> 
     <to-view-id>/page2.xhtml</to-view-id> 
     <redirect> 
      <view-param> 
       <name>id</name> 
       <value>#{myBean.id}</value> 
      </view-param> 
     </redirect> 
    </navigation-case> 
</navigation-rule> 

El comportamiento extraño ser, a pesar de que myBean se establece en un ámbito de petición, sólo se llama myBean.getId() la primera vez que cargo mi solicitud, y reutiliza que mismo valor para todas las llamadas posteriores, produciendo parámetros de vista incorrectos para la página2.

Así que estoy buscando ya sea una mejor manera de hacer esto, o una razón/solución de por qué el parámetro view-param no se solicita desde mi bean cada vez.

Respuesta

47

Lo poco intuitivo acerca de pasar parámetros en JSF es que usted no decide qué enviar (en la acción), sino más bien lo que deseas recibir (en la página de destino).

Cuando realiza una acción que finaliza con una redirección, los metadatos de la página de destino se cargan y todos los parámetros necesarios se leen y se anexan a la url como parámetros.

Tenga en cuenta que este es exactamente el mismo mecanismo que con cualquier otra vinculación JSF: no puede leer el valor de inputText desde un lugar y hacer que escriba en otro lugar. La expresión de valor definida en viewParam se usa tanto para leer (antes de la redirección) como para escribir (después de la redirección).

Con el bean que acaba de hacer:

@ManagedBean 
@RequestScoped 
public class MyBean { 

private int id; 

public String submit() { 
    //Does stuff 
    id = setID(); 
    return "success?faces-redirect=true&includeViewParams=true"; 
} 

// setter and getter for id 

Si el lado receptor tiene:

<f:metadata> 
     <f:viewParam name="id" value="#{myBean.id}" /> 
    </f:metadata> 

Lo hará exactamente lo que quiere.

+0

Hice una pequeña prueba con él, y creo que funciona como yo quería. ¡Gracias! Aunque presumiblemente, se refería a "éxito? Faces-redirect = true & includeViewParams = true"; y dule

+0

sí, lo siento. Pegué las dos partes del código de un proyecto en funcionamiento para evitar errores tipográficos, y aquí va: el primero proviene de la plantilla xml (donde debe escaparse el símbolo comercial) y está incompleto, y el otro tiene un nombre de variable diferente. Lo editaré de inmediato. – fdreger

+0

@fdreger ¿dónde pondrías los metadatos cuando estás usando un h: commandButton? – Kevin

2

Consultar estas:

Vas a necesitar algo como:

<h:link outcome="success"> 
    <f:param name="foo" value="bar"/> 
</h:link> 

... y ...

<f:metadata> 
    <f:viewParam name="foo" value="#{bean.foo}"/> 
</f:metadata> 

A juzgar por this page, algo como esto podría ser más fácil:

<managed-bean> 
    <managed-bean-name>blog</managed-bean-name> 
    <managed-bean-class>com.acme.Blog</managed-bean-class> 
    <managed-property> 
     <property-name>entryId</property-name> 
     <value>#{param['id']}</value> 
    </managed-property> 
</managed-bean> 
+0

El problema con esto es que no voy directa a través de la página siguiente. Mi pregunta se refiere a navegar desde una acción de frijol. Page 1 llama a una acción de frijol, la acción de frijol hace cosas, devuelve "éxito", y ahora quiero navegar con éxito pero agregar un parametro de vista con el redireccionamiento. – dule

+0

Lo siento, he entendido mal tu publicación. Creo que http://java.dzone.com/articles/bookmarkability-jsf-2 puede obtener lo que desea. El ejemplo es exactamente lo que está buscando, creo: 'http: //domain/blog/entry.jsf? Id = 9' –

+0

Gracias por las respuestas, pero no estoy seguro si mi pregunta aún se entiende correctamente. No estoy seguro de a qué ejemplo se refiere en ese artículo, porque no discute sobre cómo navegar desde una acción. Lo más parecido en el artículo es pasar un parámetro de vista a la página siguiente, pero lo que quiero es no pasar el mismo parámetro de vista de una página a otra, sino que quiero pasar un nuevo parámetro de vista a una página. desde una navegación de acción. Permítanme intentar reformular mi pregunta original para ver si puedo aclararla. – dule

13

Sin una solución mejor, lo que me encontré con el trabajo es simplemente incrementando mi cadena de consulta en el retorno de frijol:

public String submit() { 
    // Do something 
    return "/page2.xhtml?faces-redirect=true&id=" + id; 
} 

No es la solución más flexible, pero parece funcionar como yo quiero.

también utilizar este enfoque para limpiar el proceso de construcción de la cadena de consulta: http://www.warski.org/blog/?p=185

+0

¿todavía usas el faces-config al hacerlo? – Kevin

+0

¿qué jsf usaste? – Kevin

0

Puede hacerlo utilizando Primefaces así:

<p:button 
     outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}"> 
</p:button> 
0

Simplemente añadir el atributo visto para redirigir la etiqueta de la siguiente manera:

<redirect include-view-params="true"> 
    <view-param> 
     <name>id</name> 
     <value>#{myBean.id}</value> 
    </view-param> 
</redirect> 

Here son algunos ejemplos de navegación.

-1

Una solución sin referencia a un Bean:

<h:button value="login" 
     outcome="content/configuration.xhtml?i=1" /> 

En mi proyecto me falta este enfoque:

<h:commandButton value="login" 
     action="content/configuration.xhtml?faces-redirect=true&amp;i=1" /> 
+0

Mala opción para usar un botón de comando aquí. Use un botón normal: http://stackoverflow.com/questions/13070537/difference-between-hbutton-and-hcommandbutton (lo mismo es cierto para PrimeFaces p: botón) – Kukeltje

Cuestiones relacionadas