将JS,CSS和图像资源放在JSF应用程序的JAR中是一个好主意吗?



我想问你一个问题,这与我前段时间问的另一个问题有关(不幸的是没有答案:()

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

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

如果我看一下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 生命周期,如果当前页面中的资源数量很重要,这可能是一个性能问题......

问题

  • 您如何看待这种方法?
  • 你将如何做到这一点?几年前我已经使用过weblet,但这个项目似乎从2006年开始维护。网站 URL 返回 404,但版本 0.4 可以在 Maven 全局存储库中找到。
  • 您看到我的问题还有其他解决方案吗?

谢谢。

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


允许生成仅包含所需属性的动态文件(即.CSS或JS)

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


仅允许包含所需的资源(例如,如果页面上的组件不需要CSS文件,我们将不会加载该文件)。

这是通过@ResourceDependency注释来完成的。 例如

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

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

相关内容

  • 没有找到相关文章