从 JSF 中的托管 bean 获取资源文件的路径

Posted

技术标签:

【中文标题】从 JSF 中的托管 bean 获取资源文件的路径【英文标题】:Getting a path to a resource file from managed-bean in JSF 【发布时间】:2011-09-10 10:11:01 【问题描述】:

我有这种情况:我正在尝试删除用户的旧头像图像,然后再从托管 bean 中放置新头像。

String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);

我用谷歌搜索了一下,似乎我可以从 ExternalContext 获取该文件夹的路径,例如:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...

但我在class docs 中找不到合适的方法。能否请您帮忙解决一下该放什么而不是...或提出更好的解决方案。

PS。不知何故,我怀疑可以对链接进行硬编码,但到目前为止还没有运气。

【问题讨论】:

【参考方案1】:

我了解该文件嵌入在 WAR 中,并且您正在寻找 ExternalContext#getRealPath() 方法来基于 Web 相对路径来解决它。根据 Javadoc,此方法是在 JSF 2.0 中引入的,而在 JSF 1.x 中不存在。您似乎使用的是 JSF 1.x,否则您不会问这个问题。您需要改用 ServletContext#getRealPath()(这也是新的 JSF 2.0 方法在幕后委派的内容)。

String relativeWebPath = "/resources/img/useravatars/" + ...;
ServletContext servletContext = (ServletContext) externalContext.getContext();
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
// ...

但是,有一个很大的但是:您可以并且不应该写入扩展的 WAR。删除文件也是写。每当您重新部署 WAR 或重新启动服务器时,所有更改都将被还原,扩展 WAR 将保留其初始状态,从而丢失自上次部署以来在扩展 WAR 中所做的所有更改。

您确实需要将这些文件存储在外部位置,然后可以在某些外部配置(属性)文件中对其根位置进行硬编码或定义。这样你就可以像往常一样使用java.io.File的东西了。

有多种方法可以从外部位置提供文件。您可以在以下问题的答案中找到它们:Load images from outside of webapps / webcontext / deploy folder using <h:graphicImage> or <img> tag

【讨论】:

也就是说,读书就好了?我在那里有一些速度模板。 @Alexander:永远不要使用getRealPath()。只需使用getResourceAsStream()。此方法也可在ExternalContext 上使用。相关:***.com/questions/15972175/…

以上是关于从 JSF 中的托管 bean 获取资源文件的路径的主要内容,如果未能解决你的问题,请参考以下文章

从托管 bean 中的 ADF SelectOneChoice 获取选定项目

读取托管 bean 中的资源包属性

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

如何从托管 bean 中获取消息包字符串?

jsf 2.2 获取属性文件的路径

将 JSF 托管 bean 迁移到 CDI 托管 bean