一如既往,我有点困惑。
这里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 /资源中查找哪些资源?
答案 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}}是最可靠的方法。