从java类文件中获取apache webcontents文件夹的绝对路径

时间:2011-09-22 15:31:34

标签: java file jsp absolute-path

需要在动态Web应用程序内的java类文件中获取绝对路径...

  • 其实我需要获取apache webapps文件夹的路径...部署webapps的地方

  • e.g。的 /apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

  • 需要在java类文件中获取此文件,而不是在jsp页面或任何视图页面上...

任何想法?

7 个答案:

答案 0 :(得分:12)

  

其实我需要获取apache webapps文件夹的路径...部署webapps的位置

     

e.g。 /apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

正如许多其他答案所述,您可以使用ServletContext#getRealPath()将相对Web内容路径转换为绝对磁盘文件系统路径,以便您可以在File或{{{{}}中进一步使用它1}}。 FileInputStream是由继承的getServletContext()方法提供的servlet:

ServletContext

但是,文件名“imagetosave.jpg”表示您尝试按String relativeWebPath = "/images"; String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath); File file = new File(absoluteDiskPath, "imagetosave.jpg"); // ... 存储上传的图片。公共webcontent文件夹是用于存储上传图像的错误位置!无论何时重新部署webapp,或者甚至在服务器重新启动并进行清理时,它们都会丢失。原因很简单,上传的图像根本不包含在待部署的WAR文件中。

您绝对应该在webapp部署文件夹的外部中寻找另一个位置,作为上传图像的更永久存储,以便在多个部署/重新启动时保持完整。最好的方法是准备一个固定的本地磁盘文件系统文件夹,例如FileOutputStream,并将其作为一些配置设置提供。最后只需将图像存储在那里。

/var/webapp/uploads

另见:

答案 1 :(得分:2)

如果你有一个javax.servlet.ServletContext,你可以调用:

servletContext.getRealPath("/images/imagetosave.jpg")

获取图像存储位置的实际路径。

可以从javax.servlet.http.HttpSession访问ServletContext。

但是,您可能需要考虑使用:

servletContext.getResource("/images/imagetosave.jpg")

servletContext.getResourceAsStream("/images/imagetosave.jpg") 

答案 2 :(得分:1)

String path =  MyClass.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

这应该根据类的文件位置返回绝对路径。

答案 3 :(得分:1)

我能够在Filter中获得对ServletContext的引用。我最喜欢这种方法的是它发生在init()方法中,在第一次加载Web应用程序时调用它意味着执行只发生一次。

public class MyFilter implements Filter {
    protected FilterConfig filterConfig;
    public void init(FilterConfig filterConfig) {
        String templatePath = filterConfig.getServletContext().getRealPath(filterConfig.getInitParameter("templatepath"));
        Utilities.setTemplatePath(templatePath);
        this.filterConfig = filterConfig;
}

我通过web.xml将“templatepath”添加到filterConfig:

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.myapp.servlet.MyFilter</filter-class>
    <init-param>
        <param-name>templatepath</param-name>
        <param-value>/templates</param-value>
    </init-param>
</filter>    
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

答案 4 :(得分:1)

您可以在控制器中获取路径:

public class MyController extends MultiActionController {
private String realPath;

public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    realPath = getServletContext().getRealPath("/");
    String classPath = realPath + "WEB-INF/classes/" + MyClass.ServletContextUtil.class.getCanonicalName().replaceAll("\\.", "/") + ".java";
    // add any code
}

答案 5 :(得分:1)

方法-1:

// step1:import java.net.InetAddress;

InetAddress ip = InetAddress.getLocalHost();

// step2:提供文件路径

String filepath="GIVE YOUR FILE PATH AFTER WEB FOLDER something like /images/grid.png"

// step3:抓住所有的peices

String a ="http://"+ip.getHostAddress()+":"+request.getLocalPort()+""+request.getServletContext().getContextPath()+filepath;

方法-2:

//步骤:1 - 获取绝对网址

String path = request.getRequestURL().toString();

//步骤:2 - 然后使用上下文路径

对其进行子字符串
path = path.substring(0, path.indexOf(request.getContextPath()));

//步骤:3 - 在web文件夹

之后提供文件路径
String finalPath = "GIVE YOUR FILE PATH AFTER WEB FOLDER something like /images/grid.png"
path +=finalPath;

我的建议

  1. 将您要打开的文件保存在源文件夹的默认包中,并直接打开文件以使其简单明了。
    注意:发生这种情况是因为如果您在没有IDE的情况下进行编码然后将其保存在您的Java编译类文件的位置或者您可以访问的公共文件夹中,它就会出现在IDE的类路径中。
  2. 有乐趣

答案 6 :(得分:0)

您可以编写ServletContextListener:

public class MyServletContextListener implements ServletContextListener
{

    public void contextInitializedImpl(ServletContextEvent event) 
    {
        ServletContext servletContext = event.getServletContext();
        String contextpath = servletContext.getRealPath("/");

        // Provide the path to your backend software that needs it
    }

    //...
}

并在web.xml中配置

<listener>
    <listener-class>my.package.MyServletContextListener</listener-class>
</listener>