早上好,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)
我获得FacesContext
,UIViewRoot
的当前实例,构建new FullVisitContext(facesContext)
并尝试viewRoot.visitTree
。
但只有viewRoot才会被访问。
我做错了什么?也许我过早地试图visitTree()
?那应该什么时候完成?
谢谢!
答案 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>