使我的 Web 应用程序能够使用存储在数据库中的 JSF 文件的最佳方法是什么? 我希望能够动态地(在运行时)创建新的 JSF 页面,无需重新部署应用程序即可使用这些页面。
换句话说:我想将我的 JSF 页面的大部分存储在数据库中,并希望 JSF 使用数据库作为获取 JSF 文件的数据源。
我考虑了很长时间的解决方案并找到了一些可能的方法。但是,我无法实现它们中的任何一个。
- 每当必须添加/删除新页面时:操作类路径中的文件(例如删除文件或将文件添加到 .war 文件)
- 扩展 web 应用程序的类路径,以便它能够从运行时定义的位置(即/tmp 或直接使用数据库连接)获取文件
- 为 JSF 提供一种以另一种方式查找资源的方法(这似乎不可能?)
我的环境:
- Java SE 6
- Jetty 作为 servlet 容器
- Mojarra 作为 jsf 实现
现在,我的问题:
是否有人可以让 JSF 在默认类路径以外的位置(最好是数据库)查找页面?
非常感谢任何回复!
最佳答案
1: Whenever a new page has to be added/removed: manipulate the files in the classpath (e.g. remove or add a file to the .war file)
如果扩大WAR的话,这肯定是可以的。我不确定 Jetty,但它适用于 Tomcat 7 和 Glassfish 3 上的 Mojarra 2.x。只需将文件写入扩展的 WAR 文件夹,通常的 Java IO 方式就足够了。
File file = new File(servletContext.getRealPath("/foo.xhtml"));
if (!file.exists()) {
OutputStream output = new FileOutputStream(file);
try {
output.write(bytes); // Can be bytes from DB.
} finally {
output.close();
}
}
这需要在 FacesServlet
启动之前 执行。Filter
是一个完美的地方。另请参阅此相关答案:
2: Extending the classpath of the webapplication so it will be able to get files from an at runtime defined location (i.e. /tmp or directly using a database connection)
您可以将 Facelets 文件打包到 JAR 文件中并将其放入类路径中,并提供一个 Facelets ResourceResolver
当在 WAR 中找不到匹配项时,它会提供 JAR 中的文件。您可以在以下答案中找到完整的代码示例:
- > how to share a jsf error page between multiple wars
- > How to create a modular JSF 2.0 application?
3: Provide JSF with a way to find resources another way ( this doesn't seem possible? )
您在自定义 ResourceResolver
中有足够的发挥空间。
关于java - 从数据库访问和使用 .jsf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6202217/