Действие не запущено на commandButton JSF 2.2

Я новичок в JSF, и у меня проблема с очень простым представлением Facelets:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core" >
<h:head>
<title></title>
</h:head>
<h:body>

<h:form id="form">
    <h:panelGrid id="ciccio" columns="2">
    <h:outputText value="Nome " />
    <h:inputText value="#{thinBean.nome}" />
        <h:commandButton id="ok" value="OK"  />
        <h:commandButton id="vai" value="Go" rendered="#{not empty thinBean.nome}" action="Vista1" />
    </h:panelGrid>
</h:form>
</h:body>

</html>

и с моим простым Backing Bean.

package magazzino;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class ThinBean implements Serializable {

    private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}   

После первого звонка появляется только первая кнопка. Когда я ввел test в поле nome и отправил эту форму, нажав кнопку, обозначенную ok, также появляется вторая кнопка.

Когда я нажимаю вторую кнопку, обозначенную vai, ничего не происходит: Vista1 не отображается.

Я не понимаю такого поведения: почему фаза Invoke Application пропущена?

Спасибо


person Fabrizio Ferracuti    schedule 10.02.2014    source источник
comment
Где вы сопоставили действие <h:commandButton> с вспомогательным компонентом?   -  person Tiny    schedule 10.02.2014
comment
привет, есть ли обязательное действие сопоставления с методом поддержки bean?   -  person Fabrizio Ferracuti    schedule 10.02.2014
comment
Нет, но вы занимаетесь навигацией? Атрибут action для <h:commandButton>, action="Vista1" предполагается использовать в качестве результата навигации (целевое представление).   -  person Tiny    schedule 10.02.2014
comment
@Tiny, если у вас есть управляемый компонент с методом, возвращающим "someString", то это то же самое, что и <h:commandButton action="#{bean.methodthatReturnsSomeString}" /> и <h:commandButton action="someString" />. Фабрицио: Похоже, поскольку ваш bean-компонент @RequestScoped, значение nome будет null при создании bean-компонента в запросе, поэтому командная кнопка не должна отображаться, что приведет к полной неразберихе. Было бы лучше изменить область действия вашего компонента как минимум на @ViewScoped. Кроме того, убедитесь, что у вас есть представление с именем Vista1 (обычно это файл Vista1.xhtml).   -  person Luiggi Mendoza    schedule 10.02.2014


Ответы (1)


Атрибут rendered компонента UICommand также оценивается на этапе применения значений запроса, как часть защиты от фальсифицированных/взломанных запросов, когда хакеры пытаются вызвать действия компонентов UICommand, которые не отображаются для пользователей без прав администратора. , Например.

В вашем конкретном случае вы используете bean-компонент с областью запроса. Таким образом, компонент уничтожается в конце каждого запроса и воссоздается в начале каждого запроса. Отправка формы по первой кнопке считается одним запросом. Отправка формы второй кнопкой считается еще одним запросом.

Значения UIInput задаются как свойство управляемого компонента на этапе обновления значений модели, который наступает после этапа применения значений запроса. Таким образом, когда нажата вторая кнопка, bean-компонент с областью действия запроса создается заново со всеми свойствами, установленными по умолчанию (null). На этапе применения значений запроса атрибут rendered проверяет входное значение, но оно еще не установлено, а компонент является новым и пустым. Таким образом, он не будет рассматривать кнопку как отображаемую и пропустит декодирование события действия.

Если вы поместите bean-компонент в область представления, то он будет работать по очень простой причине: экземпляр bean-компонента с областью видимости будет жить, пока вы взаимодействуете с одним и тем же представлением, возвращая null или void.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped

Альтернативой является проверка необработанного параметра HTTP-запроса в атрибуте rendered вместо значения модели.

<h:inputText binding="#{nome}" value="#{thinBean.nome}" />
<h:commandButton id="ok" value="OK"  />
<h:commandButton id="vai" value="Go" rendered="#{not empty param[nome.clientId]}" action="Vista1" />

Смотрите также:

person BalusC    schedule 11.02.2014