【问题标题】:Is it possible to change the /resources folder name which is used by h:outputStylesheet and h:outputScript是否可以更改 h:outputStylesheet 和 h:outputScript 使用的 /resources 文件夹名称
【发布时间】:2012-11-20 05:41:38
【问题描述】:

h:outputStylesheeth:outputScript中引用css文件和js文件时是否需要给文件夹名“resources”?

因为当我将文件夹名称命名为“assets”而不是“resources”时,这些文件不会被加载。

这就是我使用这些标签的方式:

<h:head>
    <h:outputStylesheet name="css/styles.css"/>
    <h:outputScript name="js/site.js"/>
</h:head>

这是我的项目结构:

在截图中你可以看到文件夹名称是资源。然后它正在工作。如何指定不同的名称?

【问题讨论】:

    标签: javascript css jsf-2 resources location


    【解决方案1】:

    文件夹名称根据JSF specification 的第 2.6.1.1 和 2.6.1.2 章固定。

    2.6.1.1 将资源打包到 Web 应用程序根目录中

    默认实现必须支持在 web 应用根目录中打包资源 路径下

    resources/<resourceIdentifier>
    

    相对于网络应用根目录。必须使用 ExternalContext 上的 getResource*() 方法访问打包到 Web 应用根目录中的资源。

    2.6.1.2 将资源打包到类路径中

    对于默认实现,打包在类路径中的资源必须位于 JAR 条目名称:

    META-INF/resources/<resourceIdentifier>
    

    打包到classpath中的资源必须通过调用当前ThreadgetContextClassLoader()方法得到的ClassLoadergetResource*()方法访问。

    在这两种情况下都提到了“必须”。它没有提及任何有关更改这些路径的可能配置选项的内容。这适用于 JSF 2.0 和 JSF 2.1。

    然而,在即将到来的 JSF 2.2 中,根据 JSF spec issue 996 可以通过新的 javax.faces.WEBAPP_RESOURCES_DIRECTORY 上下文参数更改路径,该参数将相对于 webcontent 根的路径作为参数值:

    <context-param>
        <param-name>javax.faces.WEBAPP_RESOURCES_DIRECTORY</param-name>
        <param-value>WEB-INF/resources</param-value> 
    </context-param>
    

    此示例会将/resources 文件夹移动到/WEB-INF,从而确保更高的安全性(即现在不再可能独立于FacesServlet 访问这些资源)。

    您的特殊情况中,您希望在升级到 JSF 2.2 时使用以下设置:

    <context-param>
        <param-name>javax.faces.WEBAPP_RESOURCES_DIRECTORY</param-name>
        <param-value>assets</param-value> 
    </context-param>
    

    请注意,这仅涵盖第 2.6.1.1 章中指定的 webapp 自己的资源,而不是第 2.6.1.2 章中指定的 JAR 资源。 JAR 资源的路径仍应为META-INF/resources,因为这是由 Servlet API 规范而非 JSF 规范控制的。即通过ServletContext#getResource() 方法获得的掩护,不受JSF 控制。

    【讨论】:

    • 补充一下,我正在使用 Mojarra 2.2.1 和 Spring webflow 2.4.0.M1 并且参数值必须以正斜杠开头才能正常工作。所以/WEB-INF/resources。我猜这是 Webflow 的问题。
    • @annihilate:这是 javadoc 中的一个问题。根据源代码,它确实必须以/ 开头。另见java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-996的最后评论
    【解决方案2】:

    这是JSF 2.0中Resource Handler的实现方式,默认看下面两条路径:

    1) Web 应用程序根目录下的 /resources。

    2) /META-INF/resources 打包在类路径上的外部 JAR 中。

    如果您想使用不同的名称,如 Alexandre 所述,请使用 &lt;script&gt;&lt;style&gt; 标签或编写您自己的资源处理程序。

    更多信息:

    【讨论】:

      【解决方案3】:

      你不能指定其他目录而不是 resources 除非 yiu 正在使用

      <style></style>
      

      OmniFaces CombinedResourceHandler

      【讨论】:

      • 谢谢。你能解释一下为什么我们需要它作为资源吗?
      猜你喜欢
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2018-10-12
      • 2016-08-28
      • 2019-06-28
      相关资源
      最近更新 更多