资源路径 和 资源名称
以访问栏信息最后一个斜杠为标准,前面的是资源路径后面的为资源名称
对于url和uri都是一样的
例:以下是一个url路径

http://localhost:8080/14-requestDispatcherForward/loginServlet

以下是一个uri路径

/oo/xx/jj/index.html

绝对路径和相对路径
web应用的绝对路径就是url

绝对路径=相对路径+参照路径

相对路径
分为两大类:1.以斜杠开头的 2.以路径名称开头的
1.以斜杠开头的
分为前台路径和后台路径

前台路径,是由浏览器解析执行的代码文件中所包含的路径,如html文件里,css文件,js文件
将前台路径转换为绝对路径的工作是由浏览器完成的
在这里插入图片描述
例子,给出以下例子
在一个web项目下,html文件如何写这个temp.jpg的路径
在这里插入图片描述

	<!-- 如果按照以下格式写的话斜杠开头是一个相对路径,同时是放在html文件中的,
		所以是一个前台路径,根据分析,知道绝对路径 = 参照路径+相对路径
		前台路径中的参照路径为服务器的根目录 则为http://localhost
		则以下绝对路径为 http://localhost/images/temp.JPG   明显是不对的,缺少一个找到web应用的标识
	 -->
	<img alt = "temp" src = "/images/temp.JPG">

同时主要web应用的根是在WebContent文件下的

在这里插入图片描述所以更改后的访问方式如下,这样绝对路径=相对路径+参照路径就可以成功访问了

<img alt = "temp" src = "/17-relativePath/images/temp.JPG">

以斜杠开头的相对路径,对于访问表单提交访问servlet的代码如下
注意这里提交后面要跟url-parttern 而不是servle-tname

<form action="/17-relativePath/login" method="GET">

后台路径,主要区分web服务器路径的根路径和web应用的根路径
在这里插入图片描述
后台路径是以当前web应用根路径为参照路径
绝对路径= 参照路径+相对路径

后台路径的参照路径如下

http://localhost/17-relativePath

以下例子是xml配置文件里:
后台路径是由服务器解析的,如下面这段代码,服务器就会解析为
http://localhost/17-relativePath/login

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

注意:后台路径的绝对路径,其作用是“标识”,标识的意思就是当浏览器想访问这个资源(LoginServlet)时,就得通过输入标识来访问

当客户端提交请求为:http://localhost/17-relativePath/login,才能访问到LoginServlet

以下例子是服务器中的java代码块,以资源跳转中的(请求转发)为例
分析模式与.xml文件一样,后台路径以web应用的根路径为参照路径

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("login GET请求");
		System.out.println("req == " +req);
		System.out.println("respones = " + resp);
		
		req.getRequestDispatcher("/other").include(req, resp);
	}

以下例子是服务器中的java代码块,以资源跳转中的(重定向)为例
因为重定向是重新向浏览器提交信息,所以决定了它可以跳转到其他web应用,所以重定向提交到浏览器,是由浏览器解析,所以重定向提交时,是以web服务器的根目录为参照路径。(同时注意resp.sendRedirect为这种特例,其他重定向还是遵循后台路径提交规则)

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("login GET请求");
		System.out.println("req == " +req);
		System.out.println("respones = " + resp);
		// 下面的写法无法完成跳转
		resp.sendRedirect("/other");
		//下面的方法虽然可以完成跳转,项目名称固定了
		resp.sendRedirect("/17-relativePath/other");
		//最好的写法,可以获取当前目录的名字,而且项目名称改变也无所谓
		resp.sendRedirect(req.getContextPath()+"/other");
	}

2.以路径名称开头的相对路径
浏览器/web服务器均适用
参照路径为:当前访问路径的资源路径

以下是前台路径(不严谨的说法):
以.html文件里为例
当访问这个html文件时:绝对路径为:http://localhost/16-relative/index.html
http://localhost/16-relative为资源路径,index.html为资源名称
以下是一个以“路径名称开头的相对路径”,其参照路径是“当前访问路径的资源路径”
可以看到资源路径是动态变化的,具体情况具体分析

<img alt = "temp" src = "images/temp.JPG">

再以html的表单form提交提交

//可以看到是一个路径名开头的相对路径,则要找资源路径
//对于本例而言访问html文件的绝对路径为http://localhost/16-relative/index.html
//则资源路径为http://localhost/16-relative
<form action="loginServlet"  method = "GET">

以下是后台路径(不严谨的说法,对比带斜杠路径的说法)
在.xml文件下的

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>  //这个斜杠不能去掉,因为他是用来标识资源得,相当于是后面有资源路径这个概念的前提
  </servlet-mapping>

java服务器中的代码块

//这时候的绝对路径是http://localhost/16-relative/SomeServlet
//则资源路径为http://localhost/16-relative
//故通过以下格式提交是没问题的
req.getRequestDispatcher("other").forward(req,resp);
//同样的重定向也是适用的,就没有前面前台路径的特例了
resp.sendRedirect("other");	

总结注意,若加上斜杠与不加斜杠都能跳转的话,那么选择加上斜杠,因为加上斜杠是以当前web应用根目录为参照是不会变得。而不加斜杠是以资源路径为参照,是不会改变的

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐