我从render属性调用一个方法,我注意到该方法在RENDER_RESPONSE阶段被多次触发。
还注意到该方法在其他阶段(APPLY_REQUEST_VALUES,PROCESS_VALIDATIONS等)也被多次交叉。
我看到了一个相关的查询(Why is the getter called so many times by the rendered attribute?),其中告诉了这些调用背后的原因。
有没有办法控制它,所以只调用一次方法。
我的用法
<rich:panelMenuItem label="Menu1" actionListener="#{testMenuMB.panelMenuClickedAjax}" rendered="#{testMenuMB.checkForRendering('RoleA,RoleB')}"></rich:panelMenuItem>
public boolean checkForRendering(String rolesString){
System.out.println("Roles-->"+rolesString+FacesContext.getCurrentInstance().getCurrentPhaseId());
boolean authorized = false;
String [] rolesArray = rolesString.split(",");
for (String string : rolesArray) {
if(string!=null && accesibleRolesMap.containsKey(string)){
authorized = true;
break;
}
}
return authorized;
}
答案 0 :(得分:1)
您无法控制调用方法的次数,即framewroks生命周期。您应找到适当的位置来设置布尔值,例如在命令单击操作方法上,在render方法中使用此布尔值,以便在操作方法中执行一次逻辑,并且仅返回布尔值。
另外一点是你可以通过探测渲染响应的当前生命周期阶段来保护if条件的逻辑。
if(FacesContext.getCurrentInstance().getRenderResponse()){
//logic
}
但我更喜欢第一种选择。