如何使用JSF 2.0 Facelets在XHTML中包含另一个XHTML?
在XHTML页面中包含另一个XHTML页面的最正确的方法是什么? 我一直在尝试不同的方式,没有一个在工作。
<ui:include>
最基本的方式是<ui:include>
。 包含的内容必须放在<ui:composition>
里面。
主页面/page.xhtml
启动示例:
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <title>Include demo</title> </h:head> <h:body> <h1>Master page</h1> <p>Master page blah blah lorem ipsum</p> <ui:include src="/WEB-INF/include.xhtml" /> </h:body> </html>
包含页面/WEB-INF/include.xhtml
(是的,这是整个文件, <ui:composition>
之外的任何标签是不必要的,因为它们被Facelets忽略):
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h2>Include page</h2> <p>Include page blah blah lorem ipsum</p> </ui:composition>
这需要通过/page.xhtml
打开。 请注意,您不需要在include文件中重复<html>
, <h:head>
和<h:body>
,否则将导致HTML无效 。
您可以在<ui:include src>
使用dynamicELexpression式。 另请参见如何通过导航菜单ajax刷新dynamic包含内容? (JSF SPA) 。
<ui:define>
/ <ui:insert>
包含更高级的方式是模板 。 这基本上包括其他方面。 主模板页面应该使用<ui:insert>
来声明插入已定义模板内容的位置。 使用主模板页面的模板客户端页面应该使用<ui:define>
来定义要插入的模板内容。
主模板页面/WEB-INF/template.xhtml
(作为devise提示:页眉,菜单和页脚甚至可以是<ui:include>
文件):
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <title><ui:insert name="title">Default title</ui:insert></title> </h:head> <h:body> <div id="header">Header</div> <div id="menu">Menu</div> <div id="content"><ui:insert name="content">Default content</ui:insert></div> <div id="footer">Footer</div> </h:body> </html>
模板客户端页面/page.xhtml
(注意template
属性;也在这里,这是整个文件):
<ui:composition template="/WEB-INF/template.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <ui:define name="title"> New page title here </ui:define> <ui:define name="content"> <h1>New content here</h1> <p>Blah blah</p> </ui:define> </ui:composition>
这需要通过/page.xhtml
打开。 如果没有<ui:define>
,则会显示<ui:insert>
的默认内容(如果有的话)。
<ui:param>
您可以通过<ui:param>
将parameter passing给<ui:include>
或<ui:composition template>
<ui:param>
。
<ui:include ...> <ui:param name="foo" value="#{bean.foo}" /> </ui:include>
<ui:composition template="..."> <ui:param name="foo" value="#{bean.foo}" /> ... </ui:composition >
在包含/模板文件中,它将以#{foo}
。 如果您需要将“许多”parameter passing给<ui:include>
,则最好考虑将包含文件注册为<my:tagname foo="#{bean.foo}">
文件,以便您最终可以像这样使用<my:tagname foo="#{bean.foo}">
。 另请参见何时使用<ui:include>,标记文件,复合组件和/或自定义组件?
你甚至可以通过<ui:param>
传递整个bean,方法和参数。 另请参见JSF 2:如何将包含要调用的参数的操作传递给Facelets子视图(使用ui:include和ui:param)?
devise提示
只需input/猜测其URL即可公开访问的文件需要放在/WEB-INF
文件夹中,就像上面例子中的包含文件和模板文件一样。 另请参阅我需要将哪些XHTML文件放在/ WEB-INF中,哪些不是?
在<ui:composition>
和<ui:define>
之外不需要任何标记(HTML代码)。 你可以放任何,但Facelets会忽略它们。 把标记放在那里只对网页devise师有用。 另请参见是否有一种方法可以在不构build整个项目的情况下运行JSF页面?
HTML5 doctype是目前推荐的文档types,“尽pipe”它是一个XHTML文件。 您应该将XHTML看作一种允许您使用基于XML的工具生成HTML输出的语言。 另请参见是否可以使用JSF + Facelets与HTML 4/5? 和JavaServer Faces 2.2和HTML5的支持,为什么仍然使用XHTML 。
CSS / JS /图像文件可以被包含为dynamic可重定位/本地化/版本化的资源。 另请参见如何引用Facelets模板中的CSS / JS /图像资源?
您可以将Facelets文件放入可重用的JAR文件中。 另请参见具有共享代码的多个JSF项目的结构 。
有关高级Facelets模板的真实示例,请查看Java EE Kickoff App源代码和OmniFaces展示网站源代码的src/main/webapp
文件夹。
包含页面:
<!-- opening and closing tags of included page --> <ui:composition ...> </ui:composition>
包括页面:
<!--the inclusion line in the including page with the content--> <ui:include src="yourFile.xhtml"/>
- 你用
ui:composition
开始你的包含的xhtml文件ui:composition
如上图所示。 - 如上所示,您可以在包含xhtml文件中使用
ui:include
该文件。