我有一个表单可以从列表中选择一个代理。支持bean决定是否应该呈现列表并填充单选按钮的项目:
<h:selectOneRadio rendered="#{myBean.shoudRender}" value="#{myBean.selectedAgent}" id="agents">
<f:selectItems value="#{myBean.allAgents}" />
</h:selectOneRadio>
100%确定,myBean.getShouldRender()
会在 myBean.getAllAgents
之前执行吗?
谢谢!
答案 0 :(得分:3)
是的,它会的。在继续编码自身及其子代之前,UIComponent#encodeAll()
会检查isRendered()
是否返回true
。
另一方面,这表明您在<f:selectItems>
的getter中执行业务逻辑。否则,你根本不会担心它返回null
左右的情况,并且从来没有问过这个问题。 getter方法是执行业务逻辑的错误位置。您应该在(post)构造函数或(action)侦听器方法中执行此操作。吸气剂应该只返回已经准备好的值。
因此,这是错误的:
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;
}
答案 1 :(得分:0)
我使用的是一种名为XPages的技术,它基于JSF。
在我的世界中,至少渲染将首先进行评估。所以我认为你会好的。