我有一个搜索屏幕,我在其中搜索客户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。我不确定为什么没有传递该值。
答案 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种替代方式:
将属性移至#{item2}
后面的类:
<h:outputText value="#{item2.customervalue}">
您可以即时访问customerservice
媒体资源。
通过编程方式评估EL,获取getter中的当前项:
public String getCustomervalue() {
FacesContext context = FacesContext.getCurrentInstance();
Long productID = context.getApplication().evaluateExpressionGet(context, "#{item2.customerService.productID}", Long.class);
// ...
}
(我认为productID
是Long
)
将数据表的值绑定到DataModel
:
private DataModel<Item2> items;
与
<h:dataTable value="#{customerBean.items}" var="item2">
和
public String getCustomervalue() {
Item2 item2 = items.getRowData();
// ...
}