JSF с привязкой к компоненту поддержки Session Scoped обрабатывается снова и снова по одному запросу - PullRequest
4 голосов
/ 26 августа 2011

У меня есть страница XHTML, которая при отправке возвращается сама к себе.
Поддерживающий компонент имеет сессионную область. При перенаправлении на саму страницу визуализируется h: dataable дважды и выдается ошибка идентификатора дубликата. Я могу визуально увидеть, что таблица визуализируется дважды также рядом друг с другом.
Я повторяю, что это связано с тем фактом, что компонент поддержки имеет свойство html-таблицы face, и по возвращении он создает снова, но какое решение.

Ниже приводится примерное руководство из этого из JavaBeat. Единственное основное отличие состоит в том, что мой поддерживающий компонент - Session Scoped.

Я также повторяю, что мой вопрос, вероятно, недостаточно проясняет, но код должен :), вот он

Фасоль

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.event.ValueChangeEvent;

import com.example.common.web.bean.BaseBean;

@ManagedBean(name = "registrationBean")
@SessionScoped
public class RegisterationViewManagedBean extends BaseBean {


    private String field;
    private List<Employee> employees;
    private Employee employee;
    private HtmlDataTable htmlDataTable;
    private List<Employee> list = new ArrayList();

    public void setSelected(ValueChangeEvent event) {
        employee = (Employee) htmlDataTable.getRowData();
        list = new ArrayList<Employee>();
        list.add(employee);
    }

    public List<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }

    public HtmlDataTable getHtmlDataTable() {
        return htmlDataTable;
    }

    public void setHtmlDataTable(HtmlDataTable htmlDataTable) {
        this.htmlDataTable = htmlDataTable;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String dataSubmit() {
        for (Employee employee : this.list) {
            System.out.println(employee.getCity());
            System.out.println(employee.getName());
            System.out.println(employee.getEmpNo());
        }
        return "success";
    }

    public String submit() {
        this.employees = new ArrayList<Employee>();
        Employee employee1 = new Employee();
        employee1.setCity("Bangalore");
        employee1.setEmpNo("1");
        employee1.setName("Krishna");
        Employee employee2 = new Employee();
        employee2.setCity("Bangalore");
        employee2.setEmpNo("2");
        employee2.setName("ShunmugaRaja");
        Employee employee3 = new Employee();
        employee3.setCity("Bangalore");
        employee3.setEmpNo("3");
        employee3.setName("JoyChristy");
        this.employees.add(employee1);
        this.employees.add(employee2);
        this.employees.add(employee3);
        return "success";
    }
}

Xhtml Page

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



    <ui:define name="body">

        <h:form>
            <h:dataTable var="loc" value="#{registrationBean.employees}"
                binding="#{registrationBean.htmlDataTable}">
                <h:column>
                    <h:selectOneRadio onclick="radioButton(this);"
                        valueChangeListener="#{registrationBean.setSelected}">
                        <f:selectItem itemValue="null" />
                    </h:selectOneRadio>
                </h:column>
                <h:column>
                    <h:outputText value="#{loc.name}" />
                </h:column>
                <h:column>
                    <h:outputText value="#{loc.empNo}" />
                </h:column>
                <h:column>
                    <h:outputText value="#{loc.city}" />
                </h:column>
            </h:dataTable>
            <!-- Summary ends -->
            <div class="submitButtons">
                <h:commandButton id="register" action="#{registrationBean.submit}"
                    value="Perform Some Action" />
            </div>
        </h:form>
    </ui:define>
</ui:composition>

трассировка стека

Caused by: java.lang.IllegalStateException: component with duplicate id "j_id397249623_10fed7a7:j_id397249623_10fed7bd:j_id397249623_10fed793" found
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:784)
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800)
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800)
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.checkIds(DefaultFaceletsStateManagementStrategy.java:800)
    at org.apache.myfaces.view.facelets.DefaultFaceletsStateManagementStrategy.saveView(DefaultFaceletsStateManagementStrategy.java:432)
    at org.apache.myfaces.application.StateManagerImpl.saveView(StateManagerImpl.java:160)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1554)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:281)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:93)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)

Привязка enter image description here

1 Ответ

8 голосов
/ 05 сентября 2011

Проблема в том, что вы используете сессионный компонент для хранения привязки страницы.Первый раз страница отображается так, как ожидалось.Во второй раз привязка уже имеет компонент, поэтому все дочерние элементы дублируются.Проблема не может быть решена изменением реализации JSF (потому что оба имеют одинаковый код, унаследованный от Facelets).Попробуйте использовать два bean-компонента, один из которых связан с сессией, а другой - с привязкой.

...