我需要向graphicImage传递一个查询参数,以防止IE使用旧的缓存图像。
我在下面尝试并得到这个错误:文件未找到:/RES_NOT_FOUND
<h:graphicImage library="default" name="img/MSM_HeaderSplash.png?v=1.1"
alt=" " width="487" height="68" />
下面的可以工作,但是我真的不想硬编码资源路径:
<h:graphicImage value="resources/default/1_0/img/MSM_HeaderSplash.png?v=1.1"
alt=" " width="487" height="68" />
你可以试试这个
最简单的方法是将文件夹添加为您正在使用的servlet容器的"虚拟上下文"。不清楚你用的是哪一个。在Tomcat中,只需在server.xml 中添加一个新文件<Context docBase="/path/to/images" path="/images" />
,在Glassfish中,这是一个添加一个alternatedoroot到Glassfish -web.xml
的问题。<property name="alternatedocroot_1" value="from=/images/* dir=/path/to" />
有关详细信息,请参阅servlet容器的文档。最终,它们应该可以通过一个正常的URL访问,这样你就可以使用例如:
<p:graphicImage value="/images/MSM_HeaderSplash.png?v=1.1" />
我用下面的方法来解决这个问题。它不像使用graphicImage的库和name属性那样直观。请让我知道是否有其他工作。由于
<h:graphicImage value="#{resource['default:img/MSM_HeaderSplash.png']}&v=1.0" alt=" " width="487" height="68" />
对于您的情况,最好的选择似乎是使用HTML <img />
标记。令人惊讶的是,大多数图像缓存解决方案都是基于随机生成的字符串,因为没有HTML标准方法来实现它。这将欺骗浏览器,迫使它重新下载。
不需要多次硬编码图像路径,只需使用<ui:param />
将变量保存在facelets中。
<ui:param name="imageFolder" value="resources/images" />
<img src="#{imageFolder}/image.jpg?#{currentDate.time}" />
其中#{currentDate}
为当前Date
实例。这可以通过在faces-config中添加一个请求作用域bean来实现:
<managed-bean>
<managed-bean-name>currentDate</managed-bean-name>
<managed-bean-class>java.util.Date</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
计算结果为:
<img src="resources/images/image.jpg?1403302512505">
所以你的当前图像将在每次请求中检索。
另一种选择是在web过滤器级别禁用整个浏览器缓存,尽管这会影响您的整个内容。
参见:
- 在JSF页面显示当前日期
- 如何强制web浏览器不缓存图像
- 如何控制网页缓存,跨所有浏览器?