前置知识
- / 表示根目录
- ./表示当前目录,可省略
- …/表示上一级目录
- 一个Java Web完整的url请求组成
协议//ServerIP:port/context root/ServletPath?query string
问题背景
在JavaWeb开发的前端界面,我们一般采用绝对路径。
这里简单聊一下绝对路径的好处。
当一个html里面含有a链接标签、form表单、iframe框架时,如果href属性或者action属性采用相对路径,并且其中带着ServletPath。
形如 <a href = "user.do? ……
如果这个html文件的文件路径很深,形如
context root/aaa/bbb/ccc/ddd/xx.html
因为a标签和此html处在同级目录,则它的href指向的完整路径则是
context root/aaa/bbb/ccc/ddd/user.do?
这样无论是在web.xml中的url-pattern或者servlet类的注释配置会变得很长,非常不方便。
问题
在编程过程中,我发现有几个地方是不用加斜杠,不采用绝对路径的。
- request的getRequestDispatcher方法
- response的sendRedirect方法
- js中会用到的window.location.href
第一个是服务器的内部转发,目标资源地址由服务器解析,如果转发前的servletPath已经是在根目录下(根目录为context root),则
getRequestDispatcher(“/index”)和getRequestDispatcher(“index”)是一样的。
第二个是重定向,第三个是js的全局变量。目标资源地址由浏览器解析,在浏览器端完成的。因此此时的根目录是ServerIP:port
所以sendRedirect(“/index”)或window.location.href="/index"是绝对不可取的,它实际效果是形如 http://localhost:8080/index 直接把context root跳过了!!!
而以上这些采用相对路径的请求,是将前一个发送的请求作为参考点形成新的请求。
设前一个请求是https://localhost:8080/webapp01/index/aaa/bbb/ccc
如果采用相对路径,新的请求则是https://localhost:8080/webapp01/index/aaa/bbb/xxx