Невозможно использовать скрытую commandButton с бэк-бином @RequestScoped - PullRequest
1 голос
/ 13 февраля 2012

У меня следующий пример кода. Первоначально видна только команда Button Two . Когда я нажимаю эту кнопку, commandButton One также виден. Но когда я нажимаю One , метод поддерживающего бина click1 не срабатывает.

Ниже приведен мой код:

* 1014 XHTML *

<h:form id="form1">
    <h:inputHidden id="show" value="#{bean.show1}" />
    <h:commandButton id="button1" value="One" action="#{bean.click1}"
        rendered="#{bean.show1}" />
</h:form>
<h:form id="form2">
    <h:inputHidden id="show" value="#{bean.show1}" />
    <h:commandButton id="button2" value="Two" action="#{bean.click2}" />
</h:form>

поддержка боб

@RequestScoped
@Named("bean")
public class JsfTrial implements Serializable {

    private static final long serialVersionUID = 2784462583813130092L;

    private boolean show1; // + getter, setter

    public String click1() {
        System.out.println("Click1()");
        return null;
    }

    public String click2() {
        System.out.println("Click2()");
        setShow1(true);
        return null;
    }

}

Я нашел очень информативный ответ от BalusC.

Если я правильно понимаю, моя проблема связана с пунктом 5 этого ответа.

Означает ли это, что мы не можем использовать скрытую commandButton с @ RequestScoped backing-bean?

1 Ответ

6 голосов
/ 13 февраля 2012

Вы можете использовать область запроса, вы должны только передать условие в качестве параметра запроса для последующих запросов с помощью <f:param> вместо поля скрытого ввода JSF <h:inputHidden>.Значение скрытого поля ввода устанавливается только в модели на этапе обновления значений модели, в то время как условие атрибута rendered уже оценивается на более раннем этапе применения значений запроса.

Итак, используйте <f:param> вместо <h:inputHidden>:

<h:form id="form1">
    <h:commandButton id="button1" value="One" action="#{bean.click1}"
        rendered="#{bean.show1}">
        <f:param name="show1" value="#{bean.show1}" />
    </h:commandButton>
</h:form>
<h:form id="form2">
    <h:commandButton id="button2" value="Two" action="#{bean.click2}">
        <f:param name="show1" value="#{bean.show1}" />
    </h:commandButton>
</h:form>

Таким образом, вы можете извлечь их как параметр запроса в конструкторе (post) компонента.

public JsfTrial() {
    String show1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("show1");
    this.show1 = (show1 != null) && Boolean.valueOf(show1);
}

Ужасно, но CDI не предлагает встроенную аннотацию, которая заменяет JSF @ManagedProperty("#{param.show1}").Однако вы можете homegrow такую ​​аннотацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...