我可以将EL用于JSF的外部CSS文件吗?

时间:2011-05-01 08:56:15

标签: css jsf el

在我当前的JSF项目的外部样式表中,有外部资源的硬编码链接,如

.someId { background-image:url(/context/resources/images/example.jpg); }

在JSF xhtml文档中,我可以使用像$ {request.contextPath}这样的EL表达式,但是如何将EL处理应用于CSS文件?

(相关:How can I embed an CSS background image link with JSF?


上下文路径的硬编码有一个缺点:可以通过修改web.xml(或通过重命名Web应用程序归档)在部署时更改Web应用程序中的上下文路径 - 示例中的/context文件,如果在web.xml中没有指定上下文),但是CSS文件中资源的链接仍然指向未更改的硬编码上下文,并导致资源未找到错误。

6 个答案:

答案 0 :(得分:11)

也许我误解了你的问题,但是如果通过外部css你只是意味着你自己的css不是 inline ,那么使用JSF 2.0你可以在你的css中使用EL,只要你包含它<h:outputStylesheet>。例如,我有一个具有这种结构的项目:

war
|__ WEB-INF
|   |__ *standardStuff*
|__ resources
|   |__ css
|   |   |__ style.css
|   |__ images
|       |__ image1.png
|__ xhtml
|   |__ index.xhtml

这显然不是完整的文件列表,但应足以说明问题。然后我在index.xhtml中有这个:

<f:view xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets">
  <h:head/>
  <h:body>
    <h:outputStylesheet library="css" name="style.css" target="head"/>
    <ui:include src="content.xhtml"/>
  </h:body>
</f:view>

在我的CSS中,我有类似的东西:

.someClass {
    background-image: url('#{resource['images/image1.png']}');
}

答案 1 :(得分:8)

我将CSS图像始终放在CSS文件夹的子文件夹中。 E.g。

  • /resources/css/style.css
  • /resources/css/images/example.jpg

这样你最终会像

一样
.someId { background-image:url(images/example.jpg); }

是的,它们是相对于CSS文件本身的URL而不是主JSF / HTML页面解析的。

答案 2 :(得分:5)

您可以使用表达式语言(EL)和FacesContext来解决问题。我经常使用这种技术。

background-image: url('#{facesContext.externalContext.requestContextPath}/resources/images/background.gif');

这使您可以利用JSF根据应用程序输入或更改提供动态内容。

此技术适用于JSF 1.2和JSF 2.0

答案 3 :(得分:3)

@ Bozho的回答几乎涵盖了您的选择。

另一种可能性是继续使用静态样式表,并填写文档头部中可以访问表达式的动态部分:

<head>

<!-- The style sheet contains 99% of the CSS ->
<link rel="stylesheet" href="static.css" type="text/css">

<!-- The remaining 1% is done here -->
<style type="text/css">
 .someClass { --- your dynamic values  here --- }
</style>

</head>

在PHP世界中,这是最佳实践,因为它为样式表调用创建了一个昂贵的PHP进程。我不知道JSP世界中的情况如何,但我认为它类似。

答案 4 :(得分:2)

不,你不能。您有几种选择:

  • 硬编码绝对路径(当然是域相对) - 不是那么糟糕
  • 使用相对路径 - 当您拥有/view/external/foo/bar.jsf
  • 等嵌套网址时可能会出现问题
  • 在构建期间预处理它们以设置正确的路径
  • 使用Filter(以及客户端和服务器端缓存)来设置正确的路径。

(我觉得我错过了什么)

答案 5 :(得分:2)

@Bozho: JSF允许定义ResourceHandler来替换标准的Res​​ourceHandler。您可以将javax.faces.application.ResourceHandler子类化,处理特定请求并将其他请求委托给基类。

对于给定的示例,自定义资源处理程序应确定上下文并替换绝对路径定义。这样可以在每个请求的基础上实现动态路径解析。