从JSF中的managed-bean获取资源文件的路径

Pav*_*kyy 11 jsf managed-bean

我遇到这种情况:我在尝试从托管bean中添加新的头像之前删除旧的头像图像.

String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);
Run Code Online (Sandbox Code Playgroud)

我已经google了一下,似乎我可以从ExternalContext获取该文件夹的路径,如:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...
Run Code Online (Sandbox Code Playgroud)

但我找不到类文档中的适当方法.你能帮忙说些什么而不是...或建议一个更好的解决方案.

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

Bal*_*usC 28

我知道该文件嵌入在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);
// ...
Run Code Online (Sandbox Code Playgroud)

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

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

有几种方法可以从外部位置提供文件.您可以在以下问题的答案中找到它们:使用<h:graphicImage>或<img>标签从webapps/webcontext/deploy文件夹外部加载图像