之前写过一篇页面跳转之Forward和Redirect的文章,简单介绍了转发和重定向之间的几点区别,这里做一些补充,主要是关于他们在request共享方面的一些区别和对其作用域的详细描述。
首先,我们都知道转发和重定向的区别之一在于是否会改变地址栏,那么为什么呢?
先说转发,它不会改变地址栏。转发是在服务器端进行的,用的是同一个request,在它转发到的地址页面中可以取出来。
示例图:
图1 服务端转发机制
从上图可以看出,整个转发过程只有一个request,他从Web客户端到Jsp是一个共享的过程。而此时Jsp页面并不知道一个新的东西来了,所以也不会改变地址。
code:
/将学生列表集合设置到request中
request.setAttribute("student_list",studentList);
//转发到student_list.jsp
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
//接收
<%
List<Student> studentList = (List)request.getAttribute("student_list");
for(Iterator<Student> iter=studentList.iterator();iter.hasNext();){
Student student = iter.next();
}
%>
再说说重定向,它改变了地址栏。
重定向是客户端进行的活动,要用response。先来看图:
图2 客户端重定向机制
从图中可以看出,Web客户端先把一个request请求传递给Jsp,而后Jsp 发送一个状态码回去;第二次Web客户端再请求request就不是之前的那个了,也就是这两个request不同,非共享的。这样就导致了地址的改变。
code:
response.sendRedirect(request.getContextPath() + "/student_list.jsp");//重定向到student_list.jsp
小结:这篇文章主要是对转发和重定向的机制做了图和代码的补充描述,随着之后的学习,如果有新的观点或心得我们再深入讨论。