> 웹 프론트엔드 > HTML 튜토리얼 > <jsp:forward>、requestDispatcher和sendRedirect()的区别_html/css_WEB-ITnose

<jsp:forward>、requestDispatcher和sendRedirect()的区别_html/css_WEB-ITnose

WBOY
풀어 주다: 2016-06-24 12:34:59
원래의
1390명이 탐색했습니다.

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是重定向(通过浏览器)。

forward转发是在容器内部实现的同一个Web应用程序的之间的转发,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。 forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。 基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。  使用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

<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="sycode" name="code"><html> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<title>web</title> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<h1>我的技术博客:http://zhaoyuqinag.blog.51cto.com</h1> 
로그인 후 복사
</body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</html> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<pre class="sycode" name="code"><%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
로그인 후 복사
로그인 후 복사
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="sycode" name="code"><html>
로그인 후 복사
로그인 후 복사
<head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<title>web</title> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<%   
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    System.out.println("====forward跳转之前=========");  
로그인 후 복사
%> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
<jsp:forward page="turnAfter.html"/> 
로그인 후 복사
<%   
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    System.out.println("====forward跳转之后=========");  
로그인 후 복사
%> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
</body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</html> 
로그인 후 복사
로그인 후 복사
로그인 후 복사

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

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

<pre class="sycode" name="code"><%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
로그인 후 복사
로그인 후 복사
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="sycode" name="code"><html>
로그인 후 복사
로그인 후 복사
<head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<title>web</title> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</head> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
<%   
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    System.out.println("====response跳转之前=========");  
로그인 후 복사
%> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   <% response.sendRedirect("turnAfter.html");%> 
로그인 후 복사
<%   
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
    System.out.println("====response跳转之后 =========");  
로그인 후 복사
%> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
</body> 
로그인 후 복사
로그인 후 복사
로그인 후 복사
</html> 
로그인 후 복사
로그인 후 복사
로그인 후 복사

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

           

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

관련 라벨:
원천:php.cn
이전 기사:重拾CSS基础?开篇_html/css_WEB-ITnose 다음 기사:bootstrap 3.0 LESS源代码浅析(二)_html/css_WEB-ITnose
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
최신 이슈
관련 주제
더>
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿