-1

我正在使用 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>并将其放置在页面 A outside<h:form>和 outside<body>中,如下所示:

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

这似乎是错误的。现在我搬进了<p:dialog>表格里面,一切都很好。

4

4 回答 4

1

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

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

如果我理解得很好,您需要在页面 A 和页面 B 中重用代码块。所以我会将代码提取到单独的文件中并将其包含到页面 A 和页面 B 中。

不过,如果您想将 <ui:composition> 放在 <body> 中,则可以。您可以查看文档示例:

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

于 2012-05-04T11:31:47.610 回答
1

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

于 2012-05-04T12:39:14.897 回答
1

我不确定您是否正确使用了 ui:insert。插入是一个占位符。你需要给它一个名字。然后,您使用 ui:define 将代码放入该占位符中。我认为对于您要执行的操作,您只需要删除 ui:insert 标记并将 ui:include 保留在页面 A 中。

于 2012-05-04T12:55:57.290 回答
0

问题是我使用了 PrimeFaces 组件并将其放置在页面 A outside 和 outside 中,如下所示:

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

这似乎是错误的。现在我移动到表格里面,一切都很好。

于 2012-11-30T14:24:31.353 回答