request的范围

今晚研究了好久这个东西,还是不太清楚,先讲一下我的想法。

先了解一下服务端跳转和客户端跳转,请看下面: 服务器端跳转是由客户端发送一个请求,请求一个服务器资源——如JSP和Servlet——,这个资源又将请求转到另一个服务器资源,然后再给客户端发送一个响应,也就是说服务器端跳转是客户端发送一次请求,服务器端给出一次响应;而客户端跳转的流程则不同。客户端同样是发送一个请求给服务器端资源,这个服务器资源会首先给客户端一个响应,客户端再根据这个响应当中所包含的地址,再次向服务器端发送一个请求,也就是说客户端跳转是两次请求,两次响应。

注意:上述的服务器转发全程是没有客户端参与的,都在web container容器内部进行,没有任何服务器和客户端的通信,实际就是服务器内部的跳转

服务器跳转中,request能保存属性,例如从b.jsp跳到a.jsp中,在b.jsp中用request.setAttribute设置属性,在a.jsp中用getAttribute或getParameter获取属性。这还是原来的请求,并未再次向服务器发送请求。

那么在request中有两种形式可以服务器跳转,地址栏不变

<!-- lang: java -->
1.<jsp forward/>
2.getRequestDispatchar("/a.jsp").forward(request,respone)

<!-- lang: java -->

   但是还有一种<form action="a.jsp">表单形式。假设b.jsp包含表单,运行后地址栏会变成a.jsp,并跳转到a.jsp(其中from表单会收集表单的内容发送给a.jsp),然后a.jsp通过request中的getParameter()获取表达代表的请求参数。<br/>    这也是request的作用,符合request中的一次请求一次回应,没有失效,即b.jsp发送到a.jsp中,其实已经发送到服务端(.jsp在服务器端),然后服务器端中的a.jsp响应了这次事件。服务器端跳转是地址栏不变,客户端一次请求一次回应,而表单只有单向,客户端请求服务器响应,显然我的总结是request不一定是服务器跳转,也可能存在这种形式。

以下我查阅的,我感觉挺合理,地址是http://blog.sina.com.cn/s/blog_6151984a0100kkfn.html

forward是服务器内部转发

标准流程如下:<br/> 1.客户端浏览器发送HTTP request到服务器<br/> 2.服务器在接收到客户端request之后,分别创建出HttpServletRequest对象和HttpServletResponse对象,然后调用所请求的servlet的 service方法,同时将HttpServletRequest对象和HttpServletResponse对象传递过去.<br/> 3.当servlet,调用forward方法时,服务器根据forward转发的url找到对应的servlet,(如果forward jsp,则调用的是web container为jsp生成的java bean) 服务器转发全程是没有客户端参与的,都在web container容器内部进行,没有任何服务器和客户端的通信,实际就是服务器内部的跳转<br/> 4.注意这里,与1.的调用servlet不同: 这次forward, 服务器没有构建HttpServletRequest对象和HttpServletResponse对象 而是将原来的HttpServletRequest对象和HttpServletResponse对象传递给jsp过去

 sendRedirect是客户端转发

1.当sendRedirect方法被执行,同时也意味着一次http request请求的结束 此时,服务器会向客户端发送302状态码和新的url,告诉客户端重新发送request请求到新的url

<!-- lang: java -->
HTTP/1.1 302 Found
Location: http://localhost:9080/AppIndex.jsp
Content-Language: zh-CN
Content-Length: 0
Set-Cookie: JSESSIONID=00003FhtMbQNx1naY0MZ05XJeMz:-1; Path=/
Date: Wed, 29 Aug 2007 16:37:31 GMT
Server: WebSphere Application Server/6.1
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"

2.当客户端根据302状态码发送新的请求到到新的url的时候,新的请求-响应流程重新开始<br/> 4.这时候服务器重新创建HttpServletRequest对象和HttpServletResponse对象<br/> 5.此时两个请求已经不在一个线程了,更不用说request和response对象了<br/> 所以此时在如果想把数据传递到新的servlet或新的jsp的request内,那么只能使用url?值/对的方式

备注:仅仅是我的想法,求更正,我困惑了好久。

转载于:https://my.oschina.net/swords/blog/117844

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值