众所周知,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中使用。
分享到:
相关推荐
19.Servlet中forward和redirect的区别.avi
"javax.servlet.forward.request_uri"是Java Servlet API中的一个属性,它在请求转发过程中用来保存原始请求的URI(统一资源标识符)。 这篇博客文章可能探讨了在Tomcat和WebSphere AS 7中使用`javax.servlet....
Servlet之forward、sendRedirect、 include区别与使用实例 ,具体效果和过程看博文http://blog.csdn.net/evankaka/article/details/45169569
具体做法是,在web.xml中配置Servlet映射关系,并在Servlet中forward到该JSP页面。 2. 简述MVC模式的组成,其相对于纯JSP、JSP+JavaBean的开发方式分别有何优点? MVC模式的组成包括模型、视图和控制器三部分。...
在这个压缩包中,包含的是对Servlet API的中文文档,可能是作者因为无法找到官方的源码和javadoc而自行整理的笔记。 首先,我们来看看servlet的概念。Servlet是一个Java类,它扩展了服务器的功能,可以处理来自...
在Servlet中,我们使用`request.getRequestDispatcher("/bbs.jsp").forward(request, response)`将控制权传递给`bbs.jsp`,这样,请求和响应对象会保持不变,JSP页面可以访问之前设置在请求作用域内的属性。...
Servlet是Java Web开发中的核心组件,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。这个"Servlet中文帮助文档CHM格式"提供了一个全面的指南,帮助开发者理解和掌握...
本文将详细讲解如何在Servlet中实现请求转发以及用户登录验证。 首先,我们来理解请求转发(Request Forward)。在Servlet中,请求转发是一种在服务器内部将一个请求从一个资源传递到另一个资源的技术。这种方式是...
涵盖了 interface 和 abstract 的区别、HashMap 和 Hashtable 的区别、线程常用的方法、GC 的两种方法、Sleep() 和 wait() 的区别、Servlet 中 forward() 和 redirect() 的区别、EJB 和 JavaBean 的概念、EJB 的组成...
Java面试题19.Servlet中forward和redirect的区别 Java面试题20.jsp和Servlet的相同点和不同点 Java面试题21.内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和...
Servlet 中 forward() 与 redirect() 的区别 Servlet 中有两种页面跳转方式:forward() 和 redirect()。 * forward():一次请求,在容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。 * ...
本项目的主要是模仿服务员、初始、送菜人展开的 使用forward定向转发数值 其中比较关键的是request.getParameter()和request.setAttribute 前者是接受,后者是传值
下列关于JSP和Servlet中forward与redirect的描述,哪一项是不正确的? - forward不会改变浏览器地址栏中的URL,而redirect会。 - 在forward和redirect的情况下,服务器都会发送新的URL给浏览器打开。 - forward不会...
Servlet API是Java Web开发中的核心组件,主要用于构建动态web应用程序。这个中文版文档是为了帮助那些在英语学习上有困难的朋友更好地理解和应用Servlet技术。在本文中,我们将深入探讨Servlet API的关键概念、功能...
- 在传统的Java Web项目中,通常将`javax.servlet.jar`和`javax.servlet.jsp.jar`添加到项目的类路径中,这可以通过在`WEB-INF/lib`目录下放置这两个jar包实现。 - 使用Maven或Gradle等构建工具时,可以在pom.xml...
在 Servlet 中,可以使用 forward 方法将请求转发到另一个 JSP 页面。例如: ```java public class ForwardServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse ...
**3.1 Servlet中forward()与redirect()的区别?** - **Forward**: - 是容器内部的控制权转移,不会改变浏览器地址栏中的URL。 - 效率更高,因为只需要一次请求和响应。 - 通常用于页面之间的导航,如从登录表单...
在Servlet中,可以通过多种方式在Servlet之间或者Servlet与JSP页面之间传递数据,例如: - **setAttribute()**:设置属性。 - **getAttribute()**:获取属性。 - **RequestDispatcher**:使用RequestDispatcher接口...
Servlet是Java Web开发中的核心组件,它允许程序员创建动态、交互式的Web应用程序。Servlet API是Java Servlet技术的基础,提供了一系列接口和类,使得开发者能够处理HTTP请求和响应。"servlet-api_servlet_"这个...