路径问题
1. 完整的URL路径
(1). url的组成部分
- 协议:http:// https://
- 服务器主机地址:localhost ip地址
- 服务器端口:8833 port端口
- 项目的虚拟路径(部署路径):web_demo01
- 具体项目上的资源路径:/test/login.html /user/add servlet的映射路径
(2) 什么时候使用完整的url路径
- 浏览器地址栏直接访问
- 一个项目中,访问另一个项目的资源
2. 相对路径
不以 “/” 开头的路径就是相对路径,
相对路径就是目标文件的url路径相对于当前文件的url路径,其中 …/ 表示上一级目录,./ 表示当前目录
目标资源的url:http://localhost:8833/web_demo01/servlet01
当前资源的ulr:http://localhsot:8833/web_demo01/test/login.html
- 优势:无论部署的项目名如何变化,访问的资源路径都不需要改变
- 劣势:如果当前资源的路径发生变化,使用相对路径访问项目内别的资源必定要发生改变
3. 绝对路径
绝对路径就是以 “/” 开头的路径,有如下两种写法:
1. 请求转发的绝对路径:"/要访问的资源路径",不需要写项目的虚拟路径
2. 不是请求转发的绝对路径:"/项目的虚拟路径/要访问的资源路径"
绝对路径:不是请求转发的情况:/要访问的资源路径
- 优势:无论当前资源的位置如何发生变化,要访问资源的那个路径都是不会改变的
- 劣势:如果当前项目的虚拟路径改变,那么所有资源的绝对路径必须要改变
重定向和请求转发
req.getRequestDispatcher("/demo").forward(req, resp);
req.getRequestDispatcher("demo").forward(req, resp);
resp.sendRedirect("/web_demo1/demo");
resp.sendRedirect("demo");
1. 请求转发
- 请求转发的地址栏不会发生变化
- 从始至终只有一次请求,也只有一次响应
- 可以请求转发到WEB-INF目录下,但是只能在本项目中请求转发,不能请求转发到其他项目中
- 请求转发的绝对路径 = /访问的资源路径,不需要加上项目的虚拟路径
Tips: 需要注意的是:
1. servletRequest的getRequestDispatcher()是可以写相对路径和绝对路径的
2. servletContext的getRequestDispatcher()只能写绝对路径
但是,需要注意的是,无论是那种方式请求转发访问资源,都只需要写资源路径,不需要写项目的虚拟路径
2. 重定向
- 重定向是两次请求,地址栏会发生改变
- 重定向可以访问外部的项目资源
- 重定向的绝对路径需要加上项目的虚拟路径 /项目的虚拟路径/访问的资源路径
- 重定向不可以访问到WEB-INF目录下的资源
重定向和请求转发相同,都可以使用绝对路径和相对路径
1. 使用绝对路径:要加上项目的虚拟路径:/项目虚拟路径/重定向的资源路径
2. 使用相对路径:不需要加上项目的虚拟路径:重定向的资源路径
需要注意的是,上面的访问方式都只能访问本项目中的资源,如若需要访问外部项目的资源,必须使用完整的 URL路径
跳转中使用request域对象的问题
Tips:
1.重定向的访问本地项目资源,不能使用request域对象
2.而请求转发访问本地项目资源,可以使用request域对象
requets域对象的声明周期在一次请求中,客户端发起请求时创建,请求结束做出响应时销毁。重定向的本质是两次请求,所以不可以使用request域对象
根目录问题
使用绝对路径时需要掌握根目录这个知识点
- web站点根目录:对浏览器而言,浏览器的根目录就是站点根目录:http://localhost:8888/
- web应用根目录:对于项目工程而言,服务器的根目录就是项目根目录:http://localhost:8888/(contextPath)/
" / "在浏览器中使用指代的就是web站点根目录,而在服务器中使用指代的就是web应用根目录
而web应用根目录就是在web站点根目录后面拼接上contextPath虚拟路径
Tips:
1. 请求转发,请求转发使用的是web应用根目录,所以会自动拼接contextPath虚拟路径,直接写访问资源路径即可
2. url-pattern就是@webServlet的值,也使用的是web应用根目录,直接写资源路径
3. 超链接:<a标签> href的url路径,使用的是web站点根目录,在点击跳转路径时需要加上contextPath虚拟路径
4. form表单的action:同样的使用的也是web站点根目录
5. 重定向:使用的也是web站点根目录,需要加上contextPath虚拟路径