现在的位置: 首页 > 综合 > 正文

一个request穿越多个jsp(servlet)页面的情况的讨论

2014年09月05日 ⁄ 综合 ⁄ 共 2003字 ⁄ 字号 评论关闭

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的相似和不同。

forward跳转:<jsp:forward page="跳转页面地址" />:a.服务器端跳转,地址栏不改变;b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源);c.request设置的属性在跳转后的页面仍可以使用;d.使用<jsp:param name="参数名" value="参数值" />传递参数。
 
sendRedirect跳转:response.sendRedirect("跳转页面地址"):a.客户端跳转,地址栏改变;b.所有代码执行完毕后跳转;c.跳转后的页面不能使用上一个页面的request属性;d.使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。

Response.sendRedirect是两个不同的request,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
 
JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味

 

JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味

 

 

使用forward时,由于只是发送一次request请求,request设置的属性(setAttribute)依然能保留在下一个页面。
使用sendRedirect时,由于发送两次request请求,所以在下一个不能获取request属性。但可以通过重写URL的方式

RequestDispatcher  是请求转发,
RequestDispatcher  的实例化对象有两种转发手段,forward和include,其实就是对应前面说的jsp的两种标签
请求转发,全程只有一个request,它是在服务器端完成的转向,和客户端无关,所以用户在浏览器的地址还是第一次请求的地址。

抱歉!评论已关闭.