1

我正在从渲染属性调用一个方法,我注意到该方法在 RENDER_RESPONSE 阶段被多次触发。

还注意到该方法在其他阶段(APPLY_REQUEST_VALUES、PROCESS_VALIDATIONS 等)也被多次触发。

我看到了一个相关的查询(为什么 getter 被渲染属性调用了这么多次?),其中告诉了这些调用背后的原因。

有没有一种方法可以控制这一点,以便该方法只被调用一次。

我的用法

<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;
    }
4

1 回答 1

1

您无法控制调用该方法的次数,即其框架生命周期。您应该找到适当的位置来设置布尔值,例如在命令单击操作方法中,在渲染方法中使用此布尔值,以便在操作方法中执行一次逻辑并且只返回布尔值。

另一件事是,您可以通过探测当前生命周期阶段以获取渲染响应来保护带有 if 条件的逻辑。

 if(FacesContext.getCurrentInstance().getRenderResponse()){
    //logic
 }

但我更喜欢第一个选项。

于 2013-02-26T10:45:19.680 回答