• servlet中请求转发(forword)与重定向(sendredirect)的区别


    摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂

    servlet请求转发与重定向的区别:
    request.setAttribute("test","hello");
    request.getRequestDispacther("/test.jsp").forword(request,response); 
    response.sendRedirect("test.jsp");
     
    一、显示结果:
    1、当用request.getRequestDispacther("/test.jsp").forword(request,response); 请求转发后,结果页面输出:hello
     
    2、当用response.sendRedirect("test.jsp");重定向后,结果页面输出:null
     
    二、底层分析:
    1、请求转发(RequestDispatcher)的过程:
     
             客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用 getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成 的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果 getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
    自己的理解:结合MVC设计模式,也就是说servlet层把调service层的结果要转发给JSP界面显示
    比如我servlet得到的参数变量值和对象值,我要在JSP页面用,那么我就要用转发,先把变量和对象值set属性到request里,然后转发给某个JSP页面,那么JSP页面就可以使用了
    这里的场景可用于:界面的查询、操作成功后的弹出框提示
     
    2、重定向(sendRedirect)的工作原理:
     
                 客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这 个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个 响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp, 这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在 sendRedirect()里面是两个请求,两个响应。
     自己的理解:当servlet中处理完请求,例如修改完要保存,doedit操作的时候,我们不需要再传什么值给JSP用于界面显示,我们要传的是一个修改成功的信息,到JSP页面弹出提示框而已,这个时候,我们就可以把此成功信息给session作用域,然后在JSP页面获取这个session属性值,执行JS的弹框操作,然后servlet就可以直接是重定向
    如果弹出框提示信息你要用Request作用域去做的话,那么你就得用转发了!
     
    三、表面分析:
     
    1、当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet
    这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等
     
    着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就
     
    不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。
     
    2、当用sendRedirect重定向后,地址栏为http://localhost:8080/test/test.jsp
    因为这个时候,客户端已经知道了他第二次请求的是test.jsp,服务器已经告诉客户端要去访问test.jsp了,所以地址栏里会显示想要访问的结果。
  • 相关阅读:
    Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)
    android 旋转手机的时候,如何忽略onCreate再次被系统调用?
    在iOS 8中使用UIAlertController
    09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例
    一些工具的版本问题 valgrind gdb 以及编译
    C struct __attribute__ ((__packed__))
    C++ class 只允许堆创建/只允许栈创建
    Shell 字符串操作
    存储系统的分类
    ssh 到服务器然后输入中文保存到本地变成乱码
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5868810.html
Copyright © 2020-2023  润新知