`

RequestDispatcher说明

    博客分类:
  • JAVA
阅读更多

RequestDispatcher.forward()方法

RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法,参见如下代码:

public interface RequestDispatcher {

void forward(ServletRequest request, ServletResponse response);

void include(ServletRequest request, ServletResponse response);

}

forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。

注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。

如何得到RequestDispatcher

有三种方法可以得到Request Dispatcher对象。

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。

2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。

3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。

这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件web.xml:

<?xml version=”1.0″ ?>

<!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN”

“http://java.sun.com/j2ee/dtds/web-app_2_2.dtd”>

<web-app>

<servlet>

<servlet-name>FirstServlet</servlet-name>

<servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class>

</servlet>

<servlet>

<servlet-name>SecondServlet</servlet-name>

<servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>FirstServlet</servlet-name>

<url-pattern>/servlet/firstservlet/</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>SecondServlet</servlet-name>

<url-pattern>/servlet/secondservlet/</url-pattern>

</servlet-mapping>

</web-app>

其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:

http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代码:

RequestDispatcher rd = request.getRequestDispatcher(”secondservlet”);

rd.forward(request, response);

此时控制权将转向到第二个Servlet了。

使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:

RequestDispatcher rd = getServletContext().getRequest

Dispatcher(”/servlet/secondservlet”);

rd.forward(request, response);

使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:

RequestDispatcher rd = getServletContext().getNamedDispatcher(”SecondServlet”);

rd.forward(request, response);

这样也可以重定向到SecondServlet了。

JSP页面中的重定向

JSP在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代码,并且,JSP还提供了更便利的操作,如下:

<jsp:forward page= “nextpage.jsp”/>

JSP页面执行到这儿,将终止当前的处理,将控制权交由nextpage.jsp。

如何选择

RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

分享到:
评论

相关推荐

    Java中Request请求转发详解

    这说明了RequestDispatcher可以实现请求的转发,而不是重定向。 在使用Postman进行post请求时,我们可以看到,RequestDemo5将请求转发到RequestDemo6,然后RequestDemo6将请求处理完毕。这个过程证明了...

    JAVA servlet API说明文档

    Java Servlet API 说明文档是一份关于Java Servlet技术的权威文档,涵盖了servlet容器中各个接口及其方法的详细解释。Servlet API是Java EE(Java Platform, Enterprise Edition)规范的一部分,主要用于开发基于...

    jsp的URL重写(内附说明)

    以及可能的说明文档,详细解释了如何部署和配置这些文件以实现URL重写功能。 总之,JSP的URL重写是一个增强网站功能和用户体验的重要技术,通过合理的规则设计和Filter的运用,可以将复杂的动态URL转化为简洁的静态...

    转发与重定向的详细说明

    ### 转发与重定向的详细说明 #### 一、转发 转发是Web应用程序中常见的一种机制,它主要用于在同一个Web应用内部的不同组件间共享请求数据。在Servlet和JSP技术中,转发是一个非常重要的概念,对于实现复杂的业务...

    javax.servlet 包说明

    【标题】:“javax.servlet 包说明” 在Java Web开发中,`javax.servlet`包是核心组件,它提供了用于创建和管理服务器端应用程序的接口和类。这个包是Servlet API的一部分,是Java EE(Enterprise Edition)规范中...

    servlet代码+说明文档

    5. **Servlet的转发和重定向**:Servlet可以通过RequestDispatcher的forward()方法将请求转发到其他资源,或者通过HttpServletResponse的sendRedirect()方法重定向浏览器。两者的区别在于前者是在服务器端完成的,后...

    JSP与Servlet传值技术总结

    该技术有多种实现方式,本文将对其进行总结和说明。 JSP到JSP的传值技术 JSP到JSP的传值技术主要有四种: 1. 超链接关系:通过在链接后添加参数的方式来传递数据,例如:链接 2. sendRedirect方法:使用response....

    servlet函数介绍及其api中文

    `RequestDispatcher`的`include()`方法能将请求包含在当前响应中,通常用于在多个资源之间共享处理逻辑。 8. **Session管理** Servlet API提供了对HTTP会话(Session)的支持。`HttpServletRequest`的`getSession...

    Java Servlet API说明文档doc版

    4. **javax.servlet.RequestDispatcher**:用于将请求转发到其他资源或 Servlet。 5. **javax.servlet.Filter**:用于过滤客户端请求和服务器响应。 #### 五、Servlet 的部署与配置 Servlet 需要在 Web 应用程序的...

    j2ee帮助文档(英文版)

    这份J2EE帮助文档不仅包含上述核心组件的详细说明,还会涵盖部署描述符、容器管理、性能优化等多个方面,对于深入理解和开发J2EE应用是必不可少的参考资料。通过阅读和实践,开发者能够熟练掌握企业级Java开发的各个...

    Servlet基础教程

    - **RequestDispatcher增强**:`RequestDispatcher`接口新增了特性和说明。 **2.3 新特性与改进** - **ServletRequestlistener类和方法**:引入了`ServletRequestlistener`类及其相关方法,用于监听请求的生命周期...

    Servlet源代码

    5. **RequestDispatcher接口**:通过`request.getRequestDispatcher()`方法获取`RequestDispatcher`对象,它可以将请求转发到指定的资源,如JSP页面。在代码中,根据业务逻辑,它被用来转发到`errorpage.jsp`或`...

    javax.servlet帮助文档

    以下是对javax.servlet关键知识点的详细说明: 1. **Servlet**: Servlet是一个Java类,用于扩展服务器的功能,特别是用于处理HTTP请求。它在Web服务器上运行,接收和响应来自客户端(如浏览器)的请求。 2. **...

    MVC和分页1

    基于MVC,说明基于Struts2开发的Web应用自然就能实现MVC,也说明Struts2着力于在MVC的各个部分为我们的开发提供相应帮助。 Java Web的三层架构 Java Web经历三个时期:JSP Model1第一代、JSP Model1第二代和JSP ...

    《Web程学设计B》试卷A.doc

    Filter的实现涉及`doFilter`方法,通过检查请求头来判断请求来源,以及RequestDispatcher的`forward`方法。 5. **数据库操作(CRUD)**: - 创建一个`employee`表,包含字段`id`(主键,自增),`empno`(工号),`...

    基于Servlet的图书管理系统

    Servlet可以与其他Servlet或JavaBeans通信,通过`RequestDispatcher`进行请求转发或重定向,也可以使用`ServletContext`对象在整个应用范围内共享数据。 6. **图书管理系统设计**: 在这个系统中,Servlet可能...

    JSP编写的博客代码

    处理完成后,可能需要使用`RequestDispatcher.forward()`方法将控制权传递给另一个JSP页面,以显示结果或渲染新的页面。 5. **程序使用说明书** 包含的`程序使用说明书.doc`文件应该提供了详细的部署和运行步骤,...

    JSP页面跳转大全.docx

    以下是对不同跳转方法的详细说明: 1. **forward() 方法** `forward()` 方法属于 `javax.servlet.RequestDispatcher` 类,它允许你将请求转发到服务器上的另一个资源,如Servlet、JSP页面或静态HTML文件。这种方式...

    韩顺平servlet部分视频教程代码+工具

    4. **笔记或说明文档**:可能包含学习笔记或简短的说明,帮助理解代码和视频内容。 5. **测试用例**:如果有的话,可能会有测试类,用于验证Servlet功能的正确性。 **Servlet基础知识**: - **Servlet生命周期**:...

Global site tag (gtag.js) - Google Analytics