java - 从数据库访问和使用 .jsf 文件

标签 java resources jsf-2 runtime

使我的 Web 应用程序能够使用存储在数据库中的 JSF 文件的最佳方法是什么? 我希望能够动态地(在运行时)创建新的 JSF 页面,无需重新部署应用程序即可使用这些页面。

换句话说:我想将我的 JSF 页面的大部分存储在数据库中,并希望 JSF 使用数据库作为获取 JSF 文件的数据源。

我考虑了很长时间的解决方案并找到了一些可能的方法。但是,我无法实现它们中的任何一个。

  1. 每当必须添加/删除新页面时:操作类路径中的文件(例如删除文件或将文件添加到 .war 文件)
  2. 扩展 web 应用程序的类路径,以便它能够从运行时定义的位置(即/tmp 或直接使用数据库连接)获取文件
  3. 为 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 中的文件。您可以在以下答案中找到完整的代码示例:


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/

相关文章:

java - 为什么我没有在另一个 Activity 中获得传递值?

c# - 了解 Visual Studio 中的资源

java - Maven 资源过滤器不起作用

java - JSF ConvertDateTime 呈现前一天

validation - isValidationFailed 默认值

jsf - 如何在 JSF 中实现登录过滤器?

Java - 获取 JSONObject 时出现 NullPointerException

java - BroadcastReceiver 对象只使用初始值,为什么?

java - 如何以编程方式使用 ImageButtons 填充网格?

c# - 访问窗口资源中的命名元素