`
wdhdd889
  • 浏览: 151847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet的跳转方式

    博客分类:
  • java
阅读更多
在servlet中,一般跳转都发生在doGet, doPost等方法里面。
一、原理
1 redirect 方式
response.sendRedirect("/a.jsp");
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
response.sendRedirect("http://www.ycul.com");
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。

这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response)    throws ServletException,IOException

      response.setContentType("text/html; charset=UTF-8");
   response.sendRedirect("/index.jsp");

forward方式
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request, response);
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
public void doPost(HttpServletRequest request,HttpServletResponse response)   throws ServletException,IOException
        response.setContentType("text/html; charset=UTF-8");
)     ServletContext sc = getServletContext();
   RequestDispatcher rd = null;
        rd = sc.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
二、区别.
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、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。
java

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)
跳转后浏览器地址栏变化
如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了; 如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;

response.setHeader("Location","");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转
<jsp:forward page="" />
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
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)
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转




他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。
分享到:
评论

相关推荐

    Servlet跳转方式sendReDirect

    在Servlet中,有两种主要的跳转方式:`RequestDispatcher.forward()`和`ServletResponse.sendRedirect()`。这两种方法在处理客户端请求时有不同的行为和应用场景。 1. `RequestDispatcher.forward()` - `forward()...

    servlet跳转的几种情况

    JSP 跳转是指在 JSP 页面中使用的跳转方式。JSP 跳转可以分为三种: * `response.sendRedirect()`: 与 Servlet 的 sendRedirect() 方法相同。 * `response.setHeader("Location","")`: 设置 HTTP 头的 Location ...

    jsp与Servlet跳转实例

    ### jsp与Servlet跳转实例:深入理解信息提交与页面跳转 在Web开发中,JSP(Java Server Pages)和Servlet是两个重要的技术组件,它们共同协作来处理客户端请求并生成动态网页内容。本文将详细解析一个具体的案例...

    jsp与Servlet跳转

    3. **跳转方式** - 在Java Web应用中,页面跳转通常有两种方式:重定向(Redirect)和转发(Forward)。 - **重定向**:客户端(浏览器)会收到一个新的HTTP响应,并被指示去访问新的URL。这意味着客户端会发送一...

    servlet实现的页面跳转

    页面跳转主要有两种方式:请求转发(Request Forwarding)和重定向(Redirecting)。 1. 请求转发(Request Forwarding): 请求转发发生在服务器端,使用`RequestDispatcher`的`forward()`方法。在这种情况下,...

    java-web学习demo--最简单的servlet jsp跳转传值

    通过这个简单的Java Web学习demo,开发者可以了解Servlet和JSP协同工作的方式,以及如何在它们之间传递数据。这有助于理解Web应用的基础架构,并为进一步深入学习和开发复杂的Java Web应用打下坚实基础。

    servlet/jsp跳转

    2. **Servlet的跳转方式**: - **请求转发(Request Forward)**:使用`RequestDispatcher`的`forward()`方法在同一应用内部进行跳转,请求只发送一次,浏览器地址栏不会改变。 - **重定向(Redirect)**:使用`...

    servlet实现简单登录页面跳转.zip

    本示例项目"Servlet实现简单登录页面跳转.zip"是关于如何利用Servlet来实现一个基本的用户登录功能,包括从HTML登录页面接收数据、验证用户凭证以及根据登录结果进行页面重定向。 1. **Servlet基础** - Servlet是...

    servlet跳转页面的几种方法

    本篇文章将详细讲解Servlet中跳转页面的两种主要方法:redirect(重定向)和forward(转发),以及在JSP中如何实现类似操作。 1. **Servlet中的跳转** - **Redirect(重定向)** 重定向是通过`response....

    jsp和servlet中实现页面跳转的方式实例总结.docx

    JSP 和 Servlet 中实现页面跳转的方式实例总结 在 web 开发中,页面跳转是一个非常常见的需求,JSP 和 Servlet 是 Java Web 开发中两个最基本的组件,了解它们如何实现页面跳转是非常必要的。本文将根据 JSP 和 ...

    jsp与Servlet跳转实例借鉴.pdf

    JSP与Servlet跳转实例借鉴 本资源是关于JSP与Servlet跳转实例的借鉴,通过三个JSP页面(Index.jsp、Input.jsp、Confirm.jsp)和三个Servlet(InputServlet、ConfirmServlet、ResultServlet)来实现用户登录验证和...

    Servlet跳转

    NULL 博文链接:https://chaoyi.iteye.com/blog/2072931

    关于servlet的页面跳转经典例子

    在这个“关于servlet的页面跳转经典例子”中,我们将探讨如何在Servlet中实现页面重定向和请求转发,同时也会涉及到数据库连接的相关知识。 1. **Servlet中的页面跳转** - **请求转发(Request Forward)**:在...

    servlet的跳转

    在实际应用中,选择哪种跳转方式取决于具体需求。请求转发适用于需要在多个资源间共享请求数据且不希望URL改变的情况,而重定向则适用于需要用户看到新的URL或结束当前会话的场景。 总结一下,Servlet的跳转在Java ...

    servlet获得下拉列表的值,并跳转到相关页面

    总结来说,通过Servlet获取下拉列表的值并跳转到相关页面涉及以下几个步骤: 1. 在HTML页面中创建下拉列表,并指定一个name属性。 2. 编写Servlet,使用HttpServletRequest的getParameter()方法获取下拉列表的值。 3...

    jsp和servlet中实现页面跳转的方式实例总结

    本文实例总结了jsp和servlet中实现页面跳转的方式。分享给大家供大家参考,具体如下: 假设要求从test1.jsp 跳转到test2.jsp 一. jsp中跳转: 1. 使用RequestDispatcher.forward方法转发 &lt;&#37; ...

    通过servlet实现登陆界面的跳转

    总结来说,通过Servlet实现登录界面的跳转涉及以下几个关键点: 1. 创建HTML登录表单,指定提交时调用的Servlet。 2. 编写Servlet,处理POST请求,获取并验证用户输入。 3. 根据验证结果,使用`sendRedirect`进行...

    Servlet几种页面跳转的区别

    Servlet几种页面跳转的区别Servlet几种页面跳转的区别

    servlet 模拟

    当我们说一个Servlet是线程不安全的,意味着在多线程环境下,该Servlet的行为可能会出现问题,如数据混乱、竞态条件或死锁。 首先,让我们深入理解Servlet的工作原理。当一个HTTP请求到达Web服务器,服务器会创建一...

    Web_2_Servlet的基本使用和跳转1

    Web 2 Servlet 的基本使用和跳转 在本节中,我们将讨论 Web 2 Servlet 的基本...我们讨论了 Servlet 的生命周期、创建方式、配置方式、实现页面跳转和获取请求参数等方面的内容,并讨论了 Servlet 的线程安全问题。

Global site tag (gtag.js) - Google Analytics