在第5节中,我们请求转发使用的路径是/servlet2
req.getRequestDispatcher("/servlet2").forward(req, resp);
而我们重定向使用的路径是/web-demo3/servlet2
resp.sendRedirect("/web-demo3/servlet2");
可以看到,有时候我们需要加上虚拟根目录/web-demo3,有时候却不需要,要怎么区分呢?
这里可以看这个请求的使用对象是谁,如果是服务器,我们就不用加虚拟根目录,而如果是浏览器,就得加上虚拟根目录
比如,请求转发是在服务器内部进行的,所以它不需要加虚拟根目录。
然而,重定向是告诉浏览器访问给定链接的,使用的对象是浏览器,所以要加根目录。
表单的提交action发的请求也是一样,它的使用对象是浏览器,所以要加虚拟根目录。
同样,超链接也是从浏览器发送的,所以要加虚拟根目录。
还有一个问题:/web-demo3是虚拟根目录,它的名字是随时可以替换的,所以我们不应该把它写死
可以使用
String contextPath = req.getContextPath()
获取虚拟根目录
然后,拼接一下就可以
resp.sendRedirect(contextPath + "/servlet2");