在JSF中,如何使用ajax动态地部分更新页面并使用表单验证?

时间:2013-12-17 08:05:43

标签: jsf jsf-2 bean-validation ajax4jsf

我有一个像这样的JSF 2表单:

<h:form>
<h:panelGrid columns="2">
<a4j:repeat value="#{dialog.departments}" var="depart">
        <h:inputText value="#{depart.name}"/>
        <h:selectOneRadio value="#{depart.hasSubdepartment}">
           <f:ajax render="@form" execute="@form" immediate="true"/>
           <f:selectItem itemValue="#{true}"/>
           <f:selectItem itemValue="#{false}"/>
        </h:selectOneRadio>

    <a4j:repeat  value="#{depart.subdepartments}" var="sub" rendered="#{depart.hasSubdepartment}">
        <h:inputText value="#{sub.name}"/>
        <h:outputText value="&#160;" />
    </a4j:repeat>
</a4j:repeat>
</h:panelGrid>
</h:form>

我只是表格。如您所见,此表单显示像树一样的部门的数据结构。 我想要实现的是,如果用户将单选按钮切换到true,将显示子部门,如果切换为false,则子部门将被隐藏。 问题是:

  • 如果execute标记的f:ajax值设置为@form,则会调用@NotNull@Size等支持bean的验证。但我们现在不想调用验证,因为我们现在不想保存数据。
  • 如果execute标记的f:ajax值设置为@this,则似乎在ajax请求之后,无线电的值将恢复。例如,如果无线电值为false,我们单击true,则在ajax请求之后,值将返回false,并且不会呈现子部门部分。如果execute设置为@form,则不会发生这种情况。

非常感谢您有任何想法或提示。

1 个答案:

答案 0 :(得分:0)

我没有Richfaces集成测试环境,但是我已经在普通的JSF中实现了你想要的东西(这就是为什么它可能是ajax4jsf特定的问题)。在这里,您有一个有效的测试用例,并遵循SSCCE standards。测试 Mojarra 2.1.26 &amp; Tomcat 6

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head />

<h:body>
    <h:form>
        <h:panelGrid columns="2">
            <ui:repeat value="#{dialog.departments}" var="depart">
                <h:inputText value="#{depart.name}" />
                <h:selectOneRadio value="#{depart.hasSubdepartments}">
                    <f:ajax render="@form" immediate="true" />
                    <f:selectItem itemValue="#{true}" />
                    <f:selectItem itemValue="#{false}" />
                </h:selectOneRadio>

                <h:panelGroup id="subdepartmentPanel"
                    rendered="#{depart.hasSubdepartments}">
                    <ui:repeat value="#{depart.subdepartments}" var="sub">
                        <h:inputText value="#{sub.name}" />
                    </ui:repeat>
                </h:panelGroup>
            </ui:repeat>
        </h:panelGrid>
    </h:form>
</h:body>
</html>
@ManagedBean
@ViewScoped
public class Dialog {

    public class Department {
        private String name;

        private List<Department> subdepartments = new ArrayList<Dialog.Department>();

        private boolean hasSubdepartments;

        public Department(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public List<Department> getSubdepartments() {
            return subdepartments;
        }

        public boolean isHasSubdepartments() {
            return hasSubdepartments;
        }

        public void setHasSubdepartments(boolean hasSubdepartments) {
            this.hasSubdepartments = hasSubdepartments;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setSubdepartments(List<Department> subdepartments) {
            this.subdepartments = subdepartments;
        }
    }

    private List<Department> departments = new ArrayList<Dialog.Department>();

    public Dialog() {
        // Create departments and subdepartments
        departments.add(new Department("First Department"));
        Department d = new Department("Second department");
        d.getSubdepartments().add(new Department("Subdepartment"));
        departments.add(d);
    }

    public List<Department> getDepartments() {
        return departments;
    }

}