从request获取各种路径总结 request.getRealPath("url"); // 虚拟目录映射为实际目录 request.getRealPat...

本文详细介绍了如何使用Java的HttpServletRequest对象获取Web项目的各种路径,包括虚拟目录映射、应用目录名称、当前页面全路径等,并提供了类中和Servlet中获取路径的方法。
转:http://zjutsoft.iteye.com/blog/1084260
从request获取各种路径总结
request.getRealPath("url"); // 虚拟目录映射为实际目录


request.getRealPath("./"); // 网页所在的目录

request.getRealPath("../"); // 网页所在目录的上一层目录

request.getContextPath(); // 应用的web目录的名称


如http://localhost:7001/bookStore/
/bookStore/ => [contextPath] (request.getContextPath())

获取Web项目的全路径
String strDirPath = request.getSession().getServletContext().getRealPath("/");

以工程名为TEST为例:

(1)得到包含工程名的当前页面全路径:request.getRequestURI()
结果:/TEST/test.jsp


(2)得到工程名:request.getContextPath()
结果:/TEST


(3)得到当前页面所在目录下全名称:request.getServletPath()
结果:如果页面在jsp目录下 /TEST/jsp/test.jsp


(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp")
结果:D:\resin\webapps\TEST\test.jsp


(5)得到页面所在服务器的绝对路径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();
结果:D:\resin\webapps\TEST

2.在类中取得路径:

(1)类的绝对路径:Class.class.getClass().getResource("/").getPath()
结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/


(2)得到工程的路径:System.getProperty("user.dir")
结果:D:\TEST

3.在Servlet中取得路径:

(1)得到工程目录:request.getSession().getServletContext().getRealPath("") 参数可具体到包名。
结果:E:\Tomcat\webapps\TEST


(2)得到IE地址栏地址:request.getRequestURL()
结果:http://localhost:8080/TEST/test


(3)得到相对地址:request.getRequestURI()
结果:/TEST/test
<think>我们正在分析用户的问题:解释request.getSession().getServletContext().getRealPath(uploadDir)返回路径为C:\Users\86187\AppData\Local\Temp\tomcat-docb的原因。 首先,我们分解这个调用链: 1. `request.getSession()`: 获取当前HttpSession对象。 2. `getSession().getServletContext()`: 从Session中获取ServletContext对象(应用上下文)。 3. `getServletContext().getRealPath(String path)`: 将给定的虚拟路径(相对于web应用根目录)转换为文件系统的绝对路径。 现在,我们关注为什么返回的路径是`C:\Users\86187\AppData\Local\Temp\tomcat-docb`。 根据引用[1]和[2],我们知道: - `request`和`session`都是JSP/Servlet中的对象。 - `ServletContext`代表整个Web应用的上下文,它提供了访问Web应用资源的方法。 `getRealPath(String path)`方法的作用是:将Web应用中相对于上下文根目录路径(如`/upload`)转换为服务器文件系统上的绝对路径。这个路径是服务器用来存储资源的实际位置。 那么,为什么路径指向了临时目录(Temp)? 1. **应用部署方式**:当我们在开发环境中运行Web应用(例如使用Tomcat)时,如果没有将应用打包成WAR文件部署,Tomcat可能会将应用解压到一个临时目录运行。尤其是在使用IDE(如IntelliJ IDEA或Eclipse)运行Web应用时,为了热部署方便,IDE通常会将应用部署到临时目录。 2. **临时工作目录**:Tomcat在运行应用时,会将解压后的Web应用(包括WEB-INF等目录)放在一个临时工作目录中。这个临时目录通常位于系统的临时文件夹(如Windows下的`AppData\Local\Temp`)中,并且目录名由Tomcat自动生成(如`tomcat-docb`,其中`docb`可能是随机生成的字符串或端口号等)。 3. **没有在服务器上设置持久化的工作目录**:在开发阶段,我们通常不会为每个Web应用指定一个固定的工作目录,因此Tomcat使用临时目录作为默认位置。 4. **路径中的用户名部分**:路径中的`86187`是当前登录用户的用户名(或用户目录名),因为Tomcat进程是以当前用户身份运行的,所以临时目录位于该用户的`AppData\Local\Temp`下。 另外,根据引用[3]中的代码示例,我们看到上传文件时使用了类似的方法来获取上传目录的绝对路径。如果`uploadDir`是相对于Web应用根目录路径(比如`/uploads`),那么`getRealPath(uploadDir)`就会返回该目录在文件系统中的绝对路径。但是,如果这个目录在Web应用中没有预先创建,或者应用是临时部署的,那么路径就会指向临时目录。 总结原因如下: - **开发环境部署**:应用被部署在Tomcat的临时工作目录中。 - **Servlet容器行为**:Tomcat将解压后的Web应用放在临时目录下运行。 - **路径转换规则**:`getRealPath()`方法返回的是Web应用在服务器文件系统上的实际路径,而这个路径在开发环境中就是临时目录。 因此,当调用`request.getSession().getServletContext().getRealPath(uploadDir)`时,返回的路径为`C:\Users\86187\AppData\Local\Temp\tomcat-docb`(后面可能还会加上`uploadDir`的路径),因为当前Web应用被Tomcat部署在这个临时目录下。 注意:在生产环境中,如果我们将应用打包成WAR文件并部署到Tomcat的webapps目录下,那么`getRealPath()`返回的路径就会是类似`$CATALINA_HOME/webapps/your_app/uploadDir`的路径。 引用说明: - 引用[1]和[2]提供了关于request、session和ServletContext的背景信息。 - 引用[3]展示了上传文件时使用`getRealPath()`的代码示例。 相关问题: 1. 如何在生产环境中避免使用临时目录作为文件存储路径? 2. 除了`getRealPath()`,还有哪些方法可以获取服务器上的文件存储路径? 3. 在开发环境中,如何改变Tomcat部署应用的目录? </think>### request.getSession().getServletContext().getRealPath(uploadDir) 返回临时路径的原因分析 该路径 `C:\Users\86187\AppData\Local\Temp\tomcat-docb` 是由 Tomcat 服务器的默认行为决定的,主要原因如下: 1. **Tomcat 临时工作目录机制** 当应用未部署在标准路径时(如开发环境直接运行),Tomcat 会将应用资源解压到**系统临时目录**(`java.io.tmpdir`)运行。路径中的 `tomcat-docb` 是 Tomcat 自动生成的临时目录名(可能包含端口号或随机标识)[^1][^2]。 2. **ServletContext.getRealPath() 的特性** 此方法将**虚拟路径**(如 `/upload`)转换为**服务器文件系统路径**。若未在 `server.xml` 中显式配置 `<Context>`,Tomcat 默认使用临时目录映射应用资源[^2]。 3. **开发环境部署模式** 路径中的 `86187` 是当前系统用户名,表明您正在**本地开发环境**运行应用。IDE(如 IntelliJ/Eclipse)默认通过 Tomcat 临时目录部署应用,而非持久化目录[^3]。 4. **应用未打包部署** 若应用未以 WAR 包形式部署在 Tomcat 的 `webapps` 目录,而是直接运行源代码或展开目录,Tomcat 会强制使用临时路径存放运行时资源[^1][^4]。 --- ### 解决方案(如需固定路径) 如需避免临时目录,可: ```java // 方法1:自定义绝对路径(推荐生产环境) String customPath = "D:/app_uploads"; // 方法2:在Tomcat配置中指定Context路径 // 修改conf/server.xml添加: // <Context docBase="your_app" path="/your_app" workDir="D:/tomcat_workdir"/> ``` > ⚠️ 注意:临时目录重启后会清空,**重要文件需持久化存储**(如数据库、专用存储服务)[^3][^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值