java - 为 JSF 应用程序将 JS、CSS 和图像资源放在 JAR 中是个好主意吗?

标签 java jsf resources embedded-resource

我想问你一个问题,与another question有关我前段时间问过(不幸的是没有回答 :( )

假设您的项目分为多个网络应用程序。您还有许多共享资源(JS、CSS、图像)。 这个想法是为了避免每个网络应用程序中的重复,因为您将被迫在所有网络应用程序之间同步您的更改。

因此,将这些资源放在一个地方似乎更好。

如果我看一下 Richfaces 项目,它们的所有资源都由 JSF 管理。 例如, <rich:calendar> 组件显示一个小图标。 如果我们查看此图像的 HTML 代码,我们会看到 src属性指的是 jsf链接,不是 .png直接:

<img src="/richfaces-demo/a4j/g/3_3_3.Finalorg.richfaces.renderkit.html.iconimages.CalendarIcon/DATB/eAH7cW0fw6znAA8XBA4_.jsf"
    style="vertical-align: middle" id="j_id354:j_id355PopupButton" class="rich-calendar-button " alt="">

我看到了这种方法的以下优点:

  • 将资源包含在经典库中(即在 JAR 中),这简化了在 Eclipse 上的部署;
  • 允许生成动态文件(即只包含所需属性的 CSS 或 JS);
  • 只允许包含必需的资源(例如,如果页面上的组件不需要,我们将不会加载 CSS 文件)。

关于我的申请,我只需要第一点,但这对我来说非常重要(参见我关于 SO 的其他相关问题)。

此解决方案的主要缺点是浏览器将无法缓存资源,因为它们被视为 JSF 请求。此外,这些请求中的每一个都必须经历整个 JSF 生命周期,如果当前页面中的资源数量很重要,这可能会成为性能问题...

问题

谢谢。

最佳答案

是的,将共享资源放在一个单独的项目中绝对是个好主意,该项目将作为 JAR 包含在主要 Web 应用程序中。然而,我们使用一个简单的 @WebServlet为此,它直接从类路径提供静态资源,以及缓存和 gzip 支持。我们不将这项工作委托(delegate)给 JSF,我们只是利用 JSF 资源管理,它反过来完全透明地通过 URL 调用 servlet。


Allow to generate dynamic file (i.e. CSS or JS that only contain the required properties)

这也可以通过使用特定的 URL,然后将单独资源的文件名作为查询字符串传递。然后,静态资源 servlet 将执行将多个资源读取到单个响应中的讨厌工作。


Allow the inclusion of only the required resources (for ex. we will not load a CSS file if it is not required by a component on the page).

这将由 @ResourceDependency 完成注解。例如

@ResourceDependency(library="css", name="specific.css")
public class CustomComponentWithCSS extends UIComponentBase {
    // ...
}

我们使用这个 FileServlet 的修改版本它被更改为从类路径而不是从本地磁盘文件系统获取资源。此外,范围支持被移除(因为 RandomAccessFile 不能直接操作类路径资源)。此外,我们还添加了检查当前阶段是否处于开发阶段,如果不是,则提供 CSS/JS 的缩小版本,并将其放在不同的路径中。

关于java - 为 JSF 应用程序将 JS、CSS 和图像资源放在 JAR 中是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5962538/

相关文章:

Java:按顺序比较三个不同的字段。像一个 SQL 数据库

java - Spring RESTful API 获取客户端信息

java - 在 Java/Gradle 环境中访问资源

python - 对象与字典 : how to organise a data tree?

java - 当按下 JButton 时,JPanel 会更改 JFrame 内的形状/位置。为什么?

java - 无法创建 Java 虚拟机,它表示不支持认可

java - 检索 jsf/primefaces 支持 bean 中的 url 路径

jsf - 如何在Tomcat上安装和使用CDI?

java - 在 Hibernate/JSF 应用程序中从 MySQL 数据库中检索 Blob

Laravel,具有自定义策略方法的自定义 Controller 方法?