JSF facelets模板包装

时间:2012-02-15 09:07:35

标签: jsf-2 facelets packaging

一如既往,我有点困惑。

这里https://community.jboss.org/wiki/ModularWebAppsWithJSF2我已经了解到,从JSF 2.0开始,将模板捆绑在单独的jar中很容易并且开箱即用。

唯一的问题是:我无法让它发挥作用。我只是在Web应用程序WEB-INF / lib中包含的jar中部署所有类型的“page.xhtml”(META-INF目录,资源目录,root;有和没有faces-config.xml)并请求一些东西比如http://host/demo/faces/page.xhtml或者在模板上做“包含”或“装饰”。我得到一个例外。

这里Java EE6> Packaging JSF facelets (xhtml) and ManagedBeans as JAR我最喜欢的JSF老师解释说使用自定义ResourceResolver来做到这一点。当我调试资源解析时,我毫不怀疑这会起作用,并会试一试。

这是关于力学的问题 - 这两种方法有什么区别?

自动在META-INF /资源中查找哪些资源?

1 个答案:

答案 0 :(得分:20)

Facelets合成(因此,只有普通*.xhtml页面,模板和包含文件)由ExternalContext#getResource()解析,委托给ServletContext#getResource()。这需要一个与Servlet 3.x兼容的容器,因为/WEB-INF/lib/*.jar!/META-INF/resources解析自Servlet 3.0以来是新的。如果您还没有使用Servlet 3.x,或者由于某种原因想要将这些JAR放在不同的位置,那么您需要创建一个自定义ResourceResolver。另请参阅How to create a modular JSF 2.0 application?

Facelets复合组件和静态资源(因此,<cc:xxx>组件和CSS / JS /图像资源将由<h:outputStylesheet><h:outputScript><h:graphicImage>加载faces-config.xml)通过ClassLoader#getResource()从类路径中解析。要将JAR文件包含在JSF的类路径扫描中,您需要在JAR文件的/META-INF文件夹中包含JSF 2.x兼容的@ManagedBean文件。相同的故事适用于@FacesValidator@FacesConverter@FacesComponent/META-INF/web-fragment.xml和其他JSF工件。


在Eclipse中开发时,您可以选择 Web&gt; Web Fragment Project 创建这样一个模块项目。它与普通的 Java项目没什么不同,期望它隐式包含JavaScript facet和目标运行时,自动创建/META-INF文件并与现有的动态Web相关联项目,将自身添加为该项目的部署程序集。

您还可以使用已准备好正确文件夹结构的现有标准 Java项目web-fragment.xml文件夹必须放在Java源文件夹中。 ResourceResolver文件是可选的。您只需手动将Java项目添加到主Web项目属性的 Deployment Assembly 部分。 将其添加为项目的构建路径部分中的另一个项目。

当您(手动)从中构建JAR文件时,您需要确保将目录条目添加到JAR中,否则无法解析Facelets组合。如果您使用Eclipse / Ant / Maven / etc等构建工具进行构建,则还需要考虑这一点。如果这不可控,则自定义{{1}}是最可靠的方法。