Servlet 页面跳转方法简介

Zuomxi 贡献于2013-08-25

作者 FtpDown  创建于2010-05-10 08:24:00   修改者系统管理员  修改于2012-04-18 09:09:00字数4644

文档摘要:JSP页面中,实现页面跳转发生在两种情况下。一种是发生在servlet中,这是一种比较常见的跳转页面的方式,它的优点是可以在servlet中做大量业务逻辑处理,通过处理最终返回到相应的显示介面,这种方法隐藏业务逻辑,符合MVC架构设计;另一种方式是在JSP页面中,因为JSP也就是特殊的servlet,不过还是有点差异滴,这里可以请读者自行查阅其相异之处。通过JSP进行页面的跳转一般情况是传递参数比较小,不需要过多的逻辑处理,对安全性要求较低,能够进行简单的数据显示可以了;
关键词:

Servlet页面跳转方法简介 JSP页面中,实现页面跳转发生在两种情况下。一种是发生在servlet中,这是一种比较常见的跳转页面的方式,它的优点是可以在servlet中做大量业务逻辑处理,通过处理最终返回到相应的显示介面,这种方法隐藏业务逻辑,符合MVC架构设计;另一种方式是在JSP页面中,因为JSP也就是特殊的servlet,不过还是有点差异滴,这里可以请读者自行查阅其相异之处。 通过JSP进行页面的跳转一般情况是传递参数比较小,不需要过多的逻辑处理,对安全性要求较低,能够进行简单的数据显示可以了;这种方式操作更加灵活;在简单页面跳转过程中使用较多。 下面介绍两种方式的一些常见方法: Servlet: 在servlet中,一般在doGet(), doPost()等方法里,实现页面的跳转。 sendRedirect方式 : 格式: response.sendRedirect(“index.jsp”); 注释:当前页面跳转到index.jsp页页面(可以跳转的相应路径); sendRedirect可以将页面跳转到任何页面,不只局限于当前的web应用中,还可以跳转到其他的网站页面。如: response.sendRedirect("http://www.sohu.com"); 这种方式跳转后浏览器地址栏发生变化,如果这种方式要传值出去的话,只能在使用QueryString这种方式,在url中带parameter或者放在session中,而无法使用request.setAttribute来传递。 forward方式 : 格式: request.getSession().setAttribute("user","jake" ); request.getRequestDispatcher("index.jsp").forward(request, response); Servlet中forward方式只能跳转到本web应用中的页面上。 在页面跳转后,浏览器地址栏不会发生变化。 开发人员在使用这种方式跳转,进行参数传值可以使用三种方法:url querystring,Session,request.setAttribute(); JSP页面跳转方式: sendRedirect(); response.sendRedirect(); 这种方式和servlet的response.sendRedirect()方式用户一样。但是在使用此语句前不允许有out.flush();如果有,系统会有异常: java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client. at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558) 这种方式页面跳转后浏览器地址栏变化; 如果要跳转到其他主机下,页面跳转后, session等相呼应操作均已经失效;别人的应用不会知道你的应用的Session和其他属相。 response.setHeader(); 格式:response.setHeader("index.jsp","user.jsp"); 这条语句前不允许有out.flush(),如果有,页面不会跳转。跳转后浏览器地栏变化此语句后面的语句执行完成后才会跳转。 格式: 此语句前不允许有out.flush(),如果有,会有异常: java.lang.IllegalStateException: forward() not allowed after buffer has committed. at com.caucho.server.webapp.RequestDispatcherImpl. forward(RequestDispatcherImpl.java:134) at com.caucho.server.webapp. RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101) at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836) 跳转后浏览器地址栏不变,但是只能跳下此语句后面的语句执行完成后才会跳转。 跳转效率比较: A、:效率高,速度快 1.地址栏不改变跳转-服务器端跳转,服务器之间内部转,相同的request,可传参; 2.执行到跳转语句后无条件立刻跳转,之后的代码不再被执行; 注意:如果使用forward跳转,则一定要在跳转之前释放掉全部的资源; 3.使用forward时,request设置的属性依然能保留在下一个页面(setAttribute),; 4.通过传递参数。 5.地址中的”/” 代表是:http://localhost:8080/Test B、response.sendRedirect(“index.jsp”):效率低,速度慢 1.地址栏改变跳转,客户端跳转(地址可以是任意的) 2.所有代码执行完毕之后再跳转,跳转语句后面的代码还是会执行,除非在其后面加上return(return)需复杂一些。 <% Response.sendRedirect(“index.jsp”); boolean ok = true; if(ok){ Return; } System.out.println(“It is ok!”); %> 3.不能保存request属性,地址发生变化了,客户端发生跳转,针对不同的request,无法处理; 4.通过对URL地址的重写传递参数: response.sendRedirect(“index.jsp?id=1235”); 5.地址中的”/”代表是:http://127.0.0.1:8080/ 网上搜罗到的一些资料,值得参考: 转发方式: request.getRequestDispatcher().forward(); 重定向方式: response.sendRedirect(); 区别: 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。 下面是HttpServletResponse.sendRedirect方法实现的请求重定向与RequestDispatcher.forward方法实现的请求转发的总结比较:      (1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。     (2)调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。     (3)HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的 访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复, “浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方 法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。      (4)RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。 (5)无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。 怎么选择是重定向还是转发呢? 通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。   重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档