我正在处理 JSF 页面上的丰富:数据表。该表可以变得非常大,并使用 rich:datascroller 进行分页。大多数列都是硬连线的,并且将始终存在,但是还有一些基于附加值的可选列,这些附加值需要为每个潜在的附加值生成。我已经能够很容易地做到这一点。但是,我遇到了过滤问题。
我在每一列上使用一个过滤器。它与列标签和排序功能一起放置在标题中。在每一列上都可以正常工作,但是由于 filtermethod 默认的工作方式,我在过滤方面遇到了障碍。这是一个简单的例子:
<rich:datatable id="thetable" value=#{backingBean.stuff} var="b">
<!-- First column, standard filter method, works just fine -->
<rich:column sortBy="#{b.field1}" filterMethod="#{filterBean.filterField1}">
<f:facet name="header">
<ui:fragment>
<h:outputText value="Field 1" />
<h:inputText value="#{filterBean.filterMap['Field1']}" />
</ui:fragment>
</f:facet>
#{b.field1}
</rich:column>
<c:forEach items="#{backingBean.extraStuff}" var="e">
<rich:column sortBy="#{b.getExtra(e)}" filterMethod="???">
<f:facet name="header">
<ui:fragment>
<h:outputText value="#{b.getExtra(e).description}" />
<h:inputText value="#{filterBean.filterMap['b.getExtra(e).code']}" />
</ui:fragment>
</f:facet>
#{b.getExtra(e).description}
</rich:column>
</rich:datatable>
这 ???将很快介绍。至于滤豆:
public class FilterBean {
public Map<String, String> filterMap = new HashMap<String, String>();
public boolean filterField1(Object current){
return ((BackingBean) current).contains(filterMap.get("Field1"));
}
}
这很简单。过滤器 inputText 绑定到 hashMap 中的预设字符串,该字符串在方法中检索并用于过滤,因此我不需要为每个过滤器设置单独的字段。这很好用,但我仍然需要为每个过滤器使用单独的方法,这将我带到 ??? 在 JSF 代码中...
我想做的是将参数传递给过滤器方法以说明动态列。事实上,我想用一个过滤器方法简化整个类,并将映射的字符串与当前对象的字段一起传入。但是,这是行不通的。我试过了:
filterMethod="#{filterBean.filterStuff(b, 'Field1')}"
但我最终得到了过滤器字符串,但当前对象为空。我不确定发生了什么事。如果我正确阅读了项目中的依赖项,我使用的是一些相当旧的 EL、JSF、JSP 等版本,我真的无法改变它。不过,这个项目确实使用了 Seam,而且我之前在这个项目中已经在 EL 中成功地传递了参数。是否只是 EL 2.2 支持传递对象而旧版本仅支持原语和字符串?有什么方法可以让我做到这一点,还是我没有从头开始构建大量额外的东西就被困住了?
好的,看起来这可能使用 Seam,但它不喜欢迭代变量。如果我从支持 bean 引用列表中的索引,我可以传递对象,但这无济于事,因为我无法告诉它搜索每一行......