Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以将EL用于JSF的外部CSS文件吗?_Css_Jsf_El - Fatal编程技术网

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

我可以将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

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

.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');