我正在为preRenderView事件开发一个监听器方法,在该方法中,我打算拦截DOM树组件,并根据登录用户的权限将呈现属性设置为true或false。
我已经复习了这些问题,但我仍然有一些疑问
在侦听器之前设置Bean属性
安全通道参数
这是我的主要模板的一个片段:
<p:layoutUnit position="center">
<p:tabView id="tabItemList" scrollable="true"
activeIndex="#{borderTemplateMB.activeTab}">
<p:ajax event="tabClose" listener="#{borderTemplateMB.onCloseTab}" />
<c:forEach items="#{borderTemplateMB.tabList}" var="tabItem">
<p:tab closable="#{tabItem.closable}" id="#{tabItem.id}"
visible="tabItem.visible">
<f:facet name="title">
<span class="ui-icon #{tabItem.icon}" />
<p:outputLabel value=" #{tabItem.title}"></p:outputLabel>
</f:facet>
<ui:include src="#{tabItem.url}" />
</p:tab>
</c:forEach>
</p:tabView>
</p:layoutUnit>
在内部或每个选项卡(.xhtml(中,我有以下内容:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:event listener="#{securityMB.doManageEvents}" type="preRenderView" />
<f:attribute name="resource" value="frm_groups" />
</f:metadata>
<ui:decorate
template="/protected/templates/#{customerMB.template}/forms/templateSearch.xhtml">
<ui:param name="tpl_panel_title" value="#{msg['panel.title.groups']}"></ui:param>
<ui:param name="tpl_title_filters"
value="#{msg['label.searchFilters']}"></ui:param>
相关部分如下:
首次尝试
<f:metadata>
<f:event listener="#{securityMB.doManageEvents}" type="preRenderView" />
<f:attribute name="resource" value="frm_groups" />
</f:metadata>
在我的请求中作用域Bean:
public void doManageEvents(ComponentSystemEvent event) {
UIViewRoot root = Faces.getContext().getViewRoot();
String idForm = (String)event.getComponent().getAttributes().get("resource");
LOG.info("[doManageEvents] Init " + idForm);
UIComponent comp = findComponent(root, idForm);
if (comp != null) {
printComponentTree(comp);
}
}
第一次尝试失败,因为属性"resource"没有更新,总是显示第一次调用。
第二次尝试:
<f:metadata>
<f:event listener="#{securityMB.doManageEvents}" type="preRenderView">
<f:attribute name="resource" value="frm_groups" />
</f:event>
</f:metadata>
在这一秒尝试时,resource属性为null。
第三次尝试:
<f:metadata>
<f:event listener="#{securityMB.doManageEvents('from_users')}" type="preRenderView" />
</f:metadata>
在我的请求中作用域Bean:
public void doManageEvents(String idForm) {
UIViewRoot root = Faces.getContext().getViewRoot();
LOG.info("[doManageEvents] Init " + idForm);
UIComponent comp = findComponent(root, idForm);
if (comp != null) {
printComponentTree(comp);
}
}
最后一种方法编译良好且有效,但eclipse在编辑器上显示了此错误
Method must have signature "void method(ComponentSystemEvent)" but has
signature "void method(String)"
我需要知道在编辑器上使用什么方法来处理这个错误。
向preRenderView侦听器发送参数的正确形式是什么?。
问题
您的各种尝试失败的原因如下:
-
您正在错误的组件上应用
f:attribute
,并试图从backingbean中的错误组件中检索它:-
f:attribute
仅适用于扩展UIComponent
的组件。javax.faces.view.ViewMetadata
不扩展UIComponent
,因此f:attribute
不适用于它 -
与以下线路耦合
String idForm = (String)event.getComponent().getAttributes().get("resource");
上面的行显示您试图从
ComponentSystemEvent
实例获取属性,而不是您(错误地(试图将属性附加到的元数据对象实例 -
-
与(1(相同,
javax.faces.event.ComponentSystemEvent
不是UIComponent
的子级 -
你已经知道第三种方法失败的原因了。
要解决
如果并且仅当要设置的值在视图构建时可用时,JSTL的<c:set/>
将很好地。
<c:set property="#{yourBean.property}" value="theValue"/>