一个request穿越多个jsp(servlet)页面的情况的讨论
request一般用于客户端提交数据,大部分时候,它的生存周期很短,只是从c1->s1两个页面之间传递的时候存在,一旦s1完成response,这个请求就被销毁了。
这是从服务器执行的角度来看的,如果从编码角度看呢。request是可以在多个页面使用的。
1,include,在主页面声明以下代码,
<jsp:include page="included.jsp">
<jsp:param name="User" value="HiFi King" />
</jsp:include>
即可在included。jsp页面中使用该request,include标签类似于把included.jsp的代码直接嵌入在include.jsp声明标签的位置。
这点可以在客户端查看页面源代码,included.jsp的代码出现在了页面中。同时,因为是嵌入,所以include。JSP页面后面的代码仍然是可以执行的。
2,forward
在主页面声明以下代码
<body>
<%request.setAttribute("name1", "test1") ;%>
<jsp:forward page="forwardTo.jsp">
<jsp:param name="userName" value="riso" />
<jsp:param value="name2" name="test2"/>
</jsp:forward>
<%request.setAttribute("name3", "test3") ;%>
<%System.out.println("code after forward"); %>
this is forward.jsp code after “forward” tag
</body>
forwardto.jsp页面则打印三个参数,name1,2,3.
实验可知,n1和n2分别用getParameter和getAttribute可以得到数据,而n3则没有。
原因是,代码执行的时候,到forward标签这里就转进去了, </jsp:forward>forward结束之后的所有语句都不会得到执行。
同时,和include不同,用户停留的页面不是主页面,而是forward指向的页面,查看源代码,也只能看见指向页面的源代码。
3,请求转发和重定向
先说重定向,看这个的代码 response.sendRedirect("myResult.jsp");
前面也说过了,服务端一旦对请求作出响应(response)那么表示这个请求已经完成了,这个请求马上就会被销毁。
所以这个时候发生的事情是response.sendRedirect("myResult.jsp");被执行,用户的请求已经完成了,同时告知客户端重使用get方式新向新的目标发起请求。
如果用浏览器的网络监听工具如firebug(傲游的开发者工具也可以)监听网络请求,可以发现,有两个请求产生,一个是用户主动发出的,一个是用户被服务器端告知需要重定向自动发出的。
下面摘录一段http://aixiangct.blog.163.com/blog/static/91522461201123111443587/的内容说明下重定向与forward的相似和不同。
Response.sendRedirect是两个不同的request,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
RequestDispatcher 是请求转发,RequestDispatcher 的实例化对象有两种转发手段,forward和include,其实就是对应前面说的jsp的两种标签请求转发,全程只有一个request,它是在服务器端完成的转向,和客户端无关,所以用户在浏览器的地址还是第一次请求的地址。