在使用JSF的项目中,我们有
JavaScript文件位于:
MyProject/view/javascript/*.js
<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()
获取Web资源作为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}" />
也可以看看:
> getResourceAsStream() vs FileInputStream
与具体问题无关,如果您使用的是JSF 2.x(至少是Facelets,因为能够在代码片段中的模板文本中使用统一的EL意味着),您应该使用带有< h:outputScript>的资源库. .另见How to reference CSS / JS / image resource in Facelets template?