在我当前的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文件中资源的链接仍然指向未更改的硬编码上下文,并导致资源未找到错误。
答案 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。
这样你最终会像
一样.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来替换标准的ResourceHandler。您可以将javax.faces.application.ResourceHandler子类化,处理特定请求并将其他请求委托给基类。
对于给定的示例,自定义资源处理程序应确定上下文并替换绝对路径定义。这样可以在每个请求的基础上实现动态路径解析。