How to include common content into multiple level template page

安稳与你 提交于 2019-12-30 10:33:05

问题


I am trying include a common page into a template but all I get is a blank page without error.

common.xhtml actually has the content that indicate in the template.xhtml. It seems the template.xhtml doesn't recognize the two level include.

template.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" 
 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:s="http://jboss.com/products/seam/taglib"
 xmlns:c="http://java.sun.com/jstl/core"
 xmlns:ub="http://jboss.com/products/seam/ub-taglib"
 xmlns:rich="http://richfaces.ajax4jsf.org/rich">

<head>
  <ui:insert name="css" />  
  <ui:insert name="header" />
</head>

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

custom.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    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:rich="http://richfaces.ajax4jsf.org/rich"
    xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
    xmlns:c="http://java.sun.com/jstl/core"
    template="template.xhtml">

    <ui:define name="css">
        <link rel="stylesheet" type="text/css" href="/custom.css/>
    </ui:define>

    <ui:include src="common.xhtml" />

</ui:composition>

common.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    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:rich="http://richfaces.ajax4jsf.org/rich"
    xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
    xmlns:c="http://java.sun.com/jstl/core"
    template="template.xhtml">


    <ui:define name="header">
        <h1>header</h1>
    </ui:define>
    <ui:define name="body">
        <table><tr><td>Table</td></tr></table>
    </ui:define>    
</ui:composition>

回答1:


This indeed won't work. The <ui:define> is supposed to be used in a template client (i.e. a page with <ui:composition template="...">), not in an include file (i.e. a page with <ui:composition> without template). You can however just "extend" from existing master templates.

Remove from custom.xhtml:

<ui:include src="common.xhtml" />

Change in common.xhtml

template="custom.xhtml"

And open common.xhtml instead of custom.xhtml in browser.

See also:

  • How to include another XHTML in XHTML using JSF 2.0 Facelets?

Unrelated to the concrete problem, to prevent the enduser form being able to open custom.xhtml or template.xhtml directly in browser, it's recommended to move them into the /WEB-INF folder. Further, are you aware of the <h:head> and <h:outputStylesheet> components? I suggest to make use of them. Also, having a <h1> to ultimately end up in <head> makes no sense. Perhaps you meant the <ui:insert name="header"> to be inside <body>? Further, you could easily put that <h1> in the template so that you don't need to repeat them in every template client.

/WEB-INF/templates/template.xhtml

<html ...>
    <h:head>
    </h:head>
    <h:body>
        <ui:insert name="header" />
        <ui:insert name="body" />
    </body>
</html>

/WEB-INF/templates/custom.xhtml (CSS file is placed in /resources folder)

<ui:composition ... template="/WEB-INF/templates/template.xhtml">
    <ui:define name="header">
        <h1><ui:insert name="custom-header" /></h1>
    </ui:define>
    <ui:define name="body">
        <h:outputStylesheet name="custom.css" target="head" />
        <ui:insert name="custom-body" />
    </ui:define>
</ui:composition>

/page.xhtml

<ui:composition ... template="/WEB-INF/templates/custom.xhtml">
    <ui:define name="custom-header">
        header
    </ui:define>
    <ui:define name="custom-body">
         <table><tr><td>Table</td></tr></table>
    </ui:define>
</ui:composition>

See also:

  • Which XHTML files do I need to put in /WEB-INF and which not?
  • How to reference CSS / JS / image resource in Facelets template?


来源:https://stackoverflow.com/questions/16156817/how-to-include-common-content-into-multiple-level-template-page

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!