我正在開發一個JSF 2.0和豐富的面孔4.2.3的Web應用程序。 我有一個帶有標籤面板的頁面,如下所示(代碼在最後給出)。JSF 2驗證與豐富的面孔tabbedPanel導致問題
我現在面臨以下問題:
當點擊選項卡,確認被炒魷魚和第二片沒有得到顯示(因爲文本字段沒有任何值設置,驗證失敗)。 這是因爲,當單擊一個選項卡時,會觸發POST請求,導致驗證調用。 我該如何解決這個問題?
其中一個選項可能是將switchType更改爲「客戶端」。但是當點擊標籤時,更新的數據將不會顯示。
<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>
如果我從頂部刪除,則當通過瀏覽器訪問頁面時,頁面上會顯示警告(mozilla)如下所示:表單組件需要在其祖先中具有UIForm。建議:在之內附上必要的組件。我是否總是需要在表單元素中包含rich:tabPanel? –
Atul
@Atul,JSF中的經驗法則是,如果它沒有提交任何用於服務器端處理的內容,則不需要將其封裝在表單中。你可以[(在理論上)忽略]這個信息(http://stackoverflow.com/q/12749850/1530938)。在這種情況下,你可以做的事情是在單個' '中包裝頂層' ',並將javax.faces.PROJECT_Stage' context-param(在你的web.xml中)設置爲「production」(這很重要的那個警告) –
kolossus
,將javax.faces.PROJECT_Stage設置爲生產時刪除了警告。有關您的建議的一個問題:將頂級 s包裝在個人 中,爲什麼這需要?在上面粘貼的代碼中,h:form存在於rich:tab中,並且它完美地工作(不在rich:tab之外)。如果我在h:form中包含頂層選項卡,那麼兩個子選項卡都將在相同的h:表單(AddUser和EditUser)。 –
Atul