在完全构建的组件树上访问Tri()的最早时刻?

时间:2015-04-17 06:10:51

标签: jsf jsf-2.2

早上好,JSF专家!

让我想一想我试图解决的问题。该应用程序有很多种形式。表单中的元素可以根据1)为此表单元素配置的权限及其条件组合以及2)从db加载的用户权限进行标记,以要求用户授权。

我尝试开发的解决方案如下:我实现自定义组件,扩展UIComponentBase。在形式的Facelets'标记此自定义组件将在授权下包装元素:

<custom:applyRights id="abc">
    <p:inputText
        id="inputWithRights"
        value="Some placeholder..."
        tabindex="0"/>
</custom:applyRights>

然后我需要修改组件树。即在构建组件树之后,我需要找到我的<custom:applyRights/>,访问它的子树并按原样保留组件,或者禁用它们,或者设置setRendered( false )等。对组件采取的具体操作也取决于关于组件的类型。

然后我用PhaseListener表示:

@Override
public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
}

在其afterPhase(PhaseEvent phaseEvent)我获得FacesContextUIViewRoot的当前实例,构建new FullVisitContext(facesContext)并尝试viewRoot.visitTree

但只有viewRoot才会被访问。

我做错了什么?也许我过早地试图visitTree()?那应该什么时候完成?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是PostAddToViewEvent本身的UIViewRoot。您可以使用如下所示的SystemEventListener实现来加入它:

public class YourSystemEventListener implements SystemEventListener {

    @Override
    public boolean isListenerForSource(Object source) {
        return (source instanceof UIViewRoot);
    }

    @Override
    public void processEvent(SystemEvent event) throws AbortProcessingException {
        UIViewRoot view = (UIViewRoot) event.getSource();
        // ...
    }

}

<application> faces-config.xml中注册的内容如下:

<system-event-listener>
    <system-event-listener-class>com.example.YourSystemEventListener</system-event-listener-class>
    <system-event-class>javax.faces.event.PostAddToViewEvent</system-event-class>
    <source-class>javax.faces.component.UIViewRoot</source-class>
</system-event-listener>