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

How to check if JSF resource exists before loading view

本文关键字:JSF 检查 资源 是否 存在 加载 视图      更新时间:2023-10-10

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

但我认为这不对。我走对了吗?

您可以使用ExternalContext#getResource()URL的形式获取web资源。如果资源不存在,它将返回null。它采用相对于web根的路径,并且最好总是以/开始。

所以。这应该在bean中完成:

String fullPath = "/view/javascript/myFile.js";
URL resource = FacesContext.getCurrentInstance().getExternalContext().getResource(fullPath);
if (resource == null) { 
    fullPath = "/view/javascript/default.js";
}

或者,等效地,在国际海事组织看来,这有点棘手:

<c:set var="available" value="#{not empty facesContext.externalContext.getResource(bean.fullPath)}" />
<script src="#{available ? bean.fullPath : bean.fullDefaultPath}" />

另请参阅:

  • getResourceAsStream()与FileInputStream

与具体问题无关如果您使用的是JSF 2.x(至少是Facelets,这意味着您可以在代码片段的模板文本中使用统一EL),那么您应该使用带有<h:outputScript>的资源库。另请参阅如何在Facelets模板中引用CSS/JS/image资源?