实际上,网络上使用“ js”,“ css”,“ img”等常见内容/文件类型作为库名称的所有这些示例都是令人误解的。
现实世界中的例子
首先,让我们看一下现有的JSF实现(例如Mojarra和MyFaces)以及JSF组件库(例如PrimeFaces和OmniFaces)如何使用它。他们中没有人以这种方式使用资源库。他们(通过@ResourceDependency
或UIViewRoot#addComponentResource()
)在后台使用它:
<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />
应该清楚的是,它基本上代表了所有这些资源共同所属的公共库/模块/主题名称。
更容易识别
这样,指定和区分那些资源属于和/或来自何处变得容易得多。想象一下,您碰巧primefaces.css
在自己的Web应用程序中有一个资源,其中您要覆盖/微调PrimeFaces的一些默认CSS;如果PrimeFaces自己没有使用库名primefaces.css
,则不会加载PrimeFaces自己的库名,而是由webapp提供的库名,这会破坏外观。
同样,当您使用custom时ResourceHandler
,如果使用正确,则还可以对来自特定库的资源应用更精细的控制library
。如果所有组件库的所有JS文件都将使用“ js”,那么如何ResourceHandler
区分它是否来自特定组件库呢?示例包括OmniFaces CombinedResourceHandler
和GraphicResourceHandler
; createResource()
在委托给链中的下一个资源处理程序之前,请检查对库进行检查的方法。这样,他们便知道何时创建CombinedResource
或GraphicResource
目的。
值得注意的是RichFaces做错了。它根本不使用任何library
资源,而是在其上自制了另一个资源处理层,因此无法以编程方式标识RichFaces资源。这正是OmniFaces CombinedResourceHander
必须引入基于反射的hack才能使其与RichFaces资源一起正常工作的原因。
您自己的网络应用
您自己的webapp不一定需要资源库。您最好将其省略。
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
或者,如果您真的需要一个,可以给它一个更合理的通用名称,例如“默认”或某些公司名称。
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
或者,当资源特定于某些Facelets主模板时,您也可以为其指定模板的名称,以使彼此之间的关联更加容易。换句话说,它更多是出于自我记录的目的。例如在/WEB-INF/templates/layout.xhtml
模板文件中:
<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />
和/WEB-INF/templates/admin.xhtml
模板文件:
<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
有关真实示例,请查看OmniFaces展示柜源代码。
或者,如果您想在多个Web应用程序上共享相同的资源,并根据与该答案相同的示例为其创建了一个“公共”项目,该项目又作为JAR嵌入在Web应用程序的中/WEB-INF/lib
,则也将其引用为库(您可以自由选择名称; OmniFaces和PrimeFaces等组件库也可以这样工作):
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
库版本控制
另一个主要优点是,您可以在自己的Web应用程序提供的资源上以正确的方式应用资源库版本控制(这不适用于JAR中嵌入的资源)。您可以在库文件夹中创建直接子目录,并在\d+(_\d+)*
模式中使用名称来表示资源库版本。
WebContent
|-- resources
| `-- default
| `-- 1_0
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
使用此标记时:
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
这将生成以下HTML,并将库版本作为v
参数:
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_0" alt="" />
因此,如果您已经编辑/更新了一些资源,那么您要做的就是将版本文件夹复制或重命名为新值。如果您有多个版本文件夹,则JSF ResourceHandler
将根据数字顺序规则自动从最高版本号开始提供资源。
因此,将resources/default/1_0/*
文件夹复制/重命名为resources/default/1_1/*
如下所示:
WebContent
|-- resources
| `-- default
| |-- 1_0
| | :
| |
| `-- 1_1
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
然后,最后一个标记示例将生成以下HTML:
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_1" alt="" />
当第一次请求具有更改的参数的URL时,这将迫使Web浏览器直接从服务器请求资源,而不是从缓存中显示具有相同名称的资源。这样,最终用户在需要检索更新的CSS / JS资源时就不需要进行强制刷新(Ctrl + F5等)。
请注意,JAR文件中包含的资源无法进行库版本控制。您需要自定义ResourceHandler
。另请参见如何对jar中的资源使用JSF版本控制。
也可以看看: