1 、RequestDispatcher说明
分派请求RequestDispatcher,相对于重定向 sendReadirect()来说,它是不进行url改变的。如有a、b两个servlet,a的servlet使用了RequestDispatcher分派到b,对于用户来说地址输入栏还是a的地址,但是内部来说是a到b进行了一个分派的处理;
2、获得一个RequestDispatcher
ServletContext。getRequestDispatcher
ServletContext。getNamedDispatcher
ServletContext。getRequestDispatcher是通过url形式获得,符合url匹配规则来找servlte,然后包装成RequestDispatcher返回。如果找不到对应的servlte,则会出现404.
ServletContext。getNamedDispatcher是通过servlte的名字来查找的。
为了方便相对于当前的servlte请求的url来获取一个servlte,ServletRequest 有一个getRequestDispatcher来获取,如当前请求url是/c2/index.html,ServletRequest.
getRequestDispatcher("header .html"),相当于ServletRequest.getRequestDispatcher("/c2/header .html")
3、参数
ServletContext 和ServletRequest 的RequestDispatcher是可以附加参数的,如果和原来的相同参数将被替换。
如:String str="/c2?p=1";
RequestDispatcher rd = context.getRequestDispatcher(path);
当进行分派的时候,p参数会传到下一个的Request中
4、使用Include方法
include什么时候都可以调用,但是它有一定的限制,能访问所有的request的所有方法,但是对于response对象来说,不能设置所有响应头部信息的方法,无论是分派前后。只能调用写入数据流,如Writer或者flushBuffer。
如果servlet是通过RequestDispatcher得到的,那么它必然有如下几个属性,通过request对象的getAttribute 获取,这些属性是分派到的servlet的对应值。
如果之后自己设置了这些属性,那么会被替换掉。但是如果getNamedDispatcher获得的servlet则没有这些信息。
javax.servlet.include.request_uri 被包含 servlet的请求 RUI
javax.servlet.include.context_path 上下文路径
javax.servlet.include.servlet_path servlet路径
javax.servlet.include.path_info 路径信息
javax.servlet.include.query_string 查询字符串
5、使用Forward 方法
调用forward方法,有限制。
1、必须是响应内容为空的时候调用,如果分派前的response有响应已经提交部署将会报错 , 未提交的将会被忽略。
2、设置响应头有效
3、如果是RequestDispatcher获得servlet,分派到的servlet会有如下属性,通过request的getAttribute获得,和include不同的是,这是永远是分派前的servlet的信息,即便后面再次分派和使用includes
javax.servlet.forward.request_uri HttpServletRequest的getRequestURI
javax.servlet.forward.context_path getContextPath、
javax.servlet.forward.servlet_path getServletPath
javax.servlet.forward.path_info getPathInfo
javax.servlet.forward.query_string getQueryString
6、跨应用访问
req.getServletContext().getContext("/web5").getRequestDispatcher("/rdd");