作者: insightcodeyk
出处: https://insightcodeyk.github.io/2018/04/12/AbsoluteAndRelativePathInTomcat/
声明: 本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0,转载请注明作者及出处。
1 form表单中action属性
1.1 绝对路径
<form action="https://www.baidu.com/"></form>
url的完全表达方式(在tomcat中就是某个虚拟主机下的某个资源的完全路径)
1.2 相对路径a
<form action="/foo"></form>
若如上所述,uri以"/"开头,则相对路径的锚就是:服务器根目录(在Tomcat中就是虚拟主机域名+端口号)
1.3 相对路径b
<form action="foo"></form>
若如上所述,uri不以"/"开头,则相对路径的锚就是:当前目录(页面)的父目录
特别注意:若是想通过action调用servlet,则这种方法只有页面位于WEB-INF下才有意义,
这句话等价于,只有当前页面的父目录是当前web应用的根目录时才有意义。
因为若当前目录的父目录不是web的根目录,则无法通过这个锚访问到任何servlet(servlet在Tomcat中是以web根目录为锚)。
因此不推荐使用这种相对路径
2 Tomcat中的重定向sendRedirect()
2.1 绝对路径
response.sendRedirect("https://www.baidu.com/");
如上所述,和form表单的绝对路径含义完全相同
2.2 相对路径a
response.sendRedirect("https://www.baidu.com/");
如上所述,以"/"开头的相对路径方法,是以服务器为锚,也就是和form表单相同
2.3 相对路径b
response.sendRedirect("/servlet/redirect");
如上所述,不以"/"开头的相对路径方法,是以当前目录(页面)的父目录为锚,也和form表单相同
3 Tomcat中的转发器getRequestDispatcher()
重点声明(容易混淆的):
转发器不能向当前web应用外请求转发,所以在转发器中的绝对路径概念和以上两个内容的绝对路径含义不同
3.1 绝对路径
request.getRequestDispatcher("/servlet/b");
以"/"开头,表示以当前web应用根目录为锚(在Tomcat中就是以web应用所在目录为锚)
3.2 相对路径
request.getRequestDispatcher("servlet/b");
不以"/"开头,表示以当前目录(网页)的父目录为锚