熟悉web开发的朋友都知道,从servlet跳转到jsp页面或者跳转到另一个servlet,有以下两种方式可以选择:
(1)服务端跳转: request.getRequestDispatcher(“XXXXX”).forward(request, * response);
(2)客户端跳转: response.sendRedirect(“XXXXX”);
注:其中XXXXX是你要跳转到的jsp页面地址或者servlet的地址】
但是,我相信很多人并没有对这两种跳转方式进行比较深刻的理解。接下来,我将总结我对这两种跳转方式区别的理解:
(1)跳转的原理不同:
第一种跳转方式是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变。
第二种跳转方式是通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容,所以这种方式可以重定向到任何URL,且重定向后浏览器URL变成定向后的页面地址。
(2)参数传递不同:
第一种跳转方式传递参数可以通过session、request以及在url中携带参数的三种方式来实现。其参数传递过程大致为:服务器在向客户端发送数据之前,先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?①当对来自client的request处理完,并把所有数据输出到缓冲区;②当缓冲区满;③在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
第二种跳转方式传递参数的方式只可以通过session和url中携带参数两种方式实现,跳转到下一个页面后,无法再获取又上一个页面request对象中的数据,即无法使用request.setAttribute来传递参数。
(3)对跳转语句后面的代码的处理方式不同:
第一种跳转方式是服务器端跳转,是强制跳转,不执行其后的代码。
第二种跳转方式中,当程序执行到此句时,是所有代码执行完成后再执行跳转动作,也就是说其后的代码有被执行的机会。但是这里要分两种情况进行讨论:如果要跳到不同主机,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义; 如果要跳到相同主机,此语句后面的语句执行完成后才会跳转。
(4)跳转路径不同:
第一种跳转方式request.getDispatcher(“/XXXXX”).forward(request,response); 转向web项目的根路径如:”http://localhost:8080/projectName/“,所以不带Web项目名称。
第二种跳转方式response.sendRedirect(“/projectName/XXXXX”); 转向web服务器的根路径如:“http://localhost:8080/”,所以要带Web项目名称。
【结语】顺便说一下,这两种跳转方式的原理不一样,其中第一种跳转是过滤器无法过滤到的,而第二种跳转方式是可以过滤到的。
以上内容是本人参考以下文章以及自己的思考写成的,如有错误之处,敬请指正。
参考:http://blog.163.com/zhiqiangli_2010/blog/static/16718494720109812318593/
http://blog.sina.com.cn/s/blog_5f911b520100r6sb.html