首页 > 解决方案 > 从 Backing Bean 更新嵌套面板

问题描述

我有一个带有部分的面板。每个部分由一个 div 分隔并在其中包含元素。我正在尝试基于轮询器更新支持 bean 的某些部分。轮询器调用一个 bean。

如果有任何事情要做,bean 应该更新第一部分中的表。In addition, when a row in the table is selected, the bean should update other sections of the panel.

我所见过的解决方案都没有显示如何更新嵌套元素。

问题是虽然我可以更新整个面板

    PrimeFaces instance = PrimeFaces.current();
    instance.ajax().update("threatForm:threatListPanel");

如果我尝试更新面板中的任何内容,
PrimeFaces instance = PrimeFaces.current(); instance.ajax().update("threatForm:threatListPanel:threatListPanelDiv");
它会抛出:java.lang.IllegalArgumentException:threatListPanel:

这是xhtml

<h:form id="threatForm">

    <!-- Update the threat list at regular intervals -->
    <p:poll interval="#{threatMonitorView.pollInterval}"  listener="#{threatMonitorView.updateThreatList()}" />

    <p:panel id="threatListPanel" header="Threat Monitor Page">
        <div id="threatListPanelDiv" class="threatPanel">
            <!-- column with threats listed -->
            <div class="threatTableColumn1">
                <p:column>
                    <p:dataTable id="threatListTable" var="singleThreat"
                        widgetVar="threatTable" value="#{threatMonitorView.threats}"
                        selectionMode="single"
                        selection="#{threatMonitorView.selectedThreat}"
                        rowKey="#{singleThreat.uniqueId}" scrollable="false"
                        sortBy="#{singleThreat.timeReceived}">

                        <!-- update the information area when a threat is selected -->
                        <p:ajax event="rowSelect"
                            listener="#{threatMonitorView.onRowSelectThreat}" />

                        <p:column headerText="Active Threats">
                            <!-- header stuff -->

                        </p:column>
                    </p:dataTable>
                </p:column>
                <!-- end of column 1 -->
            </div>
            <!-- End of threatTableColumn1 divider -->

            <!-- Threat info -->
            <div class="threatTableColumn2">
                <p:column id="threatTableColumn2Id">

                    Stuff in this colunm


                </p:column>
                <!-- column 2 end -->
            </div>
            <!-- End of threatTableColumn2 divider -->

            <div id="threatTableColumn3Div" class="threatTableColumn3">
                <p:column>

                    Stuff in this column

                </p:column>

            </div>
            <!-- End of threatTableColumn3 -->

            <div class="threatTableFooter">
                <p:commandButton value="Close" id="threatCloseButton"
                    action="#{threatMonitorView.closeThreatButton()}"
                </p:commandButton>
            </div>
            <!-- End of threatTableFooter divider -->
        </div>
        <!-- end of threatPanel -->
    </p:panel>

</h:form>

这是更新 bean

public void updateThreatList() {

    if (tlm.isThreatListChanged()){
        PrimeFaces instance = PrimeFaces.current();
        instance.ajax().update("threatForm:threatListPanel:threatListPanelDiv");
        tlm.setThreatListChanged(false);
    }
}

是因为我正在更新一个div吗?我尝试了其他元素 PrimeFaces instance = PrimeFaces.current(); instance.ajax().update("threatForm:threatListPanel:threatListTable"); ,但似乎没有什么不同。

任何帮助/见解将不胜感激。蒂亚!

我将 DIV 更改为:

<div jsf:id="threatListPanelDiv" class="threatPanel">

找不到组件

这是错误:13:07:45,431 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle](默认任务1)/WEB-INF/lib/incentcontrol-module-firstview-1.2.0-SNAPSHOT.jar /META-INF/resources/secured-pages/firstview/threatmonitor/threatMonitorView.xhtml @23,57 listener="#{threatMonitorView.updateThreatList()}":java.lang.IllegalArgumentException:threatListPanel:javax.el.E​​LException:/ WEB-INF/lib/incentcontrol-module-firstview-1.2.0-SNAPSHOT.jar/META-INF/resources/secured-pages/firstview/threatmonitor/threatMonitorView.xhtml @23,57 listener="#{threatMonitorView.updateThreatList( )}":java.lang.IllegalArgumentException:com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)的threatListPanel [jsf-impl-2.2.12-jbossorg-2.jar:2.2.12 -jbossorg-2] 在 org.primefaces.component.poll.Poll。广播(Poll.java:251)[primefaces-6.2.3.jar:6.2.3] 在 javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)[jboss-jsf-api_2.2_spec-2.2.12 .jar:2.2.12] 在 javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) [jboss-jsf-api_2.2_spec-2.2.12.jar:2.2.12] 在 com.sun.faces。 com.sun.faces.lifecycle.Phase.doPhase(Phase. java:101) [jsf-impl-2.2.12-jbossorg-2.jar:2.2.12-jbossorg-2] 在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) [jsf-impl -2.2.12-jbossorg-2.jar:2.2.12-jbossorg-2] 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) [jboss-jsf-api_2.2_spec-2.2.12.jar :2.2.12] 在 io.undertow.servlet.handlers.ServletHandler。handleRequest(ServletHandler.java:86) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow -servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:151) [undertow-websockets-jsr-1.2.9.Final.jar :1.2.9.Final] 在 io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow。 servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 de.heimannansystems.jee.incentcontrol.servletfilter.LoginFilter.callNextFilter( LoginFilter.java:97) [incentcontrol-common-3.2.0.jar:] 在 de.heimnnsystems.jee.incentcontrol.servletfilter.LoginFilter。doFilter(LoginFilter.java:55) [incentcontrol-common-3.2.0.jar:] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.2.9.Final. jar:1.2.9.Final] 在 io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io .undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest (ServletSecurityRoleHandler.java:62) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet- 1.2.9.Final.jar:1.2.9.Final] 在 org.wildfly.extension.undertow.security。SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 在 io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 io .undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler .handleRequest(ServletAuthenticationCallHandler.java:57) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow- core-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:51) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) [undertow-core-1.2.9.Final .jar:1.2.9.Final] 在 io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:56) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.security.handlers.AuthenticationMechanismsHandler。 handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler。handleRequest(CachedAuthenticatedSessionHandler.java:72) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) [undertow-core -1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.2.9.Final.jar:1.2.9 .Final] 在 io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 org.wildfly.extension.undertow。 security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 在 io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.2.9.Final.jar:1.2.9。最终] 在 io.undertow.server.handlers.PredicateHandler。handleRequest(PredicateHandler.java:43) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282) [undertow-servlet -1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261) [undertow-servlet-1.2.9.Final.jar:1.2.9 .Final] 在 io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.servlet.handlers .ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172) [undertow-servlet-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) [undertow -core-1.2.9.Final.jar:1.2.9.Final] 在 io.undertow.server。HttpServerExchange$1.run(HttpServerExchange.java:774) [undertow-core-1.2.9.Final.jar:1.2.9.Final] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt. jar:1.8.0_121] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_121] 在 java.lang.Thread.run(Thread.java:745) [ rt.jar:1.8.0_121] 引起:java.lang.IllegalArgumentException:threatListPanel at javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:651) [jboss-jsf-api_2.2_spec-2.2.12.jar: 2.2.12] 在 org.primefaces.util.ComponentTraversalUtils.firstById(ComponentTraversalUtils.java:140) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces.expression.SearchExpressionFacade.resolveComponentById(SearchExpressionFacade.java:526 ) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces。expression.SearchExpressionFacade.resolveClientId(SearchExpressionFacade.java:338) [primefaces-6.2.3.jar:6.2.3] at org.primefaces.expression.SearchExpressionFacade.resolveClientId(SearchExpressionFacade.java:292) [primefaces-6.2.3.jar :6.2.3] 在 org.primefaces.PrimeFaces$Ajax.validateClientId(PrimeFaces.java:290) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces.PrimeFaces$Ajax.update(PrimeFaces.java: 280) [primefaces-6.2.3.jar:6.2.3] 在 de.heimannsystems.jee.incentcontrol.modules.firstview.threatmonitor.ThreatMonitorView.updateThreatList(ThreatMonitorView.java:145) [incentcontrol-module-firstview-1.2.0 -SNAPSHOT.jar:1.2.0-SNAPSHOT] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_121] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt. jar:1.8.0_121] 在 sun.reflect。DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_121] 在 java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_121] 在 javax.el。 ELUtil.invokeMethod(ELUtil.java:308) [jboss-el-api_3.0_spec-1.0.4.Final.jar:1.0.4.Final] 在 javax.el.BeanELResolver.invoke(BeanELResolver.java:537) [jboss -el-api_3.0_spec-1.0.4.Final.jar:1.0.4.Final] 在 javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256) [jboss-el-api_3.0_spec-1.0.4.Final .jar:1.0.4.Final] 在 com.sun.el.parser.AstValue.invoke(AstValue.java:286) [javax.el-impl-3.0.1-b05-jbossorg-1.jar:3.0.1 -b05-jbossorg-1] 在 com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304) [javax.el-impl-3.0.1-b05-jbossorg-1.jar:3.0.1-b05-jbossorg -1] 在 org.jboss.weld.util.el.ForwardingMethodExpression。调用(ForwardingMethodExpression.java:40)[weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50 ) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) [weld-core -impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-impl-2.2.16。 SP1.jar:2015-09-16 08:49] 在 com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.2.12-jbossorg-2.jar:2.2 .12-jbossorg-2] ... 45 更多49] 在 org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 org. jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 com.sun.faces.facelets.el .TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.2.12-jbossorg-2.jar:2.2.12-jbossorg-2] ... 45 更多49] 在 org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 org. jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-impl-2.2.16.SP1.jar:2015-09-16 08:49] 在 com.sun.faces.facelets.el .TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.2.12-jbossorg-2.jar:2.2.12-jbossorg-2] ... 45 更多12-jbossorg-2] ... 45 更多12-jbossorg-2] ... 45 更多

13:07:45,443 严重 [org.omnifaces.exceptionhandler.FullAjaxExceptionHandler](默认任务 1) FullAjaxExceptionHandler:处理 JSF ajax 请求期间发生异常。将显示错误页面“/error.xhtml”。:java.lang.IllegalArgumentException:threatListPanel at javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:651) [jboss-jsf-api_2.2_spec-2.2.12. jar:2.2.12] 在 org.primefaces.util.ComponentTraversalUtils.firstById(ComponentTraversalUtils.java:140) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces.expression.SearchExpressionFacade.resolveComponentById(SearchExpressionFacade.java :526) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces.expression.SearchExpressionFacade.resolveClientId(SearchExpressionFacade.java:338) [primefaces-6.2.3.jar:6.2.3] 在 org.primefaces 。表达。

标签: ajaxjsfprimefacesxhtmlmanaged-bean

解决方案


解决它。
这是两个问题的结合。首先是否可以使用 JSF ajax 更新非 JSF 组件(纯 HTML)? 我将 jsf:id 添加到 Div

第二个来自如何找出 ajax 更新/渲染组件的客户端 ID?找不到从“bar”引用的表达式“foo”的组件

它说要在 HTML 输出中查找实际的客户端 ID

一旦我有了 jsf:id 和实际的客户端 ID,它就可以工作了


推荐阅读