Tomcat 7源码学习笔记 -7 请求转发forward和重定向redirect

在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);

扫描二维码关注公众号,回复: 653317 查看本文章

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,只需要一次请求

猜你喜欢

转载自blogzhoubo.iteye.com/blog/1727653