Зачем явно добавлять process=@this в p:commandButton, чтобы вызвать действие?

Я знаю, что нам нужно явно добавить process="@this", чтобы вызвать действие p:commandbutton, и я также знаю, что атрибут процесса по умолчанию равен @form в простых лицах.

Поскольку для процесса по умолчанию установлено значение @form, кнопка не должна также обрабатываться вместе с другими элементами в форме, и ее действие должно вызываться.

Может ли кто-нибудь объяснить точную причину этого?


person Srikanth Ganji    schedule 06.03.2014    source источник
comment
Большое спасибо Balusc. Я прочитал ссылку, прежде чем публиковать этот вопрос, и многие мои сомнения прояснились. Но я сомневаюсь, что, поскольку процесс по умолчанию формирует форму, не должна ли кнопка обрабатываться как один из всех элементов формы?   -  person Srikanth Ganji    schedule 07.03.2014
comment
Извините за задержку с ответом. Если проверка не пройдена хотя бы для одного из элементов формы, то жизненный цикл JSF будет напрямую отображать ответ, пропуская значения модели обновления и фазу вызова приложения. Поэтому я сомневаюсь, что при отсутствии ошибок проверки действие кнопки не должно выполняться в обычном жизненном цикле jsf.   -  person Srikanth Ganji    schedule 27.03.2014
comment
Какой источник говорит, что commandButton должен иметь @this для обработки? У вас есть рабочий пример, иллюстрирующий это?   -  person kolossus    schedule 29.07.2014


Ответы (1)


Процесс @form означает текущую форму commandLink/Button
Процесс @this означает текущий компонент commandLink/Button. Проверьте код ниже.

процесс.xhtml

<h:form id="form1">
    <h:inputText value="#{ProcessBean.id}" id="id"/><br/>
    <h:panelGroup id="panel_1">
        <h:inputText value="#{ProcessBean.name}" id="name"/><br/>
    </h:panelGroup>
    <h:panelGroup id="panel_2">
        <h:inputText value="#{ProcessBean.address}"/>
        <br/>
        <p:commandButton process="@form" value="Btm1" id="button1" action="#{ProcessBean.show}"/><!-- Default -->
        <p:commandButton process="@this" value="Btm2" id="button2" action="#{ProcessBean.show}"/>
        <p:commandButton process="@this form1:panel_1" value="Btm3" id="button3" action="#{ProcessBean.show}"/>
    </h:panelGroup>
</h:form>  

ProcessBean.java

@ManagedBean(name = "ProcessBean")
public class ProcessBean {
    private String id;
    private String name;
    private String address;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

    public void show() {
        System.out.println(id);
        System.out.println(name);
        System.out.println(address);
    }
}

Давайте пользователю вводить поле ввода

001     -> id
Jone    -> name
London  -> address

Нажмите button1, будут обработаны все JSF component(Eg : id, name, address) всей формы. Выход будет:

001
Jone
London

Нажмите button2, процесс будет сам (например: button2). Нет процесса для id, name, address. Вывод будет:

null
null
null

Нажмите button3, будут обработаны все JSF component(Eg : name) целиком из panel_1 и button3. Выход будет:

null
Jone
null

Не вызывает ваш метод действия? Перед вызовом может произойти сбой проверки или преобразования.

person Zaw Than oo    schedule 29.07.2014
comment
Большое спасибо, это было действительно полезно. - person Ashish Burnwal; 14.06.2019