Java中的路径问题

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目录下开始,所以不能使用这种相对路径。

如果是Html网页的action的话 也分两种情况:

用绝对地址:action="/Shop/validate",这里"/"指向web根目录,Shop是项目上下文。
用相对地址 : action="./view/validate",这里"./"跳出了view目录,进入到了Shop项目目录内。

使用web应用下加载资源文件的方法: 适应任何项目以及其他电脑

  1. getRealPath读取,返回资源文件的绝对路径
String path = this.getServletContext().getRealPath  
("/WEB-INF/classes/db.properties");
File file = new File(path);
FileInputStream in = new FileInputStream(file);
  1. 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();  
    //等价于上面的代码
    String contextPath = request.getContextPath();    

    System.out.println(contextPath);
    //应用到请求重定向
    response.sendRedirect(contextPath+"/index.html");

注意 :
如果java项目中在src中创建了txt文件,那么资源路径是:

./src/aa.txt

如果javaWeb项目中在src中创建了txt文件,那么资源路径是:

/WEB-INF/classes/aa.txt

总结:

.代表java命令运行的目录

  1. .Java中代表的是运行目录从项目的根目录开始
  2. .JavaWeb中代表的是tomcat/bin开始

/ : 斜杠表示classpath的根目录

在java中: classpath的根目录从bin目录开始
在javaWeb中:classpath的根目录从WEB-INF/classes目录开始

因为servlet的机制它是这样访问的:

  1. /在浏览器访问的是webapps的根目录下(总项目的目录)
  2. /在服务器访问的是当前web应用的根目录

如果没有./ 则代表相对路径。

2018.7.27更新:

JSP页面路径获取:

"${pageContext.request.contextPath}/ TeacherServlet" method="POST">
//用于解决使用相对路径时出现的问题,它的作用是取出所部署项目的名字。
${pageContext.request.contextPath}  
<%=request.getContextPath()%>

Servlet路径获取:
转发:

request.getRequestDispatcher("/Register.jsp").  
forward(request, response);

重定向:

response.sendRedirect(request.getContextPath() +  
 "/error/error.jsp");

还有一种方式:

jdbcUtil.class.getResourceAsStream("/db.properties")
第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml 那么,应该有如下代码:    Java代码   me.class.getResourceAsStream("myfile.xml");       

第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml   那么,应该有如下代码:    Java代码   me.class.getResourceAsStream("file/myfile.xml");        

第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml   那么,应该有如下代码:     Java代码   me.class.getResourceAsStream("/com/x/file/myfile.xml");      

你可能感兴趣的:(JAVA,Web基础)