JavaWeb中的路径问题

本文详细阐述了JavaWeb开发中关于路径的知识点,包括绝对路径与相对路径的区别,前端与后端路径的使用,相对路径的表示方法,以及通过类和HttpServletRequest对象获取资源路径的方法。特别强调了`/`在不同场景下的含义,并举例说明了如何使用这些路径进行文件和应用上下文的定位。
摘要由CSDN通过智能技术生成

最近在学习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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值