java中路径问题看似不大,但是有时候细节问题导致的是 当前路径不存在
常常伴随左右。来总结一下路径问题吧。
路径不存在:
首先必须注意的是 如果FileInputStream中的路径如果不存在的话,就会报错,如果路径存在而文件不存在 就会创建对应的文件。
/代表位置
分两种情况:目标资源是给谁使用的。
给服务器使用的: / 表示在当前web应用的根目录(webRoot
给浏览器使用的: / 表示在webapps的根目录下
举例:转发:
就是服务器调用,就是内部调用,/代表当前项目:
request.getRequestDispatcher("/target.html")
.forward(request, response);
请求重定向:
就是浏览器调用。
response.sendRedirect("/day11/target.html");
html页面的超连接href:
浏览器调用。
response.getWriter().write("<html><body><a href=
'/day11/target.html'>超链接</a></body></html>");
html页面中的form提交地址:
浏览器调用。
response.getWriter().write("<html><body><form action=
'/day11/target.html'><input type='submit'/></form>
</body></html>");
. 地址问题
. 代表java命令运行目录。
Java项目:
正常情况下.
代表Class的位置,即bin目录下。
而Eclipse会自动执行一个动作 就是Set pathClass=class
位置。
这样 你在哪里都可以运行这个class,但是.
代表的却是当前运行的位置。
所以.
代表当前项目的根目录
JavaWeb项目:
java运行命令 在tomcat/bin目录下
读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下,而此时没有src
File file = new File("./src/db.properties");
FileInputStream in = new FileInputStream(file);
结论: 在web项目中, .
代表在tomcat/bin目录下开始,所以不能使用这种相对路径。
使用web应用下加载资源文件的方法: 适应任何项目以及其他电脑
- getRealPath读取,返回资源文件的绝对路径
String path = this.getServletContext().getRealPath
("/WEB-INF/classes/db.properties");
File file = new File(path);
FileInputStream in = new FileInputStream(file);
- getResourceAsStream() 得到资源文件,返回的是输入流
InputStream in = this.getServletContext().
getResourceAsStream("/WEB-INF/classes/db.properties");
得到web应用路径:
web应用路径:部署到tomcat服务器上运行的web应用名称
//1.得到ServletContext对象
ServletContext context = this.getServletContext();
2.得到web应用路径
String contextPath = context.getContextPath();
System.out.println(contextPath);
//应用到请求重定向
response.sendRedirect(contextPath+"/index.html");