最近在学习JavaWeb的时候路径问题有点混淆不清,根据自己项目和各博客总结出关于路径的一些知识点:
一、绝对路径与相对路径
1、绝对路径
绝对路径,是指根据给出的访问路径可以准确定位到资源的路径。 而对于计算机中Web应用的绝对路径,则是指带访问协议的路径。
http://127.0.0.1:8080/ssm/index.jsp
2、相对路径
相对路径,是指仅根据访问路径无法准确定位资源的路径。相对路径必须要结合其参照路径才可组成为可以准确定位资源的绝对路径。参照路径的不同,所形成的可以准确定位资源的绝对路径也是不同的。在进行资源访问时,必须要将相对路径转换为绝对路径才可完成资源的准确定位。
在Web应用中,相对路径的写法有两种:一种是以斜杠开头的相对路径,一种是不以斜杠开头的相对路径。根据相对路径是否以斜杠开头,且出现的文件所在位置的不同,其默认的参照路径是不同的。这也是相对路径最容易出错的地方:确定参照路径。
二、绝对路径
1、路径以"/"开头在前端与后端的不同意义
(1)前端路径(html/jsp文件中的路径)
浏览器中路径以/
开头:这个/
就等于浏览器中的http://ip:port/
,也就是服务器的路径。
//假设此时浏览器地址栏为http://ip:port/01/a.html
<a href="/b.html">跳转</a>
点击这个超链接的结果是浏览器地址框变为:http://ip:port/b.html
注意:用于
<a>
标记、form表单
和重定向
(2)后端路径(Servlet)
后端路径以/
开头的:这里的/
就等于浏览器中的http://ip:port/项目名称/
。
注意:常用于
转发
三、相对路径问题
几种常用的相对路径表示方法:
1、没有/
:代表当前文件所在的目录,可以跳转到当前文件同目录下的任何文件。
2、/
:代表根目录,绝对路径。(参考二中绝对路径)
3、./
:同1,代表当前文件所在的目录,可以跳转到当前文件同目录下的任何文件。
4、../
:代表上一层目录。
5、../
多次连用:每一次../
往上跳转一级,有几个../
就向上跳几级。
四、获取资源物理存放路径的接口函数
1、类名.getClass().getResource()
①类名.getClass().getResource(" "):获取xxx类经编译后的xxx.class全路径。
System.out.println(this.getClass().getResource("").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/springmvc/controller/
②类名.getClass().getResource("/"):获取src资源文件编译后的类路径(即classes路径)。
System.out.println(this.getClass().getResource("/").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/
System.out.println(this.getClass().getResource("/com").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/
System.out.println(this.getClass().getResource("/com/springmvc").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/springmvc/
2、类名.getClass().getClassLoader().getResource()
①类名.getClass().getResource(""):获取src资源文件编译后的类路径(即classes路径)。
②类名.getClass().getResource("/"):同①,获取src资源文件编译后的类路径(即classes路径)。
System.out.println(this.getClass().getClassLoader().getResource("").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/
System.out.println(this.getClass().getClassLoader().getResource(""));
//输出结果是file:/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/
System.out.println(this.getClass().getClassLoader().getResource("/"));
//输出结果是file:/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/
System.out.println(this.getClass().getClassLoader().getResource("com").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/
System.out.println(this.getClass().getClassLoader().getResource("com"));
//输出结果是file:/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/
System.out.println(this.getClass().getClassLoader().getResource("/com").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/
System.out.println(this.getClass().getClassLoader().getResource("/com"));
//输出结果是file:/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/
System.out.println(this.getClass().getClassLoader().getResource("/com/springmvc").getPath());
//输出结果是/E:/Programming/IDEA_project/springmvc/target/springmvc/WEB-INF/classes/com/springmvc/
五、HttpServletRequest 对象获取路径
1、getRequestURL()
用于获取文件的请求全路径 URL。
public void ceshi(HttpServletRequest request) throws IOException { System.out.println(request.getRequestURL("login.jsp")); } // 输出结果是 http://localhost:8080/01/static/request.jsp
2、获取应用上下文名
(1)前端页面 ${pageContext.request.contextPath }
$ {pageContext.request.contextPath} 等价于 <%=request.getContextPath()%> 或者可以说是 <%=request.getContextPath()%> 的EL版。
$ {pageContext.request.contextPath} 的功能是取出部署的应用上下文名或者是当前的项目名称
。比如我的应用上下文名称是 01,在浏览器中输入为http://localhost:8080/01/login.jsp,则 ${pageContext.request.contextPath} 或 <%=request.getContextPath()%> 取出来的就是 /01,而”/” 代表的含义就是 http://localhost:8080
(参考绝对路径中”/“的意义)。<form action="${pageContext.request.contextPath}/login" method="post"> 请输入账号<input type="text" name="username"><br> 请输入密码<input type="text" name="password"><br> <input type="submit"> </form>
(2)后端方法 request.getContextPath()
同上,
request.getContextPath() 的功能是取出部署的应用上下文名或者是当前的项目名称
。比如我的应用上下文名称是01,在浏览器中输入为http://localhost:8080/01/login.jsp,则 request.getContextPath() 取出来的就是 /01,而”/” 代表的含义就是 http://localhost:8080
(参考绝对路径中”/“的意义)。response.sendRedirect(request.getContextPath()+"/static/success.html");
3、HttpServletRequest 对象.getSession().getServletContext().getRealPath(“文件名”)
用于获取文件物理存放位置的绝对路径
。
public void ceshi(HttpServletRequest request) throws IOException {
System.out.println(request.getSession().getServletContext().getRealPath("login.jsp"));
}
//输出结果是E:\Programming\IDEA_project\springmvc\target\springmvc\login.jsp
4、HttpServletRequest 对象的几种方法的对比
(1)返回全路径
request.getRequestURL()
(2)返回除去 host(域名或者 ip )部分的路径
request.getRequestURI()
(3)返回应用上下文部分,如果应用上下文为/,此处返回则为空
request.getContextPath()
(4)返回除去 host 和应用上下文部分的路径
request.getServletPath()
例子:
request.getRequestURL()
http://localhost:8080/01/static/login.jsp
request.getRequestURI()
/01/static/login.jsp
request.getContextPath()
/01
request.getServletPath()
/static/login.jsp