JSF - передать параметр при вызове ajax. Что не так в этом коде? - PullRequest
5 голосов
/ 02 декабря 2010

Мне нужно передать параметр в bean-компонент, когда я выполняю ajax-вызов.

Мой боб такой:

@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; }
}

И, когда я делаю вызов ajax, мне нужен (из-за того, что я хочу сделать другой контекст) параметр страницы. Итак, я сделал это:

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

Но на этапе запроса на применение страница все еще остается "домашней страницей". Он должен получить параметр страницы из запроса, применить его к дереву компонентов и отобразить контекст «статьи». Почему не происходит?

Приветствия

1 Ответ

5 голосов
/ 02 декабря 2010

Поскольку значение <h:inputHidden> устанавливается только на этапе обновления значений модели. Это действительно не интуитивное поведение, которое долгое время существовало в JSF. Я когда-либо сообщал о проблеме по этому поводу, но это было закрыто как "нарочно".

Есть несколько способов исправить это, в том числе область видимости. В вашем конкретном случае вы можете использовать <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>

Затем он будет доступен в качестве параметра запроса #{param.page} и, таким образом, в вашем компоненте области действия будет установлен @ManagedProperty.

...