我有一个从列表中选择一个代理的表单。支持bean决定是否应该呈现列表并填充单选按钮的项:
<h:selectOneRadio rendered="#{myBean.shoudRender}" value="#{myBean.selectedAgent}" id="agents">
<f:selectItems value="#{myBean.allAgents}" />
</h:selectOneRadio>
myBean.getShouldRender()
在 myBean.getAllAgents
之前执行是否100%确定?
谢谢!
会的。UIComponent#encodeAll()
将检查isRendered()
是否返回true
,然后继续对其自身及其子节点进行编码。
另一方面,这表明您在<f:selectItems>
的getter中执行业务逻辑。否则,如果它返回null
左右,并且从一开始就没有问过这个问题,那么您根本就不用担心它。getter方法不是执行业务逻辑的正确位置。您应该在(post)构造函数或(action)侦听器方法中这样做。getter应该只返回已经准备好的值。
所以这是错误的:
public boolean isShouldRender() {
boolean shouldRender = // Some business logic...
// ...
return shouldRender;
}
public List<Agent> getAllAgents() {
List<Agent> allAgents = // Some business logic...
// ...
return allAgents ;
}
而应该是
// Have properties which you initialize during an event.
private boolean shouldRender;
private List<Agent> allAgents;
public void someEventMethod() { // E.g. postconstruct, action, ajax behavior, value change, etc.
shouldRender = // Some business logic.
allAgents = // Some business logic.
}
// Keep the getters untouched!
public boolean isShouldRender() {
return shouldRender;
}
public List<Agent> getAllAgents() {
return allAgents;
}
参见:
- 为什么JSF多次调用getter
我从事一种叫做XPages的技术,它基于JSF。
在我的世界里,至少渲染会首先被评估。所以我想你会没事的。