服务器的两大跳转方式

上传人:M****1 文档编号:458620457 上传时间:2023-02-14 格式:DOC 页数:20 大小:764.50KB
返回 下载 相关 举报
服务器的两大跳转方式_第1页
第1页 / 共20页
服务器的两大跳转方式_第2页
第2页 / 共20页
服务器的两大跳转方式_第3页
第3页 / 共20页
服务器的两大跳转方式_第4页
第4页 / 共20页
服务器的两大跳转方式_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《服务器的两大跳转方式》由会员分享,可在线阅读,更多相关《服务器的两大跳转方式(20页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 服务器的两大跳转方式:1.1浏览器跳转(重定向跳转)Servlet中使用的最多的跳转就是浏览器跳转,也就是重定向跳转,而浏览器跳转也是最常用的跳转方法之一。图1:浏览器跳转的基本流程示意图浏览器跳转,在跳转的过程中会通知浏览器,也就是说,每一次发生跳转,浏览器都是可以知道的,并且浏览器上的URL路径会随着页面的跳转而发生改变。我们从上节课的知识中知道了请求头和响应头的存在,浏览器会将请求的信息封装在请求头中,并发送给Servlet,而响应头则会在第一时间将信息响应给浏览器,因为响应头中并不包含网页代码,它只包含了是否发生跳转、网页访问是否超时等诸

2、如此类的信息,浏览器在解析了响应头中的信息后,如果发现需要进行跳转,那么浏览器就会再次访问跳转后的目标页面,然后再将新的页面信息呈现给用户。浏览器跳转,会对Tomcat服务器产生两次访问,因为浏览器除了访问最初的页面外还访问了跳转后的新的页面,所以同理,由于它对Tomcat服务器发生了两次访问,所以它具有两副Request和Response对象(第一次访问Tomcat服务器和第二次访问Tomcat服务器都分别产生了一副Request和Response对象)。1.2服务器转发(服务器内部跳转)服务器转发和浏览器转发最大的不同就是,在服务器转发的过程中浏览器是全然不知的,也就是说,在使用服务器转发

3、的方式进行跳转页面时,浏览器是根本不知道服务器发生了跳转的,所以这种跳转方式也叫做服务器内部跳转。图2:服务器转发的基本流程示意图而使用服务器转发,浏览器上的URL路径也是不会发生改变的,就如,用户看到的URL路径是对A页面进行访问的路径,但实际上用户已经访问到了B页面(这里可以是对静态页面进行访问,也可以是对Servlet进行访问),只是浏览器并不知道在服务器内部发生了转发而已,在整个服务器转发的过程中只会产生一副Request和Response对象。1.3浏览器跳转和服务器转发的实际举例1.3.1浏览器跳转:我们书写一个简单的浏览器跳转:当我们访问ServletAAA页面时,它会跳转到Se

4、rvletBBB页面上:代码部分:public class AAA extends HttpServlet public void doGet(HttpServletRequest request, HttpServletR esponse response)throws ServletException, IOException /跳转到ServletBBB,当然也可以跳转到Html页面response.sendRedirect(BBB);public class BBB extends HttpServlet public void doGet(HttpServletRequest req

5、uest, HttpServletResp onse response)throws ServletException, IOException /带值给浏览器,也就是将信息显示在浏览器而不是控制台上 PrintWriter out = response.getWriter();out.println(我是ServletBBBBBBBBB); out.flush(); out.close();代码执行结果:由图上,我们可以看到,我们明明输入的路径是http:/localhost/201411 14/AAA,但在我们点击回车请求访问后它的路径就变为了http:/localhost /201411

6、14/BBB,这就是浏览器跳转,它的URL路径地址是随着页面的变化而发生变化的。那么,我们怎么才能知道,浏览器跳转中使用的是两副Request和Response对象呢?我们可以分别将它们的Request和Response对象的内存地址打印出来,并让AAA中的Request对象带上一个值,看在BBB中的Request对象是否可以得到这个值(如果是同一个Request对象就一定可以取到这个值):代码部分:public class AAA extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResp

7、onse response)throws ServletException, IOException /为Request对象设置一个键值对(存入值)request.setAttribute(user, yezi);/跳转到ServletBBB,当然也可以跳转到Html页面System.out.println(AAA_request:+request);System.out.println(AAA_response+response);response.sendRedirect(BBB);public class BBB extends HttpServlet public void doGet

8、(HttpServletRequest request, HttpServletResp onse response)throws ServletException, IOException System.out.println(BBB_request:+request);System.out.println(BBB_response+response);System.out.println(Request_Value:+request.getAttribute(user);PrintWriter out = response.getWriter();out.println(ServletBB

9、BBBBBBB);out.flush();out.close();代码执行结果:由图我们可以看到,虽然AAA和BBB的Request和Response对象的内存地址看起来好像是相同的,但是最重要的值却没有被取出来,图上显示为null,这就说明了它们并不是同一个Request对象。1.3.1服务器转发:接下来我们书写一个服务器转发,同样使用Request对象带值的方式来检测转发前后的Request对象是否为同一个Request对象:代码部分:public class AAA extends HttpServlet public void doGet(HttpServletRequest requ

10、est, HttpServletR esponse response)throws ServletException, IOException / 为Request对象设置一个键值对(存入值)request.setAttribute(user, yezi);/ 获得一个转发对象(目标页面BBB)RequestDispatcher re_D = request.getRequestDispatcher (BBB);/ 开始服务器转发(并将Request对象和Response对象一齐传递下去)re_D.forward(request, response);public class BBB exte

11、nds HttpServlet public void doGet(HttpServletRequest request, HttpServletR esponse response)throws ServletException, IOException System.out.println(Request_Value:+request.getAttribute(user);PrintWriter out = response.getWriter();out.println(ServletBBBBBBBBB);out.flush();out.close();代码执行结果:浏览器结果:从上述两

12、个结果我们可以看到,使用Request带值的方法可以看出服务器转发中的Request对象是同一个对象,并且使用服务器转发的方式时,URL路径不会发生改变,虽然我们访问到的是BBB页面,但是URL路径依然显示为AAA页面的地址。PS:以下四个方法十分重要,如我我们想使用到这几个方法,就需要使用服务器转发的方式,因为只有服务器转发的方式才可以将值带给下一个页面,只有服务器转发方式产生的Request对象和Response对象才会一直传递下去,数据才不会丢失:request.setAttribute(键, 值);request.getAttribute(键);request.removeAttrib

13、ute(键);/得到所有键值对的键的名称request.getAttributeNames();这几个方法在重定向跳转中是没有用的,因为它每一次的Request对象和Response对象都是新的。1.4使用两种转发方式的具体情况通过实验,我们可以看到,在浏览器跳转中我们使用到了两副Request和Response对象,它的这两个对象,在完成一来一回的数据传递后生命周期就会结束,所以,如果我们想利用Request和Response对象为我们携带数据到下一个页面,是不可能的;而服务器转发全程只是用到了一副Request和Response对象,所以我们完全可以使用它为我们携带数据去下一个页面中,因为

14、它的Request和Response对象在整个过程是是一直被传递下去的,所以它完全可以作为携带数据的载体。综上所述我们可以知道:浏览器跳转方式,也就是我们所说的重定向跳转适用于大部分时候的转发,而服务器转发适用于我们想要给下一个页面带去值和对象的时候。1. Cookie和Session我们知道,Request对象和Response对象的生命周期是很短的,当浏览器对Tomcat服务器发出请求时Request对象和Response对象的生命周期就开始了,然后当Servlet将内容响应给浏览器后Request对象和Response对象的生命周期就结束了,那么有没有生命周期更长的通讯技术呢?那就是我们

15、接下来要讲到的Cookie技术。图3:Request对象和Response对象的生命周期2.1 Http协议Http也就是超文本传输协议它基于TCP协议之上,TCP由ServerSocket类和Socket类进行支撑,Tcp协议是有状态的,它的连接过程是由客户端连接到服务器,它会询问服务器时候存在,如果服务器存在,它才会建立连接,一旦连接建立起来,通讯就可以一直进行下去,进行长时间的连接。但是,Http协议没有办法做成长时间的连接,这是因为长时间连接十分耗费服务器的资源,因此,Http协议的需求就是既要使用TCP的特性,又要打破TCP长时间连接的特点,从而制作一个短时间交互的通讯。使用Http协议访问页面时,数据一去一回生命周期就结束了,下一次再访问页面就又是是新的的用户新的一去一回了,Http协议是无状态的,所以对于Http协议来说,每一次来访问的对象都是新的客户,至于客户来了多少次,是否登陆过这个网站,是否在网

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号