【问题标题】:Fix relative paths of script/css while rewriting URLs在重写 URL 时修复脚本/css 的相对路径
【发布时间】:2012-08-05 22:32:12
【问题描述】:

我在 JBoss AS 6.1.0.Final 中使用 JSF2.1 和 RichFaces 4.1。现在,我专注于重写 URL。在尝试了不同的方法后,我决定坚持使用 PrettyFaces,因为它使用起来非常直观(并且在几分钟内就可以使用)。

有一个棘手的问题。到脚本/css 的相对链接搞砸了,因为 URL 发生了变化,并且相对路径以 404 结尾。我可以使用绝对路径,但这将迫使我更改许多页面并在页面的源代码中公开应用程序的结构。

我正在考虑一种临时解决方法:让支持 bean 负责管理这些相关链接的不同级别,但重用 bean 使这成为一件棘手的事情。

我的问题是,在重写 URL 时是否有定义的方法或最佳实践来管理这些相对路径?

编辑

h:outputStylesheet 和 h:outputScript 就像一个魅力。剩下的就是解决 CSS 以相对方式引用图像的一个小问题。采用这种结构:

-------/resources
       |
       ---_img
       |
       ---_css
       |
       ---_js

_css 文件夹中的 CSS 文件引用了位于 _img 文件夹中的图像 image1.png,其相对路径为 ../_img/image1.png。问题是这会以 404 告终,因为它在 /myApp/javax.faces.resource/_img/image1.png 中找不到图像。

在 CSS 中将每个 ../ 更改为 #{request.contextPath}/resources 似乎工作得很好,但我想知道是否有更好的方法来做到这一点。相对路径方法不起作用对我来说似乎很奇怪。

【问题讨论】:

    标签: java jsf-2 url-rewriting prettyfaces


    【解决方案1】:

    首先,我不明白他们到底是如何以及为什么搞砸的。你不是很清楚。您很可能出于某种原因硬编码纯 HTML <script><link>(和 <img>)元素,而不是使用 JSF 提供的 <h:outputScript><h:outputStylesheet>(和 <h:graphicImage>)组件。这些 JSF 组件可以采用相对于 /resources 文件夹的资源名称,并且它们将自动为上下文路径添加前缀,以便它以域相对 URL(带有前导斜杠)而不是请求相对 URL(没有前导斜杠)。

    鉴于以下文件夹结构(/resources 文件夹名称是预定义的;您无法更改其名称):

    WebContent
     |-- resources
     |    |-- css
     |    |    `-- style.css
     |    |-- img
     |    |    `-- logo.png
     |    `-- js
     |         `-- script.js
     |-- page.xhtml
     :
    

    那么您应该可以让 JSF 自动生成正确的<script><link>(和<img>)元素,如下所示:

    <h:head>
        <h:outputStylesheet name="css/style.css" />
        <h:outputScript name="js/script.js" />
    </h:head>
    <h:body>
        <h:graphicImage name="img/logo.png" />
    </h:body>
    

    另见:

    【讨论】:

    • 确实很奇怪,但是当你提到“硬编码”这个词时,我脸色难看。我记得我们的母版页是由设计团队设计为 vanilla html 的,我们必须将其调整为 xhtml 并重新标记其中的许多部分。你猜怎么着,链接和css确实是硬编码的。我会立即更改并评论结果。
    • 妈的,被揍了一两分钟:p
    • 如果由于某种原因不能使用 JSF 组件替换,那么只需确保您在引用 JS/CSS/ 的 HTML 元素中使用域相关 URL(以斜杠开头)图片资源。您可以使用#{request.contextPath} 动态打印上下文路径。例如。 &lt;script src="#{request.contextPath}/resources/js/script.js"&gt;&lt;/script&gt; 等等。但是,为每个 JS/CSS/图像资源重复它是很难看的 :)
    • @BalusC 确实是:D。您的解决方案就像一个魅力!现在我只对 CSS 引用的图像有问题,导致 404。我已经用一些细节更新了我的问题。
    • 使用#{resource} 表达式。另见stackoverflow.com/questions/6925733/…
    【解决方案2】:

    您需要为您的 CSS 文件使用绝对 URL,例如:

    /path/to/style.css
    

    代替:

    ../style.css
    

    如果可以的话,您还希望避免硬编码 url,并使用 JSF2 资源重定位功能:&lt;h:outputStylesheet&gt;&lt;h:outputScript&gt;

    以下是一些可能有帮助的链接:

    http://ocpsoft.org/support/topic/problem-with-prettyfaces-and-primefaces

    【讨论】:

    • 感谢您的回答!顺便说一句,PrettyFaces 做得很好。直观、易于上手且易于使用。继续努力吧! :)
    • 谢谢!我很高兴你喜欢它。我们正在努力让它变得更好(ocpsoft.org/rewrite 作为 4.0 版的核心 :)
    猜你喜欢
    • 2011-12-27
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2011-01-11
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多