【问题标题】:How to recognize Java Server Faces 2.0 composite components when using ajax?使用ajax时如何识别Java Server Faces 2.0复合组件?
【发布时间】:2011-05-12 23:39:18
【问题描述】:

我有以下 Java Server Faces 2.0 复合组件。注意我正在使用 逐字

resources/customer/customer.xhtml

<composite:interface>
    <composite:attribute name="id" required="false"/>
    <composite:attribute name="firstName" required="false"/>
    <composite:attribute name="lastName" required="false"/>
    <composite:attribute name="age" required="false"/>
    <composite:attribute name="rendered" required="false"/>
</composite:interface>
<composite:implementation>
    <f:verbatim id="#{cc.attrs.id}" rendered="#{cc.attrs.rendered}">
        <div>
            <div>
                <p>First name</p>
                <h:outputText value="#{cc.attrs.firstName}"/>
            </div>
            <div>
                <p>Last name</p>
                <h:outputText value="#{cc.attrs.lastName}"/>
            </div>
            <div>
                <p>Age</p>
                <h:outputText value="#{cc.attrs.age}"/>
            </div>
        </div>
    </f:verbatim>
</composite:implementation>

为了使用ajax,我已经做了(注意render属性)

<h:form id="search">
<div>
    <h:commandButton value="Search" action="#{customerSearchController.search}">
        <f:ajax execute="@form" render="search:result"/>
    </h:commandButton>
</div>
<customer:customer id="result"
                   rendered="#{customerSearchController.customer != null}"
                   firstName="#{customerSearchController.customer.firstName}"
                   lastName="#{customerSearchController.customer.lastName}"
                   age="#{customerSearchController.customer.age}"/>
</h:form>

我的CustomerSearchController如下所示

private Customer customer;

// getter's and setter's

public void search() {
    customer = new Customer();

    customer.setFirstName("First");
    customer.setLastName("Last");

    customer.setAge(30);
}

CustomerSearchController 和 Customer 都是托管 bean。但是当我调用 ajax 请求时,它会抱怨:search:result not found

我应该怎么解决这个问题???

【问题讨论】:

    标签: java ajax jsf jsf-2 composite-component


    【解决方案1】:

    &lt;f:ajax render&gt; 应该指向 HTML DOM 树中的现有客户端 ID。但是,由于 search:result 元素在 HTML DOM 树中不可用,因为它不是由服务器端渲染的,所以 JS/ajax 在 HTML DOM 树中找不到任何要更新/渲染的内容。

    将它包装在另一个元素中,该元素在 HTML DOM 树中始终可用,以便 Ajax 可以找到它。

    <h:panelGroup id="result">
        <customer:customer rendered="..." />
    </h:panelGroup>
    

    与实际问题无关,请注意f:verbatim 应该只包含逐字(纯 HTML),而不是 JSF 组件。将其替换为h:panelGroup

    【讨论】:

    • 非常感谢。你拯救了我的一天。而且 JSF 2 很强大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2010-09-09
    • 2012-04-07
    • 1970-01-01
    • 2012-03-11
    • 2011-03-06
    • 2011-12-16
    相关资源
    最近更新 更多