java - JSF2如何从不同的页面更新不同的组件

标签 java jsf primefaces include

让我们从我的问题开始:

我有两个页面:主要页面和专业页面。

两者都有相同的模板:<ui:composition template="/common/decorators/template.xhtml">

模板.xhtml

.
.
.   
<app:metaHeader />
</h:head>
<h:body>
<app:status/>
<ui:debug hotkey="d" rendered="#{initParam['facelets.DEVELOPMENT']}" />
<div id="geral">
    <div id="header">
        <app:header />
    </div>
    <p:messages id="messages" showDetail="false" autoUpdate="true" closable="true" />   

    <ui:insert name="body" />
</div>
</h:body>
</html>

还有 <app:header />是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:acegijsf="http://sourceforge.net/projects/jsf-comp/acegijsf"
xmlns:app="http://cni.org.br/tags"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:p="http://primefaces.org/ui" xml:lang="pt" lang="pt">
<div id="header">

    <div class="content">
        <h:form>
            <div>
                <p:outputPanel>
                    <label>You are in:</label>
                    <h:selectOneMenu id="cities" value="#{bean.selectedCity}"
                        converter="omnifaces.SelectItemsConverter">
                        <f:selectItems id="selectedCity" value="#{bean.cityList}"
                            var="city" itemLabel="#{city.name}" itemValue="#{city}" />
                        <p:ajax event="change" listener="#{bean.citySession}"
                            update="?????????" />
                    </h:selectOneMenu>
                </p:outputPanel>
            </div>

        </h:form>
    </div>
</div>

因此,当我在标题中选择一个城市时,我需要更新整个 main.xhtml 页面,但只需要更新 professional.xhtml 中的几个组件。

我试过用

<p:ajax event="change" listener="#{bean.citySession}" upate=":componentsIwant" />

<p:ajax event="change" listener="#{bean.citySession}" upate=":professionForm:componentsIwant" />

<p:ajax event="change" listener="#{bean.citySession}" upate=":general:professionForm:componentsIwant" />

但 componentsIwant 在 main.xhtml 上不存在(我选择我将详细说明的职业的页面)所以我得到:

找不到从“j_id18836674_3d6516fd:cities”引用的表达式“:componentsIwant”的组件。

有办法解决吗?

附言我无法更改模板,因为这是公司的标准。

最佳答案

我看到两种解决问题的方法:

  1. 表达语言

    在您的 <p:ajax />更新 属性中使用 EL ,比如:

    update="#{someBean.someCondition ? ':formId:componentId' : ''}"
    

    update="#{someBean.componentId}"
    
  2. <ui:param />

    通过参数传递组件id:

    <ui:composition template="/template.xhtml">
        <ui:param name="componentId" value=":formId:componentId" />
        ...
    </ui:composition>
    

    并将其用作:

    update="#{componentId}"
    

关于java - JSF2如何从不同的页面更新不同的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21889620/

相关文章:

java - App Engine - 如何保存 Blob?

java - 如何在JPA Spring boot中区分?

java - RichFaces 和 JSF : Where does the fileUpload component upload files?

css - 使用 colspan 时组件不在预期的行上

java - Primefaces 树 : don't remove the node after drag and drop

java - 在 Swing Action 事件中实现 CTRL_MASK

java - 从 .docx 转换为 pdf 时图像显示效果不佳

css - 按钮(引导按钮)的颜色在 netbeans 中没有改变?

jsf - javax.faces.view.facelets.FaceletException : Error Parsing/template. xhtml : The entity "nbsp" was referenced, 但未声明

jsf - 从 Primeface 的 p :fileUpload in same form without refresh 显示 UploadedFile 内容