Primefaces 4.0中的验证阻止了应用程序

时间:2014-03-06 12:00:22

标签: java spring hibernate jsf primefaces

我遇到了素面4.0的问题。我使用spring和hibernate框架,prime faces 4.0,JSF实现了一个Java Web应用程序。我有一个包含几个选项卡的表单。我使用require =“true”来验证文本框。因此,如果必填字段留空,则会触发验证消息。

假设我有一个包含4个标签的表单,我有6个必填字段。在填写表单时,我忘记填写6个必填字段中的1个,然后单击“保存”。将显示验证消息,但它会阻止应用程序。我无法点击标签甚至我的菜单栏。它完全阻止了应用程序。

以下是日志中的错误消息:

参考错误:未定义Primefaces

请在下面找到xhtml页面:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/jsf/template.xhtml">

<ui:define name="content">
    <h:form prependId="false">


    <p:panel header="#{toydetailsmsgs['toydetails.title']}" style="margin-top:10px">
            <p:messages />

    <h:panelGrid id="detail" columns="2" styleClass="grid" columnClasses="label,value">
        <p:growl id="growl" showDetail="true" sticky="true" />
            <p:tabView id="tabView" dynamic="true">

                <p:tab id="tab1" title="Home">

                    <h:panelGrid id="main" columns="2" styleClass="grid" columnClasses="label,value">
                        <h:outputText value="#{toydetailsmsgs['toydetails.id.title']}:*" />
                        <h:selectOneMenu id="toydetails_id" value="#{ToyDetailsComponent.toydetails.id}"style="width:200px;" required="true">   
                            <f:selectItems value="#{ToyDetailsComponent.toyLists}"
                            var="current" itemValue="#{current.toyCode}"
                            itemLabel="#{current.toyCode} - #{current.toyDesc}" />
                        </h:selectOneMenu>

                        <p:calendar pattern="dd/MM/yyyy" id="toyedetails_dob"
                        value="#{ToyDetailsComponent.toydetails.Dob}"
                        required="true" converter="primefacesCalendarConverter"/>

                    </h:panelGrid>

                </p:tab>

                <p:tab id="tab2" title="Toy Details">
                    <h:panelGrid id="main1" columns="2" styleClass="grid" columnClasses="label,value">
                        <p:calendar pattern="dd/MM/yyyy" id="toydetails_date" value="#{ToyDetailsComponent.toydetails.Date}"
                        required="false" converter="primefacesCalendarConverter" >

                        <p:ajax event="dateSelect" process="toydetails_date"
                        update="toydetails_service" listener="#{ToyDetailsComponent.calculateService()}" />

                        </p:calendar>

                        <h:outputText value="#{toydetailsmsgs['toydetails.service.title']}:" />
                        <h:inputText id="toydetails_service" value="#{ToyDetailsComponent.toydetails.Service}"
                        required="false" label="toydetails_toyservice" disabled="true" style="width: 197px"/>
                    </h:panelGrid>

                </p:tab>

                <p:tab id="tab3" title="Details">
                    <h:panelGrid id="detail5" columns="2" styleClass="grid" columnClasses="label,value">
                        <h:outputText value="#{toydetailsmsgs['toydetails.det.title']}:*" />
                        <h:inputText id="toydetails_det" value="#{ToyDetailsComponent.toydetails.Det}"
                        required="true"  style="width: 197px"/>
                    </h:panelGrid>

                </p:tab>

                </p:tabView>
                </h:panelGrid>

                <h:panelGrid id="button" columns="2" styleClass="grid" columnClasses="label,value">
                <h:panelGroup>
                    <p:commandButton image="save" ajax="false"
                                style="margin-right:20px;"
                                value="#{toydetailsmsgs['navigation.save']}"
                                action="#{ToyDetailsComponent.save|ToyDetails(ToyDetailsComponent.toydetails)}" />
                </h:panelGroup>
                </h:panelGrid>
                </p:panel>

            </h:form>
        </ui:define>
    </ui:composition>

由于

2 个答案:

答案 0 :(得分:0)

确保页面中包含h:head标记。

常见问题解答:http://primefaces.org/faq.html

答案 1 :(得分:0)

当您尝试转到其他标签时,它会尝试提交当前标签。由于验证失败,jsf框架将抛出​​验证器异常并直接呈现跳过导航的响应。为了避免这种情况,请添加

 <p:tabView id="tabView" ....>
     <p:ajax event=”tabChange” process="@this" partialSubmit="true"   
               listener="if you wish to execute any action" />  
     <p:tab id="tab1" ../>
     <p:tab id="tab2" ../>  
 </p:tabView>

如果您输入了一些字段并单击其他选项卡,则不会处理它们并导航到新选项卡。但是当你回来时,你将无法在字段中看到最后输入的值。如果不希望这种情况发生,请在转到其他选项卡之前保存所有字段。

希望这有帮助!!