从 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 获取选定项目