zoukankan      html  css  js  c++  java
  • servlet中请求转发(forword)和重定向(redirect)的区别

    servlet请求转发与重定向的区别:

    request.setAttribute("test","hello");

    request.getRequestDispatcher("/test.jsp").forword(request,response);

    request.sendRedirect("test.jsp");

    一 显示结果:

    1.当用request.getReuqestDispatcher("/test.jsp").forword(reuqest,response);请求转发后,结果页面输出:hello

    2.当用response.sendRedirect("test.jsp");重定向后,结果页面输出null

    二 底层分析

    1.请求转发(RequestDispatcher)的过程:

    客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispatcher()方法,请求转发给指定的test.jsp,整个流程都在服务器端完成,而且是在同一个请求里完成,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端,整个过程是一个请求,一个响应

    2.重定向(sendRedirect)的工作原理:

    客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后,调用了sendRedirect()方法,这个方法是response的方法,所以当这个servlet处理完之后,看到response.sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须在发送一个请求,去访问test.jsp,紧接着客户端收到请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干涉,相互独立,在前面request里面setAtrribute()的任何东西,在后面的request里面都获得不了,可见在sendRedirect()里面是两个请求,两个响应

    三、表面分析:

    1、当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet
    这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等
    着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就
    不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。
     
    2、当用sendRedirect重定向后,地址栏为http://localhost:8080/test/test.jsp
    因为这个时候,客户端已经知道了他第二次请求的是test.jsp,服务器已经告诉客户端要去访问test.jsp了,所以地址栏里会显示想要访问的结果。
  • 相关阅读:
    pat 甲级 1065. A+B and C (64bit) (20)
    pat 甲级 1064. Complete Binary Search Tree (30)
    pat 甲级 1010. Radix (25)
    pat 甲级 1009. Product of Polynomials (25)
    pat 甲级 1056. Mice and Rice (25)
    pat 甲级 1078. Hashing (25)
    pat 甲级 1080. Graduate Admission (30)
    pat 甲级 团体天梯 L3-004. 肿瘤诊断
    pat 甲级 1099. Build A Binary Search Tree (30)
    Codeforce 672B. Different is Good
  • 原文地址:https://www.cnblogs.com/xilichenbokeyuan/p/6385267.html
Copyright © 2011-2022 走看看