如何在加载视图之前检查JSF资源是否存在

时间:2013-11-25 15:16:31

标签: javascript jsf

在使用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"};

但我不认为这是对的。我是在正确的轨道上吗?

1 个答案:

答案 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?