3 m0 q* J1 X6 D( T; H# ]( f$ v. q! y, ~并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器” . p' s2 p/ d0 N0 S& U - g1 c) W0 A4 S8 r( U。可见,“浏览器”只发出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。2 r. C# l( l9 N4 q; S6 `
' p" W" L) q4 m3 X
* X" o- P) Z) p& ?/ w( P$ t
4.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的2 k9 H5 C' `9 Z- L
& U% b( o9 o' [% o0 Z3 J
request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理0 J8 {1 N( a! y! g! i2 f' ]( _
. r# d# W. C5 e7 D结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。: s! i! B0 e. s7 F$ m
. o# ]- g4 O! |/ A# j% ]+ \. q8 a: e3 p/ G+ r
5.无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有 9 d. e; q( i3 S/ }6 U+ b+ ]* v' Z/ I: x% b
了一些内容,这些内容将被从缓冲区中清除。 5 @2 w# H% q7 l5 L8 ] 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域, # i3 n2 f q2 |7 h' B F 1 K$ @( m) h. J& k转发也许可以帮助你解决这个问题。1 p$ K0 F* R7 A* A
R; [4 }& e& C. ?& W
重定向: 6 D/ `+ F9 O% ~$ ~, ~8 H3 ]# W 以前的request中存放的变量全部失效,并进入一个新的request作用域。3 m! s$ r. b5 W5 E+ r. ?1 q
转发: . J1 K0 s5 N9 e6 b. h% G! \ + H( r' T" P8 _* x- Q% ^2 E 以前的request中存放的变量不会失效,就像把两个页面拼到了一起。 ' Z$ E$ X8 T+ f( n. ] _. H1 z: e" g+ `6 f, p: [ : O e$ w* k& ^: Q8 g& v9 \2 K : ?. X5 }; t t0 v