我想问你一个问题,这与我前段时间问的另一个问题有关(不幸的是没有答案:()
假设您的项目分为几个 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 的缩小版本,该版本被放置在不同的路径中。