如何将参数传递给preRenderView事件侦听器



我正在为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侦听器发送参数的正确形式是什么?。

问题

您的各种尝试失败的原因如下:

  1. 您正在错误的组件上应用f:attribute,并试图从backingbean中的错误组件中检索它

    • f:attribute仅适用于扩展UIComponent的组件。javax.faces.view.ViewMetadata不扩展UIComponent,因此f:attribute不适用于它

    • 与以下线路耦合

        String idForm = (String)event.getComponent().getAttributes().get("resource");
      

    上面的行显示您试图从ComponentSystemEvent实例获取属性,而不是您(错误地(试图将属性附加到的元数据对象实例

  2. 与(1(相同,javax.faces.event.ComponentSystemEvent不是UIComponent 的子级

  3. 你已经知道第三种方法失败的原因了。


要解决

如果并且仅当要设置的值在视图构建时可用时,JSTL的<c:set/>将很好地

<c:set property="#{yourBean.property}" value="theValue"/>     

相关内容

  • 没有找到相关文章

最新更新