1. 访问路径的组成
URL,统一资源定位符,用于定位资源的一种方式。通常的 URL 资源访问路径由两部分构成:资源路径与资源名称。资源名称指的是要访问资源的直接名称,如 show.html,或与要访问资源存在映射关系的间接名称,如 show.do。而资源路径,则是通过该路径则可以定位到指定的资源,即资源路径是指在 URL 资源访问路径中除了资源名称以外的其它部分。
根据以上规则,URI,统一资源标识符,也可以分为资源路径与资源名称两部分。
一般情况下,在 URL 或 URI 中,最后一个斜杠后的部分为资源名称,而其它部分则为资
源路径。


根据“资源路径是否可以独立完成资源准确定位”的判别标准,可以将访问路径分为绝
对路径与相对路径。
2.绝对路径
绝对路径,是指根据给出的访问路径可以准确定位到资源的路径。例如,你要告诉对方你现在的位置,你说:我现在在北京故宫游客 A 入口处。这就是个绝对地址,听者根据你所述地址,可以准确的找到你。
而对于计算机中 Web 应用的绝对路径,则是指带访问协议的路径,即 URL。例如下面的路径就是一个带有 http 访问协议的绝对路径。
http://127.0.0.1:8080/primary/index.jsp
3. 相对路径
相对路径,是指仅根据访问路径无法准确定位资源的路径。相对路径必须要结合其参照路径才可组成可以准确定位资源的绝对路径。参照路径的不同,所形成的可以准确定位资源的绝对路径也是不同的。在进行资源访问时,必须要将相对路径转换为绝对路径才可完成资源的准确定位。它们的关系如下:
绝对路径 = 参照路径 + 相对路径
例如,你要告诉对方你现在的位置,你说:我在人民公园的正门门口。这就是个相对地址。因为很多城市都有人民公园,每个人民公园也都有正门。当对方不知道你在哪个城市时,他是无法准确定位你的。当然,你只所以不说是哪个城市,是因为这里存在一个默认的参照路径:与听者在同一个城市。听者会将你所说的相对地址,自动转换为一个绝对地址:与听者在同一城市的人民公园正门门口。
在 Web 应用中,浏览器或服务器会自动为不同的相对路径添加不同的参照路径,将相对路径转换为绝对路径,以定位这个资源。作为程序员,必须要理解并掌握浏览器或服务器为相对路径添加参照路径的规则,这样才能在编程时更为准确地书写相对路径。
相对路径的写法有两种:一种是以斜杠开头的相对路径,一种是以路径名称开头的相对
路径。根据相对路径是否以斜杠开头,且路径出现的文件的不同,其默认的参照路径是不
同的。这是我们学习的重点,是路径问题中最容易出错的地方:确定相对路径的参照路径。
(1)以斜杠开头的相对路径
以斜杠开头的相对路径,根据路径所在文件所处位置的不同,分为两种:前台路径与后台路径。
A、 前台路径
所谓前台路径是指,由浏览器解析执行的代码中所包含的路径。例如,html、css、js中的路径,及 jsp 文件中静态部分的路径(HTML 标签中的路径)。例如,html 及 jsp 文件中 的<img src=””/>、<a href=””></a>、<form action=””></form>等标签中的路径;再如,css 文件中的 background:img(“”)等属性中的路径,js 文件中的window.location.href=”” 等属性中的路径,都属于前台路径。
前台路径的参照路径是 Web 服务器的根路径,即http://127.0.0.1:8080。将前台路径转换为绝对路径的工作,是由浏览器自动完成的。该路径的作用是要为用户提交对某种资源的请求,是要查找并定位服务器中的某资源。简单来说,前台路径的作用是“查找”。
B、 后台路径
所谓后台路径是指,由服务器解析执行的代码及文件中所包含的路径。例如,java 代码中的路径、jsp 文件动态部分(java 代码块)中的路径、xml 等配置文件中的路径(配置文件是要被 java 代码解析后加载到内存的,其中的路径会出现在 Java 代码中)等。
后台路径的参照路径是 Web 应用的根路径。如 http://127.0.0.1:8080/primary。
将后台路径转换为绝对路径的工作,是由服务器自动完成的。该路径的作用是标识出该资源在服务器中的路径,以便客户端能够按照这个设定路径来查找相应资源。简单来说,后台路径的作用是“标识”。
C、 后台路径特例
对于后台路径的参照路径有一个特例:当代码中使用 response 的 sendRedirect()方法进行重定向时,若其参照路径是以斜杠开头,则其参照路径不是 web 应用的根路径,而是 web服务器的根路径。
例如,执行 response.sendRedirect(“/show.jsp”);将会报 404 错误。因为其参照路径是Tomcat 的根,而非当前项目的根。所以若要使用重定向,就需要在路径上添加上项目名称:
response.sendRedirect(request.getContextPath + “/show.jsp”);
为什么这里是特例?因为 sendRedirect()方法可以重定向到其它应用,若不指定要跳转的应用,其将无法确定跳转方向。
(2) 以路径名称开头的相对路径
以路径名称开头的相对路径,无论是出现在前台页面,还是出现在后台 Java 代码或配置文件中,其参照路径都是当前访问路径的资源路径。即使是 response 的sendRedirect()方法的参数路径,若不以斜杠开头,其也属于“以路径名称开头的相对路径”类,参照路径为
当前访问路径的资源路径
(3) 总结

前台路径问题举例
(1) 超链接例子
项目:1
A、在项目中添加资源文件
在项目中添加图片资源

B、 定义 index 页面
<body>
<!--
此时的src的值为--个前台路径,前台路径的参照路径是当前Web服务器的根
http: //localhost: 8080
也就是说,这个src所要访问的绝对路径等于参照路径+前台路径,即
http://localhost: 8080/images/car .jpg,所以图片是无法显示的
只要为这个路径添加上当前应用的根路径,就应该可以访问到图片
-->
<img alt="cars" src="/images/car.jpg">
<!--这个可以访问到图片-->
<img alt="cars" src="/relativePath/ images/car. jpg">
</body>
(2) 表单例子
项目:2
A、定义 index 页面
<body>
<!--
这里的action的值为前台路径,其参照路径是当前Web服务器的根http: //localhost:8080
当用户提交这个前台路径后,浏览器需要将这个相对路径转换为绝对路径后才可定位这个请求的资源。
我们知道,绝对路径=参照路径+前台路径,也就是说,浏览器会将表单提交的/someServlet路径
转换为: http://localhost : 8080/someServlet,提交给服务器。服务器会从服务器自己的根
下查找名称为someServlet的资源。没有这个资源,所以会报404.
-->
<form action="/someServlet">
name:<input type="text" name="name "/><br>
<input type="submit" value="login"/>
</form>
<!--这个访问没有问题-->
<form action="/relativePath2/someServlet">
name: <input type="text" name="name "/><br>
<input type="submit" value="Login"/>
</form>
</body>
B、 定义并注册 Servlet
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response )
throws ServletException,IOException {
System.out.print1n(" --------- someServlet -----------");
}
}
后台路径问题举例
(1) 配置文件中路径的分析
直接分析项目2的 web.xml 配置文件中对 SomeServlet 的注册,其中
路径以斜杠开头,表示的意义。
<servlet>
<servlet-name>SomeServlet</servlet-name>
<servlet-class>com. abc. servlets . SomeServlet</servlet-class>
</servlet>
<!--
为什么Servlet的<url-pattern>值要以斜杠开头?
在XML文件中以斜杠开头的路径为后台路径,其参照路径为当前Web应用的根,
就本例而言,是http: //localhost:8888/relativePath2.
这个<url-pattern>值转换为绝对路径后就是:
http://localhost :8080/relativePath2/ someServlet
这里的<url-pattern>所表示的意思是:你若要访问我这里定义的这个
Servlet,你就需要提交这样一个绝对 路径请求:
http: //localhost : 8080/relativePath2/ someServlet
-->
<servlet -mapping>
<servlet-name>SomeServlet</servlet-name>
<url-pattern> / someServlet< /url-pattern>
</serv1et-mapping>
(2) Java 代码中路径的分析
项目:3
A、定义并注册 SomeServlet
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System. out. println(" --------- someServlet -----------");
//这个路径是后台路径,后台路径的参照路径是:当前Web应用的根,对于本例来说是
// http: //localhost : 8080/relativePath2.服务器需要将这个
//后台路径转换为绝对路径后完成跳转。我们知道,绝对路径=参照路径+后台路径
//即这个绝对路径是: http: //localhost:8080/relativePath2/otherServlet ,
//根据web . xm1中对于OtherServlet的注册<ur1-pattern>值可知,只要浏览器提交
// http://localhost :8080/relativePath2/otherServlet请求,就可以访问到
// otherServlet,而我们这里的确提交的是这个路径,所以这个后台路径是可以访问到
// otherServlet的
request. getRequestDispatcher(" /otherServ1et"). forward(request, response);
}
}
B、 定义并注册 OtherServlet
public class otherServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
System. out . println(" --------- otherServlet ----------");
}
}
C、 特例举例
直接修改 项目3的 SomeServlet 的跳转方式
public class SomeServlet extends HttpServ1et {
public void doGet (HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
System. out. println(" ---------- someServlet ----------");
// sendRedirect( )中的路径的参照路径,不是当前Web应用的根,而是当前Web服务器的根,为什么?
//因为sendRedirect()方法不仅可以完成在当前Web应用中的跳转,还能够完成到其它应用的跳转。
//所以在设计这个方法时,就没有将其路径的参照路径指定为当前Web应用的根
response. sendRedirect(request. getContextPath() + "/otherServ1et");
}
}
以路径名称开头的相对路径举例
(1) 超链接例子
直接修改项目1中的 index 页面,在其中添加如下内容:
<!--
这是一个不以斜杠开头的相对路径,不以斜杠开头的相对路径的参照路径是:
当前访问的请求路径。就本例而言,就是http://localhost: 8080/relativePath。
浏览器会自动将这个相对路径转换为绝对路径。绝对路径=参照路径+相对路径。即
http: //localhost : 8080/relativePath/ images/car . jpg.
所以应该可以访问到图片。
-->
<img alt="cars" src="images/car.jipg">
(2) 表单例子
直接修改项目2中的 index 页面,在其中添加如下内容
<!--
这是一个不以斜杠开头的相对路径,其参照路径为当前访问路径的请求路径,即
http: //localhost:8080/relativePath2,浏览器会自动将这个相对路径转换为
绝对路径,即http: //localhost: 8080/relativePath2/someServlet
根据web. xm1中<url-pattern>对SomeServlet的访问路径要求,我们现在提交的
这个路径是满足要求的,所以这个请求是没有问题的。
-->
<form action="someServlet">
name: <input type="text" name="name "/><br>
<input type="submit" value="login"/>
</form>
Java 代码中的路径例子
直接修改项目3中的 SomeServlet。
public class SomeServlet extends HttpServ1et {
public void doGet(HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
System. out. print1n(" --------- someServlet ----------");
//可以完成跳转
request. getRequestDispatcher("otherServlet" ).forward(request, response);
//可以完成跳转
// response. sendRedirect("otherServlet");
}
}
有问题可以评论告诉我,觉得还可以的话点个赞再走呗
本文详细介绍了Servlet访问路径的组成,包括绝对路径和相对路径的概念及其在Web应用中的应用。绝对路径是能直接定位资源的URL,而相对路径需要结合参照路径才能定位。在Web开发中,前台路径(如HTML、CSS、JS)参照Web服务器的根路径,后台路径(如Java代码)参照Web应用的根路径。sendRedirect()方法的特殊性在于,以斜杠开头时参照Web服务器的根路径。文中通过实例分析了不同路径类型的使用场景和转换规则。

1551

被折叠的 条评论
为什么被折叠?



