是否有可能把JSF2 Facelets文件与普通的内容为JAR从内部如其他Web应用程序中使用<ui:composition template>,<ui:include src>,<cc:implementation>等?如果是,我怎样才能实现这一目标?是否需要一些额外的配置?
一如既往,我有点困惑.
在这里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>将JSF facelets(xhtml)和ManagedBeans打包为JAR,我最喜欢的JSF老师解释了使用自定义ResourceResolver来做到这一点.当我调试资源解析我毫不怀疑这将工作,并将尝试.
这是关于力学的问题 - 这两种方法有什么区别?
究竟是在META-INF /资源中自动查找哪些资源?
我们目前正在分析新版Java EE应用程序的技术要求.这是Java EE 6,但转到7是一个选项.到目前为止,这是一个单一的应用程序,一个EAR,提供定义明确的功能.但是,需要能够基于实现项目和/或客户以非常特定的方式定义某些功能.
例如,某些客户将具有非常特定的安全约束.可以显示框架处理的消息列表.对于一个客户,可以让用户看到所有内容,但另一个客户希望仅根据用户的组显示某些类型的消息.这是一个以特定于上下文的方式定义实现,调整核心功能的示例.另一个可能的要求是一些客户希望扩展给定的功能,增加新的可能性.这是可扩展的部分.
因此,有必要建立一个定义通用功能但具有可插拔部分的架构,以及扩展的可能性.在某些方面,我粗略地了解了如何处理这个问题.这个问题有一个完美适用于表示层的答案,我们将在JSF 2中做:如何创建模块化JSF 2.0应用程序?
我不太确定业务逻辑层,安全性等.我最初的想法是定义接口(几个外观)并在运行时或部署时找到实现.与服务提供商机制大致相同.可以提供默认实现,可以定义自定义实现.这确实感觉像是一种Java SE解决方案,我想知道我是否只是应用那些我熟悉的概念,如果没有更好的EE.我认为@Alternative注释有这样的目的.
另一种可能性是使用拦截器和装饰器.我不确定拦截器在日志记录,审计和其他不涉及核心业务逻辑的事情之外的用途有多大.装饰器似乎适合允许使用自定义功能扩展实现,也可能是可插拔部分.
有人可以提供一些见解,了解哪种解决方案最适合这一挑战的哪一部分?我应该将这些方法结合到问题域的各个部分吗?我有没有看到的可能性?
一个重要的要求:我们希望能够将特定于客户/项目的代码分开.我们不希望在每个实现的版本控制下拥有完整版本的应用程序,因为这将成为快速维护的噩梦.理想情况下,也没有必要将其构建为单片EAR,但能够将可插入部件添加到某些lib文件夹或单独部署它们.
我能够成功地使用我的应用程序中的模板:
<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我还可以移动模板/META-INF/templates/mytemplate.xhtml一的JAR和得到这个工作:
<ui:decorate template="/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我实际上想把这个文件放到文件系统(或数据库)上.我怎样才能做到这一点?我发现很多相关的东西com.sun.facelets.impl.DefaultResourceResolver,但我认为这实际上与覆盖模板的服务有关.它不是尝试解析URL,它只是试图以某种方式在类路径上获取文件.
我有一个公共共享库(即在 Websphere 应用程序服务器中设置为共享库)。
该 jar 的文件夹结构是:
UtilityJAR
----src
-com
-test
-TestClass.java
---- META-INF
-resources
-template.xhtml
-css
-style.css
Run Code Online (Sandbox Code Playgroud)
在我的 web 项目中,我有一个名为 User.xhtml 的模板客户端文件,它使用来自上述共享库的模板文件
ui:composition template="/template.xhtml"
Run Code Online (Sandbox Code Playgroud)
当我在 Web 应用程序的 WEB-INF/lib 文件夹中有上述 jar 文件时,该应用程序可以正常工作,没有任何问题(可以识别 template.xhtml)。当我从这个应用程序的 Lib 文件夹中删除 jar 并将它作为共享库放在 Websphere 中时(因为我需要来自 4 个以上应用程序的这个 jar 文件,我不想在所有 4 个应用程序中复制这个 jar),我收到以下错误消息。
[9/24/14 14:09:17:936 EDT] 00000113 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: Uncaught service() exception root cause Faces Servlet: java.io.FileNotFoundException: /template.xhtml Not Found in ExternalContext as a Resource
Run Code Online (Sandbox Code Playgroud)
Utility jar 中有 faces-config 并且有 @ManagedBean 注释,当 jar 位于应用程序的 WEB-INF/lib …