h:传递属性时的outputtext问题

时间:2011-12-12 16:02:31

标签: jsf

我有一个搜索屏幕,我在其中搜索客户ID,并使用Web服务返回对象的返回列表。我在datatable中显示结果。对于特定字段,我有一个方法,它根据迭代列表的每一行中的键值提供值。键值是productID。我在一个名为output的bean中设置它。在getCustomerValue方法中,我通过传递“productID”的值来调用提供相关值的方法。我使用下面列出的代码来做同样的事情。

<h:outputText id="customerID" binding="#{myBean.output}" value="#{customerBean.customervalue}">
<f:attribute name="myID" value="#{item2.customerService.productID}"/>
</h:outputText> 

加载页面时,该值会正确显示。我在同一页面中有超链接,它基本上调用相同的web服务并呈现相同的页面。但是这次除了显示上面列出的值之外的所有值。当我在方法“customervalue”中打印属性“item2.customerService.productID”的值时,它显示为null。我不确定为什么没有传递该值。

1 个答案:

答案 0 :(得分:1)

您在<h:dataTable>中显示此内容。 <f:attribute>特定于组件本身,而不是其生成的HTML输出。 <f:attribute>在视图构建期间进行评估,而不是在视图渲染时进行评估。目前,JSF构建视图,范围中不存在#{item2}。当JSF呈现视图时,它仅出现在范围内。

您需要通过其他方式寻找解决方案。目前还不清楚你正在使用什么样的JSF版本,但基于你的问题,你正在使用JSF 1.2(在未来的问题中,明确提到你正在使用的JSF impl /版本;在JSF 2.0中很多事情可以以不同的方式完成,而且更优雅。)

我之前关于Passing parameters to a method in h:outputtext tag的问题的回答应该是您当前问题的最佳答案。这显然不是一种选择。在这种情况下,至少有3种替代方式:

  1. 将属性移至#{item2}后面的类:

    <h:outputText value="#{item2.customervalue}">
    

    您可以即时访问customerservice媒体资源。

  2. 通过编程方式评估EL,获取getter中的当前项:

    public String getCustomervalue() {
        FacesContext context = FacesContext.getCurrentInstance();
        Long productID = context.getApplication().evaluateExpressionGet(context, "#{item2.customerService.productID}", Long.class);
        // ...
    }
    

    (我认为productIDLong

  3. 将数据表的值绑定到DataModel

    private DataModel<Item2> items;
    

    <h:dataTable value="#{customerBean.items}" var="item2">
    

    public String getCustomervalue() {
        Item2 item2 = items.getRowData();
        // ...
    }