我可以将EL用于JSF的外部CSS文件吗?
在我当前JSF项目的外部样式表中,有指向外部资源的硬编码链接,如我可以将EL用于JSF的外部CSS文件吗?,css,jsf,el,Css,Jsf,El,在我当前JSF项目的外部样式表中,有指向外部资源的硬编码链接,如 .someId { background-image:url(/context/resources/images/example.jpg); } 在JSFXHTML文档中,我可以使用像${request.contextPath}这样的EL表达式,但是如何将EL处理应用于CSS文件呢 (相关:) 上下文路径的硬编码有一个缺点:在示例中,web应用程序的上下文路径-/context,可以在部署时通过修改web.xml(或者如果we
.someId { background-image:url(/context/resources/images/example.jpg); }
在JSFXHTML文档中,我可以使用像${request.contextPath}这样的EL表达式,但是如何将EL处理应用于CSS文件呢
(相关:)
上下文路径的硬编码有一个缺点:在示例中,web应用程序的上下文路径-
/context
,可以在部署时通过修改web.xml(或者如果web.xml中没有指定上下文,则通过重命名web应用程序存档文件)来更改,但是CSS文件中资源的链接仍然指向未更改的硬编码上下文,并导致资源未找到错误。不,您不能。您有几个选择:
- 硬编码绝对路径(当然是域相对路径)——还不错
- 使用相对路径-如果您有嵌套的URL,如
/view/external/foo/bar.jsf
- 在构建过程中对它们进行预处理,以设置正确的路径
- 使用
(以及客户端和服务器端缓存)设置正确的路径过滤器
(我觉得我遗漏了什么)@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>
.someClass{--此处的动态值--}
在PHP世界中,这是最佳实践,因为它可以避免为样式表调用创建昂贵的PHP进程。我不知道JSP世界的情况如何,但我认为它是相似的。@Bozho:
JSF允许定义ResourceHandler来替换标准的ResourceHandler。您可以将javax.faces.application.ResourceHandler子类化,处理特定请求并将其他请求委托给基类
对于给定的示例,自定义资源处理程序应该确定上下文并替换绝对路径定义。这将在每个请求的基础上启用动态路径解析。我将CSS图像始终放在CSS文件夹的子文件夹中。例如
- /参考资料/css/style.css
- /参考资料/css/images/example.jpg
.someId { background-image:url(images/example.jpg); }
是的,它们是相对于CSS文件本身的URL解析的,而不是相对于主JSF/HTML页面。也许我误解了你的问题,但是如果外部CSS只是指你自己的CSS,而不是内联的,那么在JSF 2.0中,你可以在CSS中使用EL,只要你将它包含在
中。例如,我有一个具有以下结构的项目:
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>
您可以将表达式语言(EL)与
FacesContext
一起使用来解决此问题。我经常使用这种技巧
background-image: url('#{facesContext.externalContext.requestContextPath}/resources/images/background.gif');
这允许您利用JSF根据应用程序输入或更改提供动态内容
这项技术适用于JSF1.2和JSF2.0自定义资源处理程序如何?请参阅今天发布的我的答案。它被插入顶部的某个地方,这让我有点困惑,o_OBalusC,我知道这个评论并没有添加任何有用的反馈,但我必须说出来。你是个天才。@arg20:谢谢:)相关答案顺便说一句:
background-image: url('#{facesContext.externalContext.requestContextPath}/resources/images/background.gif');