zoukankan      html  css  js  c++  java
  • <jsp:forward>、requestDispatcher和sendRedirect()的区别

    1.会话信息保存在服务器内存上,可以断续访问,和cookie相比,其保存在服务器上。
    2.男人就像蓝牙:只有在你接近时,他才会找上你。当你离开后,他便又去找其他的“设备”了。女人就像Wi-Fi:她能看到周围所有的“设备”,但只选择强壮的那个“接入”。
    3.会话关闭:浏览器关闭,主动关闭,会话超时
    4.会话底层实现:cookie和url重写(保存的是sessionID,就是调用response.encodeURL,那么自动加上id)
    5.session里有创建时间和最后访问时间,不同于cookie(还得自己写),不过返回的是毫秒数,那么new Date(方法)
    6.javabean的类必须是public的,否则不能访问的!!!一定要用public申明
    7.BeanUtils主要提供了对于JavaBean进行各种操作。
    8.forward是服务器转发,在servlet内部,而sendRedirect是重定向(通过浏览器)。

    1. forward转发是在容器内部实现的同一个Web应用程序的之间的转发,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
    2. forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
    3. 基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。 
    4. 使用forward重定向的过程,是浏览器先向目的Servlet发送一次Request请求,然后再服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。浏览器和服务器一次请求响应(3次操作)。使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应(四次操作)。可以看出哪种方式稍快一些。
  • forward方法的调用者与被调用者之间共享Request和Response,sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。
  • 无论是forward方法还是sendRedirect方法调用前面都不能有PrintWriter输出到客户端。
       forward方法报错: java.lang.IllegalStateException: Cannot forward after response has been committed
       sendRedirect报错:java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
  •         再来看一个具体例子!!!参考:http://zhaoyuqiang.blog.51cto.com/6328846/1132795

    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <h1>我的技术博客:http://zhaoyuqinag.blog.51cto.com</h1> 
    
    </body> 
    
    </html> 
    <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
    
    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <%   
    
        System.out.println("====forward跳转之前=========");  
    
    %> 
    
    <jsp:forward page="turnAfter.html"/> 
    
    <%   
    
        System.out.println("====forward跳转之后=========");  
    
    %> 
    
    </body> 
    
    </html> 

            运行一下,看浏览器的结果,的确是跳转了,但是地址栏并没有发生改变,更有趣的是看一下服务器的结果,如下图所示:

    image

            根据结果显示,只有跳转之前,而没有跳转之后。我们再来看另一种跳转方式会怎么样。

    <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
    
    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <%   
    
        System.out.println("====response跳转之前=========");  
    
    %> 
    
       <% response.sendRedirect("turnAfter.html");%> 
    
    <%   
    
        System.out.println("====response跳转之后 =========");  
    
    %> 
    
    </body> 
    
    </html> 

            运行一下,看一下服务器的结果如下:

                image

            可以看出forward属于无条件的跳转。跳转之前的语句会执行,而跳转之后的语句将不会执行,那么如果现在在jsp中使用了JDBC的话,很明显必须子啊跳转之前进行数据库的关闭,否则数据库就再也无法关闭了;sendredirect跳转是在所有语句都执行完之后才完成的操作。

查看全文
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3431602.html
  • Copyright © 2011-2022 走看看