在servlet里面接收到一个请求以后,处理完毕,根据需要可以有几种选择:
1.直接提交response,比如response.getWriter().println();
这个比较简单,而且不怎么使用,毕竟动态生成html不是很好的选择
2.将请求转给其它的资源(比如:forward到jsp,html,servlet)
这个有两种方法可以选择,但是无论哪种方法,都是转发到当前context(web应用)下面:
(1)ServletRequest#getRequestDispatcher(String path)方法
request.getRequestDispatcher("/login.html").forward(request,response);
path如果以/开头,那么path相对于当前context的根目录
比如:当前context path是/test,那么"/login.html"相当于/test/login.html
如果path不以/开头,那么属于相对目录,path相对于当前的url目录
比如:当前url为/test/action/a/b,那么"login.html"相当于/test/action/a/login.html
(2)ServletContext#getRequestDispatcher(String path)方法
getServletContext().getRequestDispatcher("/login.html").forward(request,response);
path必须以/开头,并且path是相对于当前context的根目录
比如:当前context path是/test,那么"/login.html"相当于/test/login.html
3.重定向到其它资源(比如:redirect到jsp,html,servlet)
重定向是临时返回当前请求,然后浏览器收到响应后,自动再向redirect指定的url发起一个新的request,
这时在浏览器的地址栏中可以看到一个新的url地址。
HttpServletResponse#sendRedirect(String location)方法
(1)location前面有/,这时location是相对于当前host root
response.sendRedirect("/test/login.html");
得到的绝对url是http://localhost:8080/test/login.html
(2)location前面没有/,这时是相对于当前url目录,属于相对目录
response.sendRedirect("login.html");
如果当前url是:/test/action/a/b,那么得到的url是:/test/action/a/login.html
重定向临时返回的response和正常返回的response有什么区别呢?
(1)response的http 返回码不同
redirect:
HTTP/1.1 302 Moved Temporarily
Location: http://localhost:8080/test/action/a/login.html
正常返回的response(没有Location):
HTTP/1.1 200 OK
(2)
redirect需要两次请求,一次返回302,接着再向Location发起一次新的request
正常返回的response,只需要一次请求