【问题标题】:JSF 2 validation alongwith tabbedPanel in rich faces causing issueJSF 2 验证以及丰富面孔中的 tabbedPanel 导致问题
【发布时间】:2013-01-10 14:10:14
【问题描述】:

我正在使用 JSF 2.0 和丰富的面孔 4.2.3 开发一个 Web 应用程序。 我有一个页面,其中选项卡式面板相互嵌套,如下所示(代码在最后给出)。

我面临以下问题:

当一个选项卡被点击时,验证被触发并且第二个选项卡不被显示(因为文本字段没有设置任何值,验证失败)。 这是因为,当单击选项卡时,会触发 POST 请求,从而调用验证。 我该如何解决这个问题?

其中一个选项可能是将 switchType 更改为“client”。但是当点击一个标签时,更新的数据将不会显示。

<h:form>    
    <rich:tabPanel switchType="client">

        <rich:tab header="UserManagement">  
             <rich:tabPanel switchType="client">
                    <rich:tab header="AddUser">

                     <h:form>                       
                         <h:panelGrid id="addUserForm" columns="3">

                                Enter Name : 
                                <h:inputText id="name" value="#{userBean.name}"
                                    required="true" requiredMessage="User Id Required.">
                                </h:inputText>
                                <h:message for="name"></h:message>

                                Enter passWord : 
                                <h:inputText id="passWord" value="#{userBean.passWord}" required="true" requiredMessage="PassWord Required.">                    
                                </h:inputText>
                                <h:message for="passWord"></h:message>

                                Roles : 
                                 <h:selectOneMenu id="roles" value="#{userBean.roleId}">
                                                <f:selectItems  value="#{userBean.roles}"/>
                                </h:selectOneMenu>      
                                <h:message for="roles"></h:message>

                                <h:commandButton action="#{userBean.addUser}"
                                                    value="Add User">
                                      <f:ajax render="addUserForm" execute="@form"></f:ajax>
                                </h:commandButton>  
                        </h:panelGrid>
                    </h:form> 

                    </rich:tab>
                    <rich:tab header="EditUser"> 

                        <h:form>

                            <h:panelGrid id="editUserForm" columns="3">

                                    Enter passWord : 
                                    <h:inputText id="passWord" value="#{userBean.passWord}" required="true" requiredMessage="PassWord Required.">                    
                                    </h:inputText>
                                    <h:message for="passWord"></h:message>

                                    Roles : 
                                    <h:selectOneMenu id="roles" value="#{userBean.roleId}">
                                                    <f:selectItems  value="#{userBean.roles}"/>
                                    </h:selectOneMenu>      
                                    <h:message for="roles"></h:message>

                                    <h:commandButton action="#{userBean.editUser}"
                                                        value="Edit User">
                                          <f:ajax render="editUserForm" execute="@form"></f:ajax>
                                    </h:commandButton>
                            </h:panelGrid>  
                        </h:form>

                    </rich:tab>                          
             </rich:tabPanel>

        </rich:tab>     

        <rich:tab header="DeviceManagement">
        </rich:tab>     

    </rich:tabPanel>
</h:form>

【问题讨论】:

    标签: jsf-2 richfaces


    【解决方案1】:

    你已经在上面做了一件非常错误的事情,那就是嵌套&lt;h:form/&gt;s。表单嵌套在 HTML 和扩展 JSF 中都是非法的。即使您的观点没有其他问题,仅此构造就会让您在以后非常头疼。见thisthis答案

    在标签点击时触发验证,因为在一天结束时,您的所有组件都集中在同一个 &lt;h:form/&gt; 中。因此,该表单中的任何操作都将提交其中的所有组件。您必须摆脱最顶层的&lt;h:form/&gt; 并相应地重组您的组件。此外,您可以使用&lt;a4j:commandButton process="someId" ajaxSingle="true"/&gt; 选择性地处理视图组件,指定您要提交处理的组件的clientId

    【讨论】:

    • 如果我从顶部删除
      ,当通过浏览器(mozilla)访问页面时,页面上会显示警告,如下所示:表单组件需要有一个 UIForm在它的祖先。建议:将必要的组件包含在 中。我是否总是需要将rich:tabPanel 包含在表单元素中?
    • @Atul,JSF 中的经验法则是,如果它不提交任何用于服务器端处理的内容,则无需将其包装在表单中。该消息您可以(in theory)ignore。在这种情况下,您可以做的是将顶级 &lt;p:tab/&gt;s 包装在单个 &lt;h:form/&gt;s 中,并将 javax.faces.PROJECT_Stage 上下文参数(在您的 web.xml 中)设置为“生产”(这会处理该警告)
    • ,将 javax.faces.PROJECT_Stage 设置为生产删除了警告。关于您的建议的一个问题:将顶级 s 包装在单个
      中,这是为什么必要的 ?在我上面粘贴的代码中,h:form 存在于rich:tab 中并且它工作得很好。(不在rich:tab 之外)。如果我在h:form 中包含顶级选项卡,两个子选项卡将在同一个内部h:form(AddUser 和 EditUser)。
    • @Atul,回想起来,你是对的,你需要做的就是摆脱最顶层的形式。不需要顶级标签表单
    猜你喜欢
    • 2023-04-08
    • 2011-03-04
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-07-18
    • 2011-07-26
    相关资源
    最近更新 更多