servlet中RequestDispatcher源码解析及使用
文章目录
一、简介
RequestDispatcher可以让客户端请求在服务端server中的各个servlet间转发处理。这里结合源码对RequestDispatcher进行介绍。
二、RequestDispatcher
RequestDispatcher接收客户端请求,并将它们发送到server中的其它资源(如servlet、html文件、JSP文件)。RequestDispatcher当作对指定路径或名称的服务资源的包装。
2.1 RequestDispatcher获取
RequestDispatcher是通过HttpServletRequest.getRequestDispatcher方法获取的,参数为指定的资源路径,如果路径是相对路径,则相对目录是当前servlet的。HttpServletRequest.getRequestDispatcher方法定义源码如下:
public RequestDispatcher getRequestDispatcher(String path);
2.2 源码
RequestDispatcher的核心方法是forward和include,这里把RequestDispatcher中定义的常量也列出来,源码如下:
package javax.servlet;
import java.io.IOException;
public interface RequestDispatcher {
//forward方式下,来源URI名称(值在目标request中attribute中获取)
static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";
//forward方式下,来源context路径名称(值在目标request中attribute中获取)
static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";
//forward方式下,来源路径信息名称(值在目标request中attribute中获取)
static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";
//forward方式下,来源servlet的servlet路径名称(值在目标request中attribute中获取)
static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";
//forward方式下,来源请求查询串名称(值在目标request中attribute中获取)
static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";
//include方式下,目标请求的URI名称(值在目标request中attribute中获取)
static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";
//include方式下,目标context路径名称(值在目标request中attribute中获取)
static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";
//include方式下,目标路径信息名称(值在目标request中attribute中获取)
static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";
//include方式下,目标servlet路径名称(值在目标request中attribute中获取)
static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";
//include方式下,目标查询串名称(值在目标request中attribute中获取)
static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";
//error方式下,传递的异常对象名称(值在目标request中attribute中获取)
public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";
//error方式下,传递的异常类型名称(值在目标request中attribute中获取)
public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";
//error方式下,传递的异常信息名称(值在目标request中attribute中获取)
public static final String ERROR_MESSAGE = "javax.servlet.error.message";
//error方式下,导致传递异常的请求URI名称(值在目标request中attribute中获取)
public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";
//error方式下,传递的发生错误的servlet名称(值在目标request中attribute中获取)
public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";
//error方式下,传递的响应code名称(值在目标request中attribute中获取)
public static final String ERROR_STATUS_CODE = "