9

我试图在 jsf 托管 bean 中访问example/web文件夹(见下图),但似乎无法找到一种方法来做到这一点

我试图在 jsf 托管 bean 中访问 **example/web** 文件夹(见下图),但似乎找不到方法

谢谢

4

4 回答 4

17

尝试

FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()

用于构建应用中资源的相对 URL。

如果你想要真正的路径......

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
            .getExternalContext().getContext();
String realPath = ctx.getRealPath("/");
于 2012-04-30T01:58:25.437 回答
14

File如果您出于某种原因想要获得它,那么您需要ExternalContext#getRealPath(). 这会将相对 Web 路径转换为绝对磁盘文件系统。由于您需要网络的根文件夹,因此只需传入/

String absoluteWebPath = externalContext.getRealPath("/");
File webRoot = new File(absoluteWebPath);
// ...

与具体问题无关,无论您想到什么功能要求,您认为拥有指向 Web 文件夹的绝对本地磁盘文件系统路径是正确的解决方案,它肯定需要以不同的方式解决。事实上,根据您对另一个答案的评论,

因为我试图在文件夹中上传一些文件并使用相对路径

你走错路了。如果您打算将上传的文件保存得比 webapp 的部署生命周期更长,则不应在其中存储上传的文件。每当您重新部署 webapp(以及在某些服务器配置上,即使您重新启动服务器),上传的文件都会完全丢失,因为它们没有包含在原始 WAR 文件中。更重要的是,一些重型服务器配置根本不会在磁盘上扩展 WAR,而是在内存中,getRealPath()然后总是返回null.

而是将其存储在服务器部署文件夹之外的固定磁盘文件系统路径中。依次将该路径添加为新的服务器上下文或 docroot,以便可以在不同的(虚拟)上下文路径上访问它。或者自制一个 servlet,InputStream它从磁盘获取其中的一个并将其写入OutputStream响应。另请参阅此相关答案:上传的图片仅在刷新页面后可用

于 2012-04-30T17:59:31.100 回答
0

只是想感谢 Balus C。使用 JSP 编写 Java 代码,在 Tomcat/Tomee 服务器中,我使用以下代码:

private Boolean SaveUserItemImage(Part ui, String bid) throws IOException {

    Boolean fileCreate = false;
    OutputStream out = null;
    InputStream filecontent = null;
    ExternalContext ctx = context().getExternalContext();
    String absoluteWebPath = ctx.getRealPath("/");
    String resource_path = absoluteWebPath + "\\resources\\";
    String image_path = resource_path + "\\" + this.itemType + "_images\\";
    String buildFileName = image_path + bid + "_" + getFileName(ui);
    File files = null;

    try {
      files = new File(buildFileName);
      fileCreate = true;
    } catch (Exception ex) {
      System.out.println("Error in Creating New File");
      Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, ex);
    }

    if (fileCreate == true) {
      if (files.exists()) {
        /// User may be using same image file name but has been editted
        files.delete();
      }

      try {
        out = new FileOutputStream(files);
        filecontent = ui.getInputStream();
        int read = 0;
        final byte[] bytes = new byte[1024];
        while ((read = filecontent.read(bytes)) != -1) {
          out.write(bytes, 0, read);
        }
        fileCreate = true;
      } catch (FileNotFoundException fne) {
        fileCreate = false;
        Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, "SaveUserItemImage", fne);
      } finally {
        if (out != null) {
          out.close();
        }
        if (filecontent != null) {
          filecontent.close();
        }
        files = null;
      }
    }
    return fileCreate;
  }
于 2017-02-17T14:06:22.557 回答
0

尝试:

String relativePath="/resources/temp/";
String absolutePath=   FacesContext.getCurrentInstance.getExternalContext().getRealPath(relativePath);
File file = new File(absolutePath);

获得真正的路径。

在 resources/temp/ 中创建一个 tmp 文件以避免任何异常。

于 2016-01-29T10:34:08.773 回答