<ui:composition>是在之前还是之后?</ui:composition>

时间:2012-05-04 10:56:01

标签: jsf primefaces facelets

我正在使用JSF2 facelets。

我正在尝试使用<ui:composition><ui:insert>标记从一个页面插入一段代码到另一个页面。

我有页面A,其中包含第B页的代码。

<h:form id="formIdPageA"> ...

<h:form id="formIdPageB">

问题似乎是形式ID,因为我收到错误:

System error: Cannot find component with identifier ":formIdPageA:fileListId" in view.

以下是来自页面B的一段代码,它插入到页面A中。可以看到以下ID:

                    <tr>
                        <td colspan="2">
                            <p:selectOneMenu id="locationId" value = "#{PFMultiFileSelectMgmtBean.selectedLocationId}">
                                <p:ajax update=":formIdPageA:fileListId" listener="#{PFMultiFileSelectMgmtBean.LocationChangeEvent}"/>
                                <f:selectItems value="#{PFJobMgmtBean.outputLocationList}"/>                                
                            </p:selectOneMenu>
                        </td>
                        <td>                                
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <p:selectManyCheckbox id="fileListId" value="PFMultiFileSelectMgmtBean.selectedFiles"  layout="pageDirection">  
                                <f:selectItems value="#{PFMultiFileSelectMgmtBean.fileNames}" />  
                            </p:selectManyCheckbox>  
                        </td>
                    </tr>   

这就是我在第A页中插入它的方式:

<p:dialog id="basicDialog" header="Select Files" widgetVar="dlgMultiFileSelect" modal="true" height="500" width="500" resizable="false">
    <ui:insert>  
        <ui:include src="/pageB.xhtml"/>
    </ui:insert>  
</p:dialog>

有谁知道是否可以包含这样的页面? <ui:composition>是在正文标签之前还是在第B页之后?这没关系:

<body>
    <f:view>    
        <h:form id="formIdPageB">
                <ui:composition>...

好的,找到了:

问题是我使用了PrimeFaces组件<p:dialog>并将其放在<h:form>之外和<body>之外的页面A中,如下所示:

   </h:form>
 </f:view>      
</body>
<p:dialog...>        
   <ui:include src="/pageB.xhtml"/>       
</p:dialog>

这似乎是错误的。现在我将<p:dialog>移到了表单中,一切正常。

4 个答案:

答案 0 :(得分:1)

插入和组合是JSF中模板化的工具。使用ui:insert时,可以使用模板在页面中创建可插入(使用ui:define)的插入点。以下是如何以正确的方式使用模板和组合的教程:

http://www.ibm.com/developerworks/java/library/j-jsf2fu2/index.html

如果我理解得很清楚,你需要在页面A和页面B中重用一段代码。所以我会在单独的文件中提取代码并将其包含在第A页和第B页。

如果你想把你的&lt; ui:composition&gt;在&lt; body&gt;内,允许。您可以看到文档示例:

http://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/ui/composition.html

答案 1 :(得分:1)

<ui:composition>围绕您想要包含的部分。这是什么,以及它是否包含或排除<body>,完全取决于您。

答案 2 :(得分:1)

我不确定您使用的是ui:正确插入。插入是一个占位符。你需要给它一个名字。然后使用ui:define将代码放在该占位符中。我认为你想要做的只需要删除ui:insert标签并保留ui:include在第A页。

答案 3 :(得分:0)

问题是我使用PrimeFaces组件并将其放在页面A的外部和外部,如下所示:

    </h:form>
  </f:view>      
</body>
<p:dialog...>        
   <ui:include src="/pageB.xhtml"/>       
</p:dialog>

这似乎是错误的。现在我搬进了表格,一切都很好。