2010-12-02 11 views
5

Necesito pasar un parámetro a un bean cuando hago una llamada ajax.JSF - Pasa un parámetro en una llamada ajax - ¿Qué hay de malo en este código?

Mi frijol es la siguiente:

@ManagedBean 
@RequestScoped 
public class Selector { 
    @ManagedProperty(value="#{param.page}") 
    private String page; 

    @PostConstruct 
    public void init() { 
     if(page==null || page.trim().isEmpty()) { 
      this.page="homepage"; 
     } 

     System.out.println(this.page); 
    } 

    public String getPage() { return page; } 
    public void setPage(String page) { this.page=page; } 
} 

Y, cuando hago la llamada ajax, necesito (debido al hecho de que quiero rendir un contexto diferente) el parámetro de página. Así que he hecho esto:

// in this moment selector.page = articles 
<h:inputHidden value="#{selector.page}" id="page" /> 

<h:commandLink> 
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" /> 
    <f:ajax event="click" render=":articlesContent"/> 
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/> 
</h:commandLink> 

Pero, en la fase de Solicitud de solicitud, la página sigue siendo "página de inicio". Debería obtener el parámetro de página de la solicitud, aplicarlo al árbol de componentes y representar el contexto de "artículos". ¿Por qué no sucede?

Saludos

Respuesta

5

Debido a que el valor de <h:inputHidden> sólo se establece durante la fase de valores del modelo de actualización. Este es de hecho un comportamiento poco intuitivo que existió por mucho tiempo en JSF. Alguna vez reporté un problema sobre esto, pero esto fue cerrado como "por diseño".

Existen varias formas de solucionar este problema, entre otras, el alcance de la vista. En su caso particular, se puede utilizar en lugar de <f:param><h:inputHidden>:

<h:commandLink> 
    <f:param name="page" value="#{selector.page}" /> 
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" /> 
    <f:ajax event="click" render=":articlesContent"/> 
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/> 
</h:commandLink> 

Será entonces disponible como parámetro de la petición #{param.page} y en su ámbito de petición de frijol por lo tanto establecer como @ManagedProperty.

+0

Sí, un comportamiento un tanto extraño. Pero funciona :) ¡Gracias! – markzzz

+0

De nada. – BalusC

+0

P.S. como rescate de JSF, no se olvide de http://stackoverflow.com/questions/4334424/jsf-why-setter-is-not-called-this-time y http://stackoverflow.com/questions/4304763/jsf- problem-with-viewscope (tal vez no los viste jeje) – markzzz

Cuestiones relacionadas