`

JavaEE路径陷阱之getRealPath

 
阅读更多
Java路径
Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:
一、URI形式的绝对资源路径
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以打开资源,而URI则不行。
URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!
 
二、本地系统的绝对路径
D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
Java.io包中的类,需要使用这种形式的参数。
但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。
 
三、相对于classpath的相对路径
如:相对于
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。
 
 
四、相对于当前用户目录的相对路径
就是相对于System.getProperty("user.dir")返回的路径。
对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!
所以,绝对不要使用“相对于当前用户目录的相对路径”。然而:
默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!
 
关于serveletContext.getRealPath()方法
 
 
1.关于request.getRealPath
问题:
String filename=request.getRealPath(filename)
-------------------
信息:
warning: [deprecation] getRealPath(java.lang.String) in javax.servlet.ServletRequest has been deprecated
 
解决:
这个getRealPath方法已经不建议使用了
 
参看request.getRealPath的java doc:
Deprecated. As of Version 2.1 of the Java Servlet API, use ServletContext.getRealPath(java.lang.String) instead.
 
 
而在servlet中使用getServletContext.getRealPath()这个方法受到war 和non-war的影响,以及不同app server实现的影响,运气好的话,你常常会得到null,嘿嘿,比如你在weblogic上部署war文件,又调用这个方法..
 
推荐ServletContext.getResourceAsStream
 
 
2.关于serveletContext.getRealPath返回NULL和不同的app server返回不同的结果
 
问题:
 
有几个配置文本配置文件(是一些报表的模板),放在WEB-INF下面的config目录下,程序中是这样得到这个config的实际路径的:
先用 serveletContext.getRealPath得到根路径,tomcat中比如是
c:\tomcat\webapp\test
 
然后我加上 "/WEB-INF/config/aa.config",这样得到文件的path然后进行读入,应用在tomcat上跑是ok的,后来将war放到weblogic上,出错,原因是:
在weblogic上用getRealPath得到的是像
myserver\stage\_appsdir_test_war\test.war!\WEB-INF\config....
这样的路径,于是一直报FileNotFoundException
 
解决:
 
serveletContext.getRealPath
这个方法在不同的服务器上所获得的实现是不一样的, 建议是通过classloader来获得你配置的资源文件
 
context.getRealPath("/")可能返回了null,你可以输入来看看,
对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath只会简单地返回null。其实,也很
 
好理解,一个文件被打包入了.war文件,就不存在目录结构了(虽然包中仍然存在目录结构,但这不等同于文件系统中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO进行读取了。
 
那么,如何读取war包中的资源呢?答案是使用:
ServletContext.getResourceAsStream("/WEB-INF/config/aa.config")方法。
 
 
原则:基本上就是尽量使用j2ee规范中的各层次classloader来获取资源,而不是试图去找文件的绝对路
方法:调用this.getClass().getClassLoader().getResource("/").getPath(); 获取到classes目录的全路径
使用:在得到classes目录的全路径后再根据字符串的截取与拼装达到你的要求即可。
 
       绝对不要使用ServletContext的getRealPath方法获取Web应用的路径!应该使用ServletContext的getResource()方法,直接使用相对于Web应用根目录的相对路径来获取资源。
可以看到,ServletContext接口中的getResource()等方法,可以找到任何从应用程序的根目录开始的资源。包括在.war包这样的压缩文件中。参数必须以/开头。
而我们常用的getRealPath(“/”)方法,在.war包发布时,就会失效。会返回null。
因此,我们应该避免使用getRealPath(“/”)这样的方法来获取应用程序的绝对路径。
        应该使用ServletContext接口的java.net.URL getResource(java.lang.String path)方法,URL对象可以方便的转为URI,和String对象。
 
分享到:
评论

相关推荐

    javaee路径总结

    javaEE开发中各种路径配置的总结,例如前端页面的相对路径的格式等

    JavaEE课程设计:票据管理系统源码.zip

    JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统...

    javaee大作业实例

    1. **Servlet**:Servlet是JavaEE中最基础的组件之一,用于处理HTTP请求。开发者通常会用它来创建动态网页,接收和响应用户的数据。 2. **JSP(JavaServer Pages)**:JSP是JavaEE中的视图层技术,允许开发者在HTML...

    JavaEE源码javaEE相关安装包及教程

    JavaEE 应用程序的运行需要一个支持JavaEE标准的应用服务器。常见的JavaEE应用服务器包括: - **GlassFish**:由Oracle提供的开源JavaEE应用服务器。 - **WildFly**(原名JBoss AS):Red Hat公司的开源应用服务器。...

    javaee_src.zip

    JavaEE Src.zip是一个压缩包,其中包含了JavaEE应用程序开发的源代码。JavaEE,全称为Java Platform, Enterprise Edition,是Java平台的一个版本,专为构建企业级应用而设计。它提供了一系列的API和服务,用于开发...

    JavaEE期末复习模拟题

    JavaEE是Java企业版(Java Enterprise Edition)的简称,它是一个用于开发企业级应用程序的Java平台。这个平台包含了多个服务、APIs和协议,旨在帮助开发者构建可扩展、高性能、安全且可管理的网络应用程序。JavaEE...

    javaEE结课作业之简易博客网站

    在本项目"javaEE结课作业之简易博客网站"中,我们主要探讨的是如何使用JavaEE技术栈构建一个基本的博客系统。这个项目的核心在于理解并应用JavaEE的相关概念和技术,包括Servlet、JSP、JavaBean以及前端CSS样式。...

    JAVAEE视频教程下载地址

    在标题“JAVAEE视频教程下载地址”以及描述“JAVAEE学习教程下载地址集合,还有外语、经济之类也在其中”中,我们可以了解到这是一份集合了多个JAVAEE学习视频教程的下载地址清单。除此之外,还包含了一些外语和经济...

    JavaEE 30招 JavaEE架构师进阶之路.zip

    JavaEE 30招 JavaEE架构师进阶之路.zip

    javaee_api.zip_JavaEE_Javaee的api_Javax.javaee-api_javaee api 文档_

    1. **Servlet**:Servlet是JavaEE中的核心组件之一,用于处理HTTP请求和响应。它扩展了Web服务器的功能,使得服务器能够处理动态内容。Servlet API定义了Servlet类和ServletConfig接口,以及Servlet生命周期相关的...

    最全和最清楚的Java(Java EE)相对(绝对)路径解析

    最全最清楚的Java 以及JavaEE 相对路径和绝对路径解析,能让我们正确使用相对路径

    javaEE android 简单界面对比

    JavaEE和Android是两个在IT领域中非常重要的平台,它们分别在服务器端和移动设备端发挥着关键作用。本文将对比分析JavaEE和Android在创建简单界面时的特点、技术和应用场景。 首先,JavaEE(Java Enterprise ...

    javaee网络工程期末大作业

    【JavaEE网络工程期末大作业】是一门涵盖了Java企业级应用开发核心技能的课程实践,主要目标是让学生掌握JavaEE平台上的应用程序设计与实现。在这个期末大作业中,学生需要运用所学的知识,构建一个完整的网络工程...

    javaee 包,javaee.jar

    在JavaEE体系中,Servlet是核心组件之一,它是一种服务器端的Java API,用于处理HTTP请求。Servlet可以用来接收来自客户端的请求,进行业务逻辑处理,然后返回响应。"servlet必备"表明这个压缩包可能包含了开发...

    javaee课程源代码

    JavaEE,全称为Java Platform, Enterprise Edition,是Java平台企业版的简称,是一个用于开发企业级应用程序的框架。它提供了一系列API和服务,使得开发者能够构建分布式、多层架构的Web应用,包括数据库连接、安全...

    JAVAEE中文版(最新)

    1. **Servlet**:Servlet是JavaEE中的核心组件之一,它是一个Java类,用于扩展服务器的功能。Servlet可以处理HTTP请求,生成响应,并且能够动态生成网页内容。 2. **JSP(JavaServer Pages)**:JSP是一种基于Java...

    javaee.jar包下载

    为了方便开发,你可以直接下载提供的"javaeejar包",将其添加到项目的类路径(ClassPath)中,这样就可以顺利地使用JavaEE的各种服务和API,进行Web应用的开发和部署了。 总结一下,JavaEE.jar是JavaEE平台的核心...

    javaEE概述

    javaEE概述

    个人博客网站,javaEE

    【JavaEE技术体系详解】 JavaEE,全称为Java Platform, Enterprise Edition,是Oracle公司推出的用于构建企业级Web应用的标准框架。这个平台包含了多种技术,如Servlet、JSP、EJB、JMS、JPA等,旨在简化开发过程,...

Global site tag (gtag.js) - Google Analytics