jsp获取项目路径(二)

1.? 获取web服务器项目的真实物理路径
request.getSession().getServletContext().getRealPath("/");
2.? 相对路径的获得
说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
String relativelyPath=System.getProperty("user.dir");
上述相对路径中,java项目中的文件是相对于项目的根目录
web项目中的文件路径视不同的web服务器不同而不同
(tomcat是相对于 tomcat安装目录\bin)
3.? 类加载目录的获得(即当运行时某一类时获得其装载目录)
3.1. 通用的方法一
(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录 )   
   InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");
   (test.txt文件的路径为项目名\src\test.txt;类TestAction所在包的第一级目录位于src目录下)   
   上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可
3.2. 通用方法二 (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头)
   InputStream is=Test1.class.getResourceAsStream("/test.txt");
   (test.txt文件的路径为项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)   
4.? web项目根目录的获得(发布之后)
4.1. 从servlet出发
   可建立一个servlet在其的init方法中写入如下语句
   ServletContext s1=this.getServletContext();
   String temp=s1.getRealPath("/"); (关键)
   结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\ (002_ext为项目名字)
   如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")
4.2. 从httpServletRequest出发
   String cp11111=request.getSession().getServletContext().getRealPath("/");
?
   结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\
5.? classpath的获取
(在Eclipse中为获得src或者classes目录的路径)
5.1. 方法一
?????? Thread.currentThread().getContextClassLoader().getResource("").getPath();
?????? eg:
   String t=Thread.currentThread().getContextClassLoader().getResource("").getPath();
   System.out.println("t---"+t);
   输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/   
5.2. 方法二
JdomParse.class.getClassLoader().getResource("").getPath() (JdomParse为src某一个包中的类,下同)
   eg:
String p1=JdomParse.class.getClassLoader().getResource("").getPath();
System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);
输出:
JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/WEB-INF/classes/
另外,如果想把文件放在某一包中,则可以通过以下方式获得到文件(先定位到该包的最后一级目录)
eg
String p2=JdomParse.class.getResource("").getPath();
System.out.println("JdomParse.class.getResource---"+p2);
输出:
JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classes/jdom/
(JdomParse为src目录下jdom包中的类)
在jsp和class文件中调用的相对路径不同。 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。
6.? 在Jsp,Servlet,Java中详细获得路径的方法
6.1. jsp中取得路径:
以工程名为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
6.2. 在类中取得路径:
(1)类的绝对路径:Class.class.getClass().getResource("/").getPath()
结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/
(2)得到工程的路径:System.getProperty("user.dir")
结果:D:\TEST
6.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>嗯,用户现在问的是如何在JSP获取当前项目路径。首先,我需要回顾一下用户之前的问题,他们之前问过如何将文件存入项目中的非target目录,现在可能是在开发Web应用时需要获取路径来读写文件或者其他操作。 JSP是在服务器端运行的,所以获取项目路径通常涉及到Servlet上下文。常见的办法是使用内置对象比如application(ServletContext),或者request对象的方法。比如,request.getServletContext().getRealPath("/")可以获取到应用的根目录在服务器上的真实路径。 不过要注意,不同的服务器(如Tomcat)部署方式不同,getRealPath可能会返回null,特别是当应用被打包成WAR文件时,或者服务器配置了虚拟路径。这时候可能需要其他的方法,比如通过类加载器获取资源路径,或者使用系统属性。 另外,用户可能需要在JSP中动态生成链接或者定位资源,比如图片、配置文件的位置。这时候正确的路径获取方法很重要,否则可能导致文件找不到或者路径错误。还需要考虑相对路径和绝对路径的问题,以及不同环境下(开发、测试、生产)路径的一致性。 可能还需要提到JSP中的EL表达式,比如${pageContext.request.contextPath}来获取当前应用的上下文路径,这在生成网页链接时很有用,确保路径正确。但用户的问题是获取项目在服务器上的物理路径,而不仅仅是Web上下文路径,所以可能需要区分这两者的不同。 还需要注意安全性问题,直接暴露服务器文件路径可能存在风险,应该确保用户不会通过这种方式获取到敏感信息。此外,在JSP中直接编写Java代码虽然可行,但更好的做法是使用EL或JSTL,或者将逻辑放在Servlet中,保持JSP的整洁。 总结一下,用户可能需要的是在JSP中正确获取项目的物理路径,用于文件操作,需要提供几种可靠的方法,并指出各自的适用场景和注意事项。同时,提醒用户处理可能的异常情况,比如路径不存在或权限问题。</think>以下是关于**在JSP获取当前项目路径**的详细解决方案: --- ### **1. 核心方法对比** | **方法** | **特点** | **适用场景** | |-----------------------------------|-------------------------------------------------------------------------|---------------------------------| | `request.getServletContext()` | 直接获取Servlet上下文对象,支持获取物理路径 | 需要操作服务器物理文件时(如读写文件) | | `${pageContext.request.contextPath}` | 通过EL表达式获取Web应用的上下文路径(虚拟路径) | 生成HTML中的超链接、资源引用路径 | | `System.getProperty("user.dir")` | 获取JVM启动目录(可能不是项目路径) | 非Web环境或特定服务器配置下的路径获取 | | `ClassLoader.getResource()` | 通过类加载器定位资源路径 | 读取类路径下的资源文件(如配置文件) | --- ### **2. 具体实现代码** #### **(1) 获取物理部署路径(推荐)** ```jsp <%-- 获取Web应用根目录的物理路径 --%> <% String physicalPath = application.getRealPath("/"); out.print("物理路径:" + physicalPath); %> <%-- 或通过request对象获取 --%> <% String pathViaRequest = request.getServletContext().getRealPath("/"); %> ``` **输出示例**(Tomcat服务器): ``` 物理路径:C:\apache-tomcat-9.0\webapps\your_project\ ``` #### **(2) 获取Web上下文路径(虚拟路径)** ```jsp <%-- 使用EL表达式直接输出 --%> 当前上下文路径:${pageContext.request.contextPath} <%-- 生成超链接示例 --%> <a href="${pageContext.request.contextPath}/user/profile">用户中心</a> ``` **输出结果**: ``` 当前上下文路径:/webapp_demo ``` --- ### **3. 不同场景下的路径差异** | **运行环境** | **路径类型** | **示例值** | |--------------------|--------------------------|--------------------------------------------| | IDE直接启动 | 开发临时目录 | `C:\idea_workspace\tomcat\work\webapp_demo` | | 生产环境Tomcat | 正式部署目录 | `/usr/local/tomcat/webapps/webapp_demo` | | 打包为WAR部署 | 解压后的临时目录 | `C:\apache-tomcat\webapps\webapp_demo\` | --- ### **4. 路径处理注意事项** #### **(1) 路径有效性验证** ```jsp <% String testDir = application.getRealPath("/uploads"); File dir = new File(testDir); if (!dir.exists()) { dir.mkdirs(); // 自动创建缺失目录 } %> ``` #### **(2) 跨平台路径处理** ```jsp <% String safePath = physicalPath.replace("\\", "/"); // 统一使用正斜杠 Path nioPath = Paths.get(safePath).resolve("data.txt"); %> ``` #### **(3) 安全限制** ```jsp <%-- 禁止访问WEB-INF等敏感目录 --%> <% if (requestedPath.contains("WEB-INF")) { response.sendError(403, "禁止访问系统目录"); return; } %> ``` --- ### **5. 完整路径操作示例** ```jsp <%@ page import="java.nio.file.*" %> <% // 获取上传目录路径 String uploadPath = application.getRealPath("/uploads"); // 创建目录结构 Path targetDir = Paths.get(uploadPath, "2023-07"); Files.createDirectories(targetDir); // 生成唯一文件名 String fileName = "report_" + System.currentTimeMillis() + ".csv"; Path outputFile = targetDir.resolve(fileName); // 写入文件内容 String data = "日期,访问量\n2023-07-01,1589"; Files.write(outputFile, data.getBytes("UTF-8")); %> 文件已保存至:<%= outputFile.toAbsolutePath() %> ``` --- ### **6. 常见问题解决方案** #### **Q1: 获取路径为null?** ```jsp <% // 替代方案:通过类加载器获取 String classLoaderPath = getClass().getClassLoader().getResource("").getPath(); String decodedPath = URLDecoder.decode(classLoaderPath, "UTF-8"); %> ``` #### **Q2: 路径中包含特殊字符?** ```jsp <% // 处理空格和中文路径 String safePath = new File(physicalPath).toURI().getPath(); %> ``` #### **Q3: 在JSP中动态生成下载链接** ```jsp <%-- 生成符合当前部署环境的下载链接 --%> <a href="${pageContext.request.contextPath}/download?file=report.pdf"> 下载季度报告 </a> ``` --- ### **7. 最佳实践建议** 1. **路径存储策略**: ```jsp <%-- 将路径配置在web.xml中 --%> <context-param> <param-name>fileStoragePath</param-name> <param-value>/var/data/webapp</param-value> </context-param> <%-- JSP中读取 --%> <% String configPath = application.getInitParameter("fileStoragePath"); %> ``` 2. **使用JSTL优化代码**: ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="ctx" value="${pageContext.request.contextPath}"/> <img src="${ctx}/static/images/logo.png"> ``` 3. **日志记录路径**: ```jsp <%-- 在服务器日志中记录关键操作路径 --%> <% application.log("文件存储目录初始化:" + physicalPath); %> ``` 通过以上方法,可以安全可靠地在JSP获取并操作项目路径,同时保证不同运行环境下的兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值