gpt4 book ai didi

jsf - 如何使用 JSF 2.0 Facelets 在 XHTML 中包含另一个 XHTML?

转载 作者:行者123 更新时间:2023-12-03 04:08:51 25 4
gpt4 key购买 nike

在 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 打开。请注意,您不需要重复 <html> , <h:head><h:body>包含文件内,否则会导致 invalid HTML .

您可以在 <ui:include src> 中使用动态 EL 表达式。另请参阅How to ajax-refresh dynamic include content by navigation menu? (JSF SPA) .

<小时/>

<ui:define>/<ui:insert>

更高级的包含方式是模板化。这基本上包括相反的情况。主模板页面应使用 <ui:insert> 声明插入已定义模板内容的位置。使用主模板页面的模板客户端页面应使用 <ui:define> 定义要插入的模板内容。

主模板页面/WEB-INF/template.xhtml (作为设计提示:页眉、菜单和页脚甚至可以是 <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: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} 提供。 。如果您需要将“许多”参数传递给 <ui:include> ,那么你最好考虑将包含文件注册为标记文件,这样你最终就可以像这样使用它 <my:tagname foo="#{bean.foo}"> 。另请参阅When to use <ui:include>, tag files, composite components and/or custom components?

您甚至可以通过<ui:param>传递整个bean、方法和参数。另请参阅JSF 2: how to pass an action including an argument to be invoked to a Facelets sub view (using ui:include and ui:param)?

<小时/>

设计提示

不应该通过输入/猜测其 URL 来公开访问的文件需要放置在 /WEB-INF 中文件夹,如上面示例中的包含文件和模板文件。另请参阅Which XHTML files do I need to put in /WEB-INF and which not?

<ui:composition> 之外不需要有任何标记(HTML 代码)和<ui:define> 。您可以放置​​任何内容,但它们将被 Facelets忽略。将标记放在那里只对网页设计师有用。另请参阅Is there a way to run a JSF page without building the whole project?

HTML5 文档类型是目前推荐的文档类型,“尽管”它是一个 XHTML 文件。您应该将 XHTML 视为一种允许您使用基于 XML 的工具生成 HTML 输出的语言。另请参阅Is it possible to use JSF+Facelets with HTML 4/5?JavaServer Faces 2.2 and HTML5 support, why is XHTML still being used .

CSS/JS/图像文件可以作为动态可重定位/本地化/版本化资源包含在内。另请参阅How to reference CSS / JS / image resource in Facelets template?

您可以将 Facelets 文件放入可重用的 JAR 文件中。另请参阅Structure for multiple JSF projects with shared code .

有关高级 Facelets 模板的真实示例,请查看 src/main/webapp Java EE Kickoff App source code的文件夹和 OmniFaces showcase site source code .

关于jsf - 如何使用 JSF 2.0 Facelets 在 XHTML 中包含另一个 XHTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4792862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com