¿Cómo se pasa los parámetros de vista al navegar de una acción en JSF2?

StackOverflow https://stackoverflow.com/questions/3605238

  •  25-09-2019
  •  | 
  •  

Pregunta

A partir de una acción en mi frijol, estoy tratando de redirigir a otra página esperando un parámetro de vista. Lo que es la forma recomendada de hacer esto 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 mis frijol se ve así:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

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

Y ahora, quiero retorno de la 'enviar' de acción para navegar hasta http:? id = 2 //localhost/page2.xhtml

he tratado de hacer esto con miras-param en mi caso la navegación, pero con resultados extraños. Las miradas caras-config fragmento de código como el siguiente:

<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 ser extraño comportamiento, a pesar de que myBean se establece en ámbito de petición, sólo se llama myBean.getId () la primera vez que cargo mi solicitud, y reutiliza el mismo valor para todas las llamadas posteriores, produciendo incorrectas parámetros de vista de page2.

Así que estoy buscando, ya sea para una mejor manera de hacer esto, o un motivo / solución de por qué no se está solicitando la vista-param de mi frijol cada vez.

¿Fue útil?

Solución

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 se hace una acción que termina con una redirección, los metadatos de la página de destino se carga y todos los parámetros necesarios se leen y se añade a la URL como params.

Tenga en cuenta que este es exactamente el mismo mecanismo que con cualquier otra unión JSF: no se puede leer el valor de inputText de un lugar y tienen que escribir en otro lugar. La expresión valor definido en viewParam se utiliza tanto para la lectura (antes de la redirección) y por 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.

Otros consejos

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 el más flexible de las soluciones, pero parece que funciona como quiero que lo haga.

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

Salida siguientes:

Vamos 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>

Puede hacerlo utilizando Primefaces como esta:

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

Sólo tiene que añadir el atributo visto a etiqueta de redireccionamiento de la siguiente manera:

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

Aquí son algunos ejemplos de navegación.

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"  />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top