【发布时间】:2014-05-16 23:04:12
【问题描述】:
我无法正确指定 JSF 中资源加载的顺序,尤其是在使用 primefaces 时。我有许多需要包含的样式表,所有这些都应该在 primefaces 资源之后加载。
我有这个:
<h:outputStylesheet library="mw.static" name="css/prime.css"/>
<h:outputStylesheet library="mw.static" name="css/main.css"/>
HTML中的结果如下:
<link href="/static/css/prime.css?rv=1396621461" rel="stylesheet" type="text/css"></link>
<link href="/static/css/main.css?rv=1396621461" rel="stylesheet" type="text/css"></link>
<link href="/javax.faces.resource/primefaces.css.xhtml?ln=primefaces&rv=1396621461" rel="stylesheet" type="text/css"></link>
<script src="/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&rv=1396621461" type="text/javascript"></script>
<script src="/javax.faces.resource/primefaces.js.xhtml?ln=primefaces&rv=1396621461" type="text/javascript"></script>
<script src="/javax.faces.resource/jquery/jquery-plugins.js.xhtml?ln=primefaces&rv=1396621461" type="text/javascript"></script>
<link href="/javax.faces.resource/charts/charts.css.xhtml?ln=primefaces&rv=1396621461" rel="stylesheet" type="text/css"></link>
<script src="/javax.faces.resource/charts/charts.js.xhtml?ln=primefaces&rv=1396621461" type="text/javascript"></script>
很明显,我自己的样式表的顺序受到尊重,因为 prime.css 包含在 main.css 之前。但是,我需要在 primefaces css 文件之后。
一般来说,HeadRendered 最好先编写 primefaces css 文件,然后是我的 css 文件,然后是 primefaces js,然后是我的附加脚本。这将符合 google 的 pagespeed 建议并修复我的 css 依赖问题。
这里最明显的做法是使用 facet last 方法,将其放入主体中:
<f:facet name="last">
<h:outputStylesheet library="mw.static" name="css/prime.css"/>
<h:outputStylesheet library="mw.static" name="css/main.css"/>
<!--[if lte IE 8]>
<link rel="stylesheet" href="${path.styleSheet}-ie.css" type="text/css" />
<![endif]-->
<ui:insert name="css"/>
</f:facet>
然而,虽然 prime.css 和 main.css 现在确实位于 primefaces 资源后面,但我的 ui:insert 标记(插入一些我必须放入页面本身的 css)现在与 ie 一起被跳过- 特定的样式表。所以,这里也没有解决办法。
我很好奇你们中是否有人设法解决了这个问题。我已经完成了 primefaces 的 HeadRenderer 实现,但我无法找到一种简单的方法来让它工作(尤其是在 css 文件的顺序需要保持不变的情况下)。
【问题讨论】:
标签: css jsf jsf-2 primefaces