example - jsf primefaces
¿Cómo se pasan los parámetros de visualización cuando se navega desde una acción en JSF2? (6)
Echa un vistazo a estos:
- http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#get
- http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-actions/
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 esta página , 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>
A partir de una acción en mi bean, intento redireccionar a otra página esperando un parámetro de vista. ¿Cuál es la forma recomendada de hacer esto en JSF2?
Por ejemplo, supongamos que mi página de origen es: http://localhost/page1.xhtml
tiene un CommandButton que llama una acción:
<h:commandButton value="submit" action="#{myBean.submit}" />
donde se ve mi frijol:
@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 a http://localhost/page2.xhtml?id=2
Intenté hacer esto con un parámetro de vista en mi caso de navegación, pero con resultados extraños. El fragmento faces-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 es que, aunque myBean está configurado para solicitar un ámbito, solo llama a myBean.getId () la primera vez que cargo mi aplicación, y reutiliza ese mismo valor para todas las llamadas posteriores, produciendo parámetros de vista incorrectos para la página2.
Así que estoy buscando una mejor manera de hacerlo, o una razón / solución de por qué el parámetro view-param no se solicita desde mi bean cada vez.
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 desea 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 otro enlace 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 tu frijol solo haces:
@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>
Hará exactamente lo que quieras.
Puedes hacerlo usando Primefaces como este:
<p:button
outcome="/page2.xhtml?faces-redirect=true&id=#{myBean.id}">
</p:button>
Simplemente agregue 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 hay algunos ejemplos de navegación.
Sin una solución más agradable, lo que encontré para trabajar es simplemente construir 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 utilizando este enfoque para limpiar el proceso de construcción de la cadena de consulta: http://www.warski.org/blog/?p=185
Una solución sin referencia a Bean:
<h:button value="login"
outcome="content/configuration.xhtml?i=1" />
En mi proyecto, necesitaba este enfoque:
<h:commandButton value="login"
action="content/configuration.xhtml?faces-redirect=true&i=1" />