问题描述
||
我有一个简单的要求:ѭ0的列数是动态的。我将有一个对象列表
someBean.features
,它将确定要呈现的列数。
下图应阐明我的要求。
在给出的代码中,使用了JSTL<c:forEach/>
标记,这在JSF环境中使用时显然会产生问题。他们做了这样的事情:
<tr:table value=\"#{someBean.values}\">
<tr:column headerText=\"Name\">
<tr:outputText value=\"#{someBean.name}\"/>
</tr:column>
<c:forEach var=\"col\" items=\"#{someBean.features}\">
<tr:column headerText=\"Column-#{col.id}\">
<tr:outputText value=\"#{col.name}\"/>
</tr:column>
</c:forEach>
</tr:table>
但是,当我分析上面的代码时,上面的<tr:table/>
标记的输入方法someBean.getValues
被调用了数千次,而不是大约20次。这-我发现-是由于<c:forEach/>
标记是一个编译事实时间标签,其中“ѭ7”是渲染时间标签。
因此,这是我打算做的事情(将<c:forEach/>
替换为<tr:iterator/>
:
<tr:table value=\"#{someBean.values}\">
<tr:column headerText=\"Name\">
<tr:outputText value=\"#{someBean.name}\"/>
</tr:column>
<tr:iterator var=\"col\" value=\"#{someBean.features}\">
<tr:column headerText=\"Column-#{col.id}\">
<tr:outputText value=\"#{col.name}\"/>
</tr:column>
</tr:iterator>
</tr:table>
但是,由于某种原因,ѭ9似乎不喜欢放在ѭ0中,并且它永远也不会执行。
任何解决方案,提示,指南将不胜感激。
哦,我们正在将JSF 1.1与MyFaces Trinidad 1.0.13实现一起使用。
谢谢。
解决方法
我认为的唯一方法(关于它,您可能已经知道了;))是编写扩展UIXTable并提供自定义标记处理程序来处理
<tr:columns items=\"#{columns}\">
并将columns数组扩展为html列
, 吸气呼叫是一种特别便宜的操作。如果您的获取者按照他们的意图去做,只是返回bean属性,那么这实际上不会有任何危害。
这种担忧给我的印象是,您错误地在getter方法内而不是在仅被请求一次调用的构造函数或某些事件方法内完成一些昂贵的业务工作。您确实应该对此进行相应的修复。吸气剂不应该做任何事情,或者只是做一些延迟加载。
至于为什么<c:forEach>
起作用而<tr:iterator>
不起作用的原因,这是因为JSTL标记在视图构建期间运行,而不是在视图渲染期间运行,并且UIData
组件的唯一有效子元素是UIColumn
组件。基本上,在构建视图时,所有JSTL标签都将运行,并且您最终将获得一个纯JSF视图,所有all18都已经在正确的位置。呈现视图时,所有JSF标记都将运行,最终您得到纯HTML结果,然后可以将其发送到浏览器。
也可以看看:
为什么JSF多次调用getter