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

深入理解Servlet/JSP之“转发和重定向”

阅读更多

 

时间2008-8-5:   作者 李翊 

作者: 李翊,JAVA高级软件工程师就业班特聘讲师  blog:  (http://blog.sina.com.cn/avaj) 
作者介绍:北京航空航天大学软件工程硕士。原IBM中国研究中心(IBM China Lab)资深系统架构师,是目前国内最著名的企业级应用设计及实现专家之一。曾经负责过的主要项目包括:Petri网实验模型系统、多个省级考试中心信息系统、河南省省级电信计费系统、国务院办公厅信息系统、企业基础信息交换平台、国产信息交换平台集成测试系统、多个基于WBI企业EAI解决方案、ePod企业级电子商务解决方案、电子政务目录交换系统等 .

闻听“Bear”同学求职之时被问及“Servlet/JSP之间转发和重定向有何区别?”其实此问题不甚高明,但凡要谈区别的,必然二者非常相似并略有不同。“转发”和“重定向”本质相差甚远,答此问题只需言明二者分别为何物即可。

一、转发
   转发的原理,可以通过下图展示:

   浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响应(当然,也可以继续向其他组件“传递”),这个传递的过程称之为“转发”。整个过程只涉及一次浏览器和服务器之间的“请求-响应”,转发过程中的组件共享同一个请求(request)和响应(response)对象。
   转发的意义在于可以实现组件的“分工”。在基于MVC,多层结构的Web应用中,经常需要多个组件协同完成一次“请求-响应”工作,例如:用户要获取“设备列表信息”,提交请求至控制器组件(Servlet),该Servlet调用适当的JavaBean获取了“设备列表”数据然后再转发至JSP组件去显示信息。
   RequestDispatcher对象封装了转发操作。通过request的getRequestDispatcher(String path)方法获得RequestDispatcher对象,其中String类型参数path表示要转发到的地址。调用Dispacther对象的forward(request, response)方法实现转发。关于转发的具体操作,有如下几点需要注意:

1、转发只能在同一个应用的组件之间进行,不可以转发给其他应用的地址。

2、转发的地址可以用“相对地址”方式,也可以用“绝对地址”方式。但需要注意的是:用绝对地址方式时,应从应用名后(Context path)开始。例如:要转发到的地址为: http://192.168.5.100/tst/jsp/somewhere.jsp (其中tst为应用名),对应的绝对地址为:“/jsp/somewhere.jsp”。这是很好理解的,因为转发只能转到本应用内的地址,所以绝对地址是没有必要包含应用名的。

3、组件之间通过转发来分工协作,势必涉及数据的传递,可以通过request对象传递数据。request对象的setAttribute和getAttribute分别用于以“名称-对象对”的形式存取数据。例如:
       request.setAttribute("food", "roast duck");
       RequestDispatcher rd = request.getRequestDispatcher("jsp/somewhere.jsp");
      rd.forward(request, response);

       somewhere.jsp的内容:
       <h1>Hey, <%=request.getAttribute("food")%></h1>
在转发之前通过request的setAttribute(String name,Object obj)方法向request中存入了一个名为“food”的字符串对象“roast duck”。在转发到的jsp/somewhere.jsp中可以通过request的方法
getAttribute方法取出名为“food”的对象,然后显示在页面上。

4、在一个组件转发给另外一个组件之前,通过response输出的响应内容是没有意义的。例如:在下面的语句中:
      response.setContentType("text/html");
     PrintWriter out = response.getWriter();
     out.println("<h2>head</h2><hr/>");
      RequestDispatcher rd = request.getRequestDispatcher("jsp/somewhere.jsp");  
      rd.forward(request, response);
用户看到的是/jsp/somewhere.jsp的内容,而在转发之前的通过out对象输出的内容:
"<h2>head</h2><hr/>" 最终不会输出到浏览器,这是由于RequestDispatcher在转发之前清空了输出缓冲区。但如果在转发之前输出的信息超出了缓冲区,或者调用了out对象的flush()方法,此响应内容已经输出到了客户端(称之为响应信息已提交),此时如果实施转发操作会抛出运行时异常:java.lang.IllegalStateException。
          
二、重定向
重定向的含义可以由下图说明:

   浏览器向某组件发出请求信息,组件向浏览器发回一个重定向响应信息,该响应信息不包含具体的数据内容,只是在响应头信息中包含了需要重定向到的地址信息,该地址可以是任何有效的URL。浏览器收到该重定向响应后会自动的向响应信息头中所指示的地址发出请求。整个重定向的过程涉及两次“请求-响应”。具体的重定向响应格式如下所示:
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://192.168.5.100:8080/tst/jsp/somewhere.jsp
Content-Length: 0
Date: Mon, 30 Jun 2008 03:52:54 GMT

注意:重定向响应中包含重定向地址的部分。
重定向可以通过response的sendRedirect(String url)方法来实现,注意String类型的参数url表示重定向到的地址,需要注意的是,如果表示重定向到本应用内的一个绝对地址时,要从应用名前开始,例如:tst应用中的某个组件要重定向到本应用内的/jsp/somewhere.jsp,则重定向的绝对地址应该是:“/tst/jsp/somewhere.jsp”这一点和转发中的绝对地址表示是不同的。

 

分享到:
评论

相关推荐

    servlet jsp深入了解

    本篇文章将深入探讨Servlet和JSP的关系、工作原理以及如何将它们有效地结合起来。 Servlet是一种Java编程接口,它是Java平台上的服务器端组件,用于接收并处理客户端(如浏览器)发送的HTTP请求,然后生成相应的...

    基于servlet/jsp的学生信息录入查询系统

    通过学习和实践这个项目,初学者可以深入理解Servlet、JSP、DBUtils以及Web开发的基本流程,为后续的Web开发技能打下坚实基础。同时,它也涉及到了数据的表示、用户的交互和数据库的管理,这些都是构建任何Web应用...

    servlet请求转发、重定向、包含

    Servlet请求转发、重定向和包含是Servlet中处理客户端请求的重要技术,它们都涉及到如何有效地管理用户请求和页面跳转,但各自有不同的特性和应用场景。 1. **请求转发(Request Forward)** - 请求转发是在服务器...

    servlet/jsp跳转

    在实际开发中,理解和掌握Servlet与JSP的跳转机制以及它们如何协同工作,对于构建高效、可维护的Java Web应用至关重要。同时,合理利用Eclipse或MyEclipse这样的IDE能提升开发效率,更好地实现需求。

    Servlet转发与重定向

    Servlet 转发与重定向 Servlet 转发与重定向是 Java Servlet 编程中两个重要的概念,它们都可以让浏览器获得另外一个 URL 所指向的资源,但是它们的内部运行机制有着很大的区别。 RequestDispatcher.forward 方法 ...

    servlet/jsp自定义错误页面

    在`error.jsp`页面中,开发者可以获取`request`对象中包含的错误信息,如状态码(`javax.servlet.error.status_code`)、错误消息(`javax.servlet.error.message`)和异常类型(`javax.servlet.error.exception_...

    达内servlet/jsp/jquery资料

    根据提供的文件信息,以下是对达内servlet/jsp/jquery培训资料中的关键知识点的详细解析: ### 1. 架构 - **C/S 架构(Client-Server 架构)**: - 客户端和服务端通过TCP/IP协议进行通信。 - 特点包括:需要...

    请求转发与重定向的区别

    1. 深入理解HTTP协议:了解HTTP请求和响应的工作原理,包括状态码的意义,这对于理解请求转发和重定向如何工作至关重要。 2. 实践编程:通过编写实际的Servlet或Filter来实现请求转发和重定向,这能帮助你更好地...

    javaServlet请求转发和重定向.pdf

    Java Servlet 请求转发和重定向 Java Servlet 请求转发和重定向是两种不同的页面跳转机制,它们在 Web 应用程序中扮演着重要的角色。理解这两种机制的区别和使用场景是非常重要的。 请求转发是指将请求再转发到另...

    请求转发与重定向

    在Web开发中,**请求转发**与**重定向**是两种非常重要的控制流程技术,它们都用于实现页面跳转的功能,但其工作原理和应用场景有所不同。 #### 二、请求转发 ##### 1. 定义 **请求转发**是在服务器内部进行的,它...

    Servlet+jsp.docx

    ### Servlet与JSP详解 #### 一、Servlet基础概述 **Servlet** 是Java Web开发的基础技术之一,主要用于处理客户端的HTTP请求,并返回响应结果。它是一种服务器端的Java应用程序,可以扩展服务器的功能。 ##### ...

    转发和重定向的区别 forward和redirect的区别

    在Java的Servlet编程中,`转发`和`重定向`是两种不同的机制,用于在服务器端将客户端的请求导向不同的资源。它们的主要区别在于请求处理流程、URL改变以及数据共享方式。 1. 转发(Forward): - 使用`...

    Servlet 和 Jsp 学习指南+ 代码

    这份"Servlet 和 Jsp 学习指南+ 代码"资源包显然旨在帮助开发者深入理解和掌握这两项技术。 Servlet是Java提供的一种用于扩展服务器功能的接口,它允许开发者编写Java代码来处理HTTP请求。Servlet生命周期包括加载...

    servlet和jsp模板

    - 学习Servlet和JSP,首先需要掌握Java基础,然后深入理解HTTP协议和Web容器的工作原理。 - 掌握Servlet和JSP后,可以进一步学习MVC设计模式和相关Web框架,提升开发效率。 9. **最佳实践**: - 遵循单一职责...

    servlet中实现请求转发,用户登录

    在Servlet中,请求转发与重定向(Redirect)不同。重定向是客户端行为,浏览器收到服务器的302响应后会发起一个新的请求,而请求转发是服务器内部操作,不会生成新的请求。因此,请求转发适用于需要共享请求属性或者...

    ServletExamples JspExamples

    结合"源码"和"工具"这两个标签,我们可以推测这个压缩包可能包含了一些实际运行的Servlet和JSP示例代码,这些代码可能涵盖了基本的HTTP请求处理、用户会话管理、表单数据处理、转发和重定向等常见场景。学习者可以...

    JSP+Servlet面试题

    以下是 JSP 和 Servlet 相关的知识点总结: 一、JSP 和 Servlet 基础知识 * JSP 和 Servlet 都是服务器端执行的,通常返回给客户端的是一个 HTML 文本。 * JSP 在服务器上执行,并将执行结果输出到客户端浏览器。 ...

    servlet和jsp学习指南

    - **可以相互配合使用**:通常情况下,Servlet用来处理业务逻辑,而JSP用来展示数据,两者可以通过URL转发或者重定向的方式相互协作。 #### 四、学习路径建议 1. **基础知识**:首先需要掌握Java基础语法以及面向...

    请求转发和重定向的区别共1页.pdf.zip

    在Web应用开发中,请求...总的来说,理解和掌握请求转发与重定向的区别,对于编写高效、灵活的Web应用程序至关重要。在设计和优化网站逻辑时,合理利用这两种技术,能够提高用户体验,同时也有利于代码的组织和维护。

Global site tag (gtag.js) - Google Analytics