malformedXML:更新期间:找不到adminUsersForm

BRa*_*t27 6 forms ajax jsf rendering

我对JSF上的ajax有一些疑问.

我的xhtml看起来像这样:

<h:body>
<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" />
        <!-- <f:ajax render="@all" /> -->
    </h:selectOneMenu>
</h:form>

<h:form id="adminUsersForm"
    rendered="#{menu.mainMenuItem == 'Admin users.'}">
    <h:commandButton value="Button 1" />
</h:form>

<h:form id="loadInfoForm"
    rendered="#{menu.mainMenuItem == 'Load info.'}">
    <h:commandButton value="Button 2" />
</h:form>

<h:form id="viewFilesForm"
    rendered="#{menu.mainMenuItem == 'View files.'}">
    <h:commandButton value="Button 3" />
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)

当我使用时,<f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" />我得到malformedXML错误,另一方面当我使用<f:ajax render="@all" />正确<h:form>的渲染时.

这里发生了什么?我读了用ajax我们可以渲染组件只是相同的内径的形式,但是如果我们使用:componentID它可以使一个-使用外窗体ajax-组件.

在此先感谢,也许这是一个基本问题,但我对JSF很新,并试图学习.

Bal*_*usC 14

<f:ajax render>应指向它的客户端ID 总是出现在JSF生成的HTML DOM树.这是强制性的,因为它是客户端的JavaScript,需要更新HTML DOM树.但是,您将它指向HTML DOM树中存在的客户端ID,因为它们不是由JSF呈现的.

您需要将具有rendered属性的元素放在父组件中,该组件始终存在于JSF生成的HTML DOM树中.

这是一种方式:

<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :adminUsers :loadInfo :viewFiles :adminUsersForm :loadInfoForm :viewFilesForm" />
    </h:selectOneMenu>
</h:form>

<h:panelGroup id="adminUsers">
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}">
        <h:commandButton value="Button 1" />
    </h:form>
</h:panelGroup>

<h:panelGroup id="loadInfo">
    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}">
        <h:commandButton value="Button 2" />
    </h:form>
</h:panelGroup>

<h:panelGroup id="viewFiles">
    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}">
        <h:commandButton value="Button 3" />
    </h:form>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

这是另一种方式(如果表单之间实际上没有要更新的内容,我建议更多):

<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :otherForms :adminUsersForm :loadInfoForm :viewFilesForm" />
    </h:selectOneMenu>
</h:form>

<h:panelGroup id="otherForms">
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}">
        <h:commandButton value="Button 1" />
    </h:form>

    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}">
        <h:commandButton value="Button 2" />
    </h:form>

    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}">
        <h:commandButton value="Button 3" />
    </h:form>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种方式中我都包含了所有其他表单的ID render.这是解决JSF Ajax JavaScript中的一个错误(将在JSF 2.2中修复).有关详细说明,请参阅包含其他表单的内容的Ajax呈现.

  • 主要区别在于传输的数据.如果你在表单之外还有很多其他内容,那么`@ all`会传输不必要的数据,这会使响应大小更大,从而使它变得更慢.另外,`@ all`与答案的最后一段中描述的问题相同,你仍然需要在`render`中明确指定表单ID. (2认同)