Вся форма отправлена ​​даже с Ajax Listener - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в разработке JSF. Я использую Eclipse с данными JDK 1.8.0_172, WildFly 16, JSF 2.3, PrimeFaces 7.0. Я разработал страницу с именем FrmTest.x html с управляемым компонентом с областью видимости. После загрузки страницы, когда пользователь нажимает кнопку NEW, я хочу добавить новую строку в таблицу данных. Но вся форма представлена. Я понял, что ajax выполняет обработку без отправки всей формы. Что я должен изменить, чтобы вся форма не была отправлена, но строка была добавлена ​​в таблицу данных?

x html выглядит следующим образом:

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">

    <h:head>    
    </h:head>
    <h:body>


        <div class="ToolBar" style="background-color:cadetblue;padding:10px;" > 
            <h:commandButton id="btnNewP"   value="new" global="false">
                <f:ajax event="click" execute="btnNewP" listener="#{testing.ButtonNew}" render="dataList"  />
            </h:commandButton>  
        </div>  

        <h:form id="FrmTest">  

            <p:dataTable id="dataList" value="#{testing.getListDto()}"  var="lst" Form="FrmTest" paginator="true" rows="20" paginatorPosition="top"  editable="true" editMode="cell"  rowKey="#{lst.vsCode}" rowIndexVar="rowNumber" selectionMode="single">
                    <f:facet name="header">
                        List of Vat Status
                    </f:facet>

                    <p:column  headerText="Selected">
                        <div style="text-align: center;">
                            <p:selectBooleanCheckbox value="#{lst.isSelected}"  />
                        </div>
                    </p:column>

                    <p:column id="Code" headerText="Code">
                        <p:cellEditor>
                            <f:facet name="output">
                                <h:outputText value="#{lst.vsCode}" />
                            </f:facet>
                            <f:facet name="input">
                                <p:inputText value="#{lst.vsCode}" >
                                <p:ajax event = "blur" listener="#{testing.onCellBlur(rowNumber, 'Code')}" update="dataList"  />
                                </p:inputText>
                            </f:facet>
                        </p:cellEditor>
                    </p:column>                 

                    <p:column id="Name" headerText="Name">
                         <p:cellEditor>
                            <f:facet name="output">
                                <h:outputText value="#{lst.vsName}" />
                            </f:facet>
                            <f:facet name="input">
                                <p:inputText value="#{lst.vsName}" >
                                <p:ajax event = "blur" listener="#{testing.onCellBlur(rowNumber, 'Name')}" update="dataList"  /> 
                                </p:inputText>
                            </f:facet>
                         </p:cellEditor>
                    </p:column>

                    <p:column id="Description" headerText="Description">
                         <p:cellEditor>
                            <f:facet name="output">
                                <h:outputText value="#{lst.vsDescription}"  />
                            </f:facet>
                            <f:facet name="input">
                                <p:inputText value="#{lst.vsDescription}" >
                                <p:ajax event = "blur" listener="#{testing.onCellBlur(rowNumber, 'Description')}" update="dataList"  /> 
                                </p:inputText>
                            </f:facet>
                         </p:cellEditor>
                    </p:column>

                    <p:column  headerText="is Active">
                        <div style="text-align: center;">
                            <p:selectBooleanCheckbox value="#{lst.isActive}"  />
                        </div>
                    </p:column>                     

                    <p:column headerText="Modified By" style="display:none;">
                        <h:outputText id="ModifiedBy" value="#{lst.modifiedBy}" />
                    </p:column>

                    <p:column headerText="Modified Date" style="display:none;">
                        <h:outputText id="ModifiedDate" value="#{lst.modifiedDate}" />
                    </p:column>     

                    <p:column headerText="Row State" style="display:none;">
                        <h:outputText id="RowState" value="#{lst.rowState}" />
                    </p:column>     

                    <p:column headerText="Error Description" style="display:none;">
                        <h:outputText id="ErrorDescription" value="#{lst.errorDescription}" />
                    </p:column>     

            </p:dataTable>

          </h:form> 

    </h:body>

</html>

Кодирование для NEW Кнопка выглядит следующим образом

public void ButtonNew() {

try {
    System.out.println("ButtonNew, Entry");

    Date modifiedDate = new Date(); 
    dtoUpdated = new VatStatusDto(false, " ", " ", " ", 0.00, " ", " ", " ", " ", " ", "Y", true,  getSessionUserCode(), modifiedDate, modifiedDate.toString(),  " ", " ", "Added");    

    listDto.add(0, dtoUpdated);
    PrimeFaces.current().ajax().update("FrmTest:dataList");

}
catch (Exception e) {
    System.out.println("FrmTest, ButtonNew: " + e.getMessage() + ", " + e.getCause() + ", " + e.getStackTrace());       
}

}

Ответы [ 2 ]

4 голосов
/ 21 апреля 2020

Я понял, что ajax выполняет обработку без отправки всей формы.

Нет, тогда вы поняли неправильно (по крайней мере, в контексте basi c ajax и PrimeFaces / JSF). Это не то, что ajax делает ... Ajax в основном "только" выполняет частичное обновление страницы, обновляя в ответе только те части страницы, которые должны быть обновлены. В 'ajax' нет ничего, что указывало бы на необходимость оптимизации других вещей, таких как (по умолчанию) частичная обработка / выполнение элементов на стороне сервера или принудительное выполнение клиентом частичной отправки формы (входных данных) от клиента на сервер. .

В поведении атрибутов PrimeFaces update / process или простых JSF рендеринг / выполнение есть хороший раздел по оптимизации того, какие части фактически отправляются клиентом. Вы можете эффективно сделать это для каждого ввода, формы или глобально (полное приложение), поэтому я не буду дублировать эту часть здесь.

См. Также:

0 голосов
/ 23 апреля 2020

@ Кукельтье, большое спасибо за ваш вклад. Я прочитал то, что вы отправили. Я удалил все объекты PrimeFaces, все ajax вызовы. Проблема осталась. Проблема была из-за глупой ошибки от меня. Мой управляемый компонент, область видимости, расширил еще один класс, помеченный как Request Scoped. Я изменил его для просмотра области, когда я нажимаю командную кнопку, отправка всей формы больше не происходит.

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