`
qizhangwan
  • 浏览: 33362 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

servlet跳转原理

 
阅读更多
[color=darkred]在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");
}


2) 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



JSP:
1) 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的操作已经无意义了;
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;


2) response.setHeader("Location","");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转

3) <jsp:forward page="" />
此语句前不允许有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)
...
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
来自:http://hi.baidu.com/ccst2005/blog/item/df3e76c23a20b91e0ef4778a.html
他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。
[/color]
分享到:
评论

相关推荐

    jsp与Servlet跳转

    ### jsp与Servlet跳转详解 #### 一、引言 在Java Web开发中,页面间的跳转是一项基本且重要的功能。本篇文章将通过具体的示例来深入探讨JSP与Servlet之间的跳转机制,帮助读者更好地理解其工作原理及应用场景。 #...

    servlet实现的页面跳转

    首先,我们要理解Servlet的工作原理。当客户端(通常是浏览器)向服务器发送一个HTTP请求时,服务器会调用相应的Servlet来处理这个请求。Servlet通过重写`HttpServlet`类中的`doGet`或`doPost`方法来响应请求。在这...

    servlet运行原理及生命周期.pdf

    ### Servlet 运行原理及生命周期详解 #### 一、Servlet简介 Servlet 是 Java Web 开发中的一个重要组成部分,它主要用于处理客户端发送至服务器端的 HTTP 请求,并返回相应的响应结果。Servlet 技术允许开发者以 ...

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

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

    servlet工作原理(2)

    ### servlet工作原理(2) #### 一、Servlet基础与重定向机制 在Java Web开发领域,Servlet技术扮演着至关重要的角色。它不仅为开发者提供了一种标准的方式来处理客户端请求,而且还是构建动态Web应用程序的核心...

    servlet跳转页面的几种方法

    JSP提供了`&lt;jsp:forward&gt;`标签来进行转发,它的工作原理与Servlet中的`forward()`方法相同,不改变URL,但只能在同一应用内转发。同样,转发后不应有进一步的输出操作,否则会引发异常。 在选择重定向还是转发时,...

    servlet模拟struts1工作原理

    业务逻辑完成后,Action会返回一个表示处理结果的字符串,这个字符串是ActionForward的name属性,用于决定视图的跳转。 5. **视图渲染**:根据Action返回的结果,Servlet将请求转发到相应的JSP页面,JSP页面负责...

    servlet 模拟

    首先,让我们深入理解Servlet的工作原理。当一个HTTP请求到达Web服务器,服务器会创建一个Servlet实例(如果尚未创建)来处理请求。对于后续的请求,除非服务器配置为每次请求都创建新实例,否则通常会复用已存在的...

    Servlet详解.pdf

    在实际开发中,经常需要从JSP页面跳转到Servlet来处理业务逻辑。可以通过以下方式实现: - 在JSP页面中使用`&lt;form&gt;`标签提交表单数据到Servlet。 - 使用`&lt;a&gt;`标签或JavaScript发起AJAX请求调用Servlet。 #### 4. ...

    servlet简介(入门必备)

    这篇文档将带你走进Servlet的世界,了解其基本概念、工作原理以及如何进行实际应用。 一、Servlet基础 1. Servlet API:Servlet的核心是Java的Servlet API,它定义了Servlet的接口和类,如`GenericServlet`、`...

    jsp+servlet实现简单的登录注册

    通常,注释会解释关键的编程概念、函数作用以及流程控制,帮助初学者快速理解代码逻辑,从而更好地掌握JSP和Servlet的核心原理。 在JSP中,我们通常会创建HTML表单,用户可以输入用户名和密码进行登录或注册。这些...

    基于Servlet的购物系统

    首先,我们要理解Servlet的工作原理。当用户通过浏览器发起HTTP请求时,这些请求会被Web服务器(如Apache Tomcat)捕获。然后,Web服务器根据配置的Servlet映射规则,将请求转发到相应的Servlet实例。Servlet实例会...

    Java_Servlet入门教程.pdf

    #### 一、Servlet工作原理详解 Servlet是一种服务器端的Java技术,用于处理客户端的HTTP请求,并生成相应的HTTP响应。Servlet由支持Servlet的服务器,通常称为Servlet容器或Servlet引擎,负责管理和运行。与传统的...

    应用Servlet实现购物车

    本篇文章将详细讲解如何利用Servlet技术来实现一个购物车功能,以此来帮助开发者理解Servlet在实际应用中的工作原理以及如何进行相关开发。 首先,我们需要了解Servlet的基本工作流程。Servlet生命周期包括加载、...

    servlet实现登录动能

    在Java Web开发中,Servlet是一种用于扩展服务器功能的Java类,它可以处理HTTP请求并返回响应。本项目"Servlet实现登录功能"旨在通过...通过这个项目,开发者可以深入理解Servlet的工作原理和Web应用的基本架构。

    Struts2中实现页面的跳转

    当一个请求到达服务器时,Struts2的前端控制器(通常是一个Servlet,如`StrutsPrepareAndExecuteFilter`)拦截请求,并根据配置文件(struts.xml)来决定哪个Action应该处理这个请求。Action执行完毕后,可以通过...

    tomcat、struts2、servlet Filter(过滤器) 工作原理

    总的来说,理解Tomcat、Struts2和Servlet Filter的工作原理对于Java Web开发人员来说至关重要。这不仅能帮助我们更好地设计和实现应用程序,还能使我们能够有效地排查和解决问题,提高应用的安全性和性能。通过深入...

    关于servlet的jar包

    此外,还可以使用`ServletContext`来共享数据,`HttpSession`来跟踪用户会话,以及`RequestDispatcher`进行页面跳转。 总的来说,Servlet JAR包是Java Web开发的基础,它提供了与HTTP服务器交互的机制,使得开发者...

    jsp 购物车源码 servlet

    4. 请求转发和重定向:学习在Servlet中如何使用`RequestDispatcher`进行页面间的跳转。 5. 数据验证:检查购物车操作中是否进行了必要的输入验证,如商品ID的有效性、数量的合理性等。 通过研究这个简单的购物车...

    jsp servlet MVC Demo

    在JSP中,我们通常会定义`&lt;jsp:include&gt;`、`&lt;jsp:forward&gt;`等动作元素来实现页面的组织和跳转。 二、Servlet Servlet是Java EE规范中的一部分,它是一个Java类,用于处理HTTP请求并生成响应。当用户向服务器发送...

Global site tag (gtag.js) - Google Analytics