在使用JSF的项目中,我们有JavaScript文件:
MyProject/view/javascript/*.js
在xhtml文件中,我将这些资源包含在
中<script type="text/javascript" src="javascript/#{myBean.jsFileName}.js" />
这很好用,但#{myBean.jsFileName}.js
可能不存在,在这种情况下我想加载“Default.js”。
在myBean(或xhtml文件本身)中,如何在设置#{myBean.jsFileName}
值之前先检查js文件是否存在?我尝试过这个变种:
File f = new File("javascript/myFile.js");
if (!f.exists){ jsFileName="Default"};
但我不认为这是对的。我是在正确的轨道上吗?
答案 0 :(得分:10)
您可以使用ExternalContext#getResource()
获取URL
的网络资源。如果资源不存在,它将返回null
。它需要一个相对于Web根目录的路径,最好始终以/
开头。
因此。这应该在bean中做:
String fullPath = "/view/javascript/myFile.js";
URL resource = FacesContext.getCurrentInstance().getExternalContext().getResource(fullPath);
if (resource == null) {
fullPath = "/view/javascript/default.js";
}
或者,等效地,在视图中,这是IMO有点hacky:
<c:set var="available" value="#{not empty facesContext.externalContext.getResource(bean.fullPath)}" />
<script src="#{available ? bean.fullPath : bean.fullDefaultPath}" />
无关具体问题,如果你使用的是JSF 2.x(至少是Facelets,因为能够在你的代码片段中使用模板文本中的统一EL来暗示),你应该是使用<h:outputScript>
的资源库。另请参阅How to reference CSS / JS / image resource in Facelets template?