`

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

 

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics