【问题标题】:How to check if JSF resource exists before loading view如何在加载视图之前检查 JSF 资源是否存在
【发布时间】:2013-12-10 09:16:11
【问题描述】:

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

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

【问题讨论】:

  • 做到了。我之前尝试过类似的东西,但没有完全正确。看到我的特定示例对我很有帮助。

标签: javascript jsf


【解决方案1】:

您可以使用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,正如能够在代码 sn-p 的模板文本中使用统一 EL 所暗示的那样),您应该使用带有&lt;h:outputScript&gt; 的资源库。另见How to reference CSS / JS / image resource in Facelets template?

【讨论】:

  • 做到了。我之前尝试过类似的东西,但没有完全正确。看到我的特定示例对我很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多