`
pandonix
  • 浏览: 401030 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Servlet中的forward

 
阅读更多

众所周知,forward是常用页面重定向方式之一。以前对于forward认知,仅限于可用阶段和理解它与sendRedirect的区别。使用时,几乎每次都是可耻的copy现有代码,未从深究过forward来龙去脉。

直到最近forward的使用过程中遇到了一个路径问题,正好得空,就此略微深入了解一番。

首先来看forward常用方式:

 

request.getRequestDispatcher(path).forward(request,response);

其实稍微一深究,就会有几个疑问:

1、getRequestDispatcher出来的究竟是神马对象?它还有什么其他用途?还有其它获取方式没有?

2、path是否为相对路径?

RequestDispatcher对象(详细可参考Servlet规范中的SRV.8节ServletAPI

查看相关文档之后,答案其实很简单:

顾名思义,它起到requst的分发作用。除了Request对象中获取,还可以从ServletContext对象中获取

 

this.getServletContext().getRequestDispatcher

关于路径问题,servlet spec有这么一段解释:

The behavior of this method is similar to the method of the same name in the
ServletContext. The servlet container uses information in the request object to
transform the given relative path against the current servlet to a complete path.

简单来理解,request对象中获取的,容器会根据request上来的路径进行相对路径的处理,所以request对应的获取方法支持相对路径。然而ServletContext对应的获取方法只支持绝对路径。

在tomcat中,在ServletContext.getRequestDispatcher方法中使用相对路径,得到以下异常:

 

 

java.lang.IllegalArgumentException: Path f.htm does not start with a "/" character
	org.apache.jsp.wap20.forward_jsp._jspService(forward_jsp.java:43)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

 而在resin中,也有类似的异常:

 

java.lang.IllegalArgumentException: request dispatcher url 'f.htm' must
be absolute

 答案显而易见了。

除了forward方法,RequestDispatcher对象还有一个include方法,作用跟jsp中的<%@ include file="path" %>一样,应该是为了在servlet中使用。

 

 

 

 

分享到:
评论
1 楼 qq672076266 2013-09-04  
一直不清楚forward(request,response)到底跳转哪去了(request和response所代表的请求页面,也就是发送这个request的页面),依据什么跳转的?
Servlet API中是这样描述的:
Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server.

相关推荐

    19.Servlet中forward和redirect的区别.avi

    19.Servlet中forward和redirect的区别.avi

    Tomcat Was7 javax.servlet.forward.request_uri属性的差异

    "javax.servlet.forward.request_uri"是Java Servlet API中的一个属性,它在请求转发过程中用来保存原始请求的URI(统一资源标识符)。 这篇博客文章可能探讨了在Tomcat和WebSphere AS 7中使用`javax.servlet....

    Servlet之forward、sendRedirect、 include区别与使用实例

    Servlet之forward、sendRedirect、 include区别与使用实例 ,具体效果和过程看博文http://blog.csdn.net/evankaka/article/details/45169569

    网络软件开发实验五-servlet的应用

    具体做法是,在web.xml中配置Servlet映射关系,并在Servlet中forward到该JSP页面。 2. 简述MVC模式的组成,其相对于纯JSP、JSP+JavaBean的开发方式分别有何优点? MVC模式的组成包括模型、视图和控制器三部分。...

    servlet-api中文文档

    在这个压缩包中,包含的是对Servlet API的中文文档,可能是作者因为无法找到官方的源码和javadoc而自行整理的笔记。 首先,我们来看看servlet的概念。Servlet是一个Java类,它扩展了服务器的功能,可以处理来自...

    jsp页面中获取servlet请求中的参数的办法详解

    在Servlet中,我们使用`request.getRequestDispatcher("/bbs.jsp").forward(request, response)`将控制权传递给`bbs.jsp`,这样,请求和响应对象会保持不变,JSP页面可以访问之前设置在请求作用域内的属性。...

    servlet中文帮助文档CHM格式

    Servlet是Java Web开发中的核心组件,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。这个"Servlet中文帮助文档CHM格式"提供了一个全面的指南,帮助开发者理解和掌握...

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

    本文将详细讲解如何在Servlet中实现请求转发以及用户登录验证。 首先,我们来理解请求转发(Request Forward)。在Servlet中,请求转发是一种在服务器内部将一个请求从一个资源传递到另一个资源的技术。这种方式是...

    亚信面试题,不错的总结,很有用处

    涵盖了 interface 和 abstract 的区别、HashMap 和 Hashtable 的区别、线程常用的方法、GC 的两种方法、Sleep() 和 wait() 的区别、Servlet 中 forward() 和 redirect() 的区别、EJB 和 JavaBean 的概念、EJB 的组成...

    java面试大全视频版

    Java面试题19.Servlet中forward和redirect的区别 Java面试题20.jsp和Servlet的相同点和不同点 Java面试题21.内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和...

    Java-Web简答题.docx

    Servlet 中 forward() 与 redirect() 的区别 Servlet 中有两种页面跳转方式:forward() 和 redirect()。 * forward():一次请求,在容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。 * ...

    javaweb的servlet的forward协作

    本项目的主要是模仿服务员、初始、送菜人展开的 使用forward定向转发数值 其中比较关键的是request.getParameter()和request.setAttribute 前者是接受,后者是传值

    jsp面试考题

    下列关于JSP和Servlet中forward与redirect的描述,哪一项是不正确的? - forward不会改变浏览器地址栏中的URL,而redirect会。 - 在forward和redirect的情况下,服务器都会发送新的URL给浏览器打开。 - forward不会...

    Servlet API(中文)

    Servlet API是Java Web开发中的核心组件,主要用于构建动态web应用程序。这个中文版文档是为了帮助那些在英语学习上有困难的朋友更好地理解和应用Servlet技术。在本文中,我们将深入探讨Servlet API的关键概念、功能...

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    - 在传统的Java Web项目中,通常将`javax.servlet.jar`和`javax.servlet.jsp.jar`添加到项目的类路径中,这可以通过在`WEB-INF/lib`目录下放置这两个jar包实现。 - 使用Maven或Gradle等构建工具时,可以在pom.xml...

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

    在 Servlet 中,可以使用 forward 方法将请求转发到另一个 JSP 页面。例如: ```java public class ForwardServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse ...

    Java web面试题

    **3.1 Servlet中forward()与redirect()的区别?** - **Forward**: - 是容器内部的控制权转移,不会改变浏览器地址栏中的URL。 - 效率更高,因为只需要一次请求和响应。 - 通常用于页面之间的导航,如从登录表单...

    servlet 笔记

    在Servlet中,可以通过多种方式在Servlet之间或者Servlet与JSP页面之间传递数据,例如: - **setAttribute()**:设置属性。 - **getAttribute()**:获取属性。 - **RequestDispatcher**:使用RequestDispatcher接口...

    servlet-api_servlet_

    Servlet是Java Web开发中的核心组件,它允许程序员创建动态、交互式的Web应用程序。Servlet API是Java Servlet技术的基础,提供了一系列接口和类,使得开发者能够处理HTTP请求和响应。"servlet-api_servlet_"这个...

Global site tag (gtag.js) - Google Analytics