UnmappedResourceHandler 无法将 CSS 中的 URL 转换为 JSF 的有效 URL



设置如下:

  • Web应用的文件夹结构和文件名与UnmappedResourceHandler的javadoc完全相同
  • UnmappedResourceHandler已经在faces-config.xml
  • 中注册
  • /javax.faces.resource/*已经映射到web.xml中的facesServlet

style.css为:

body {
    background: url("image/background.png");
}
body .test{
    background-image: url("#{resource['css:image/background.png']}");
}

然后我请求http://localhost:8080/app/javax.faces.resource/style.css?ln=css,响应是:

body {
    background: url("image/background.png");
}
body .test{
    background-image: url("/app/javax.faces.resource/image/background.png?ln=css");
}

我希望CSS中的所有相对URL都像#{resource}那样被转换为JSF的有效URL,这样我就不必再使用#{resource}来引用CSS中的相对URL了,但是body选择器的background的相对URL仍然保持不变。


更新BalusC的回复:

  1. 如果使用资源库,添加?ln=libraryname到所有CSS图像将工作!

  2. 如果没有使用资源库,<h:outputStylesheet name="css/style.css" />生成<link rel="stylesheet" media="screen" type="text/css" href="/app/javax.faces.resource/css/style.css.xhtml">

    如果我理解正确的话,使用UnmappedResourceHandler和映射web.xml中的/javax.faces.resource/*facesServlet应该导致JSF生成没有xhtml扩展的style.css的链接。

您正在使用css作为资源库,如:

<h:outputStylesheet library="css" name="style.css" />

这是不对的。它只是一个文件夹:

<h:outputStylesheet name="css/style.css" />

这将生成/javax.faces.resource/css/style.css URL而不是/javax.faces.resource/style.css?ln=css。否则你还需要在图像URL中指定它:

background: url("image/background.png?ln=css");

我将更新javadoc以澄清更多。

参见:

    JSF资源库是用来做什么的?应该如何使用它?

最新更新