RequestDispatcher接口的概述:
RequestDispatcher是servlet容器创建的一个web资源的包装器,可以用来把当前的request传递到该资源或者把新的资源包括到当前响应中。
public interface RequestDispatcher 定义一个对象,该对象负责在服务器端接收来自客户端的请求并向他们发送资源(例如一个servlet,HTML文件,或者是JSP文件)。servlet容器创建RequestDispatcher对象,用来包装一个给定位置或名字的服务器资源。 该接口被设计于包装servlets,但一个servlet容器可以创建该对象以保证任何类型的资源。
forward()方法概述: public void forward(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException 推进一个请求到服务器的某个资源(如:servlet,JSP文件,或HTML文件)。该方法允许一个servlet对一个请求作初步处理,而另一个资源将产生响应。 由于一个RequestDispatcher对象是通过getRequestDispatcher()方法获得,ServletRequest对象拥有自己的路径元素和变量以匹配目标资源路径。 forward()方法应该在响应被提交到客户端之前被唤起(在响应主体输出被刷新之前)。如果响应已经被提交,该方法抛出IllegalStateException 。在forward之前,响应未被提交的输出会被自动清理掉。 请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。
forward的处理方式:首先客户端client对第一个servlet发出一个请求,在第一个servlet里面调用forward方法,于是将这个请求转发到第二个servlet里面,最后由第二个servlet把结果返回给用户。
include()方法概述: public void include(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException 该方法在响应中包含某些资源的内容(如:servlet,JSP文件,HTML文件)。该方法关键是能包含服务器端的程序。 ServletResponse对象包含来自调用者的保持不变的路径元素和参数。被包含的servlet不能改变响应状态代码或设置头信息;任何制造改变的尝试都会被忽略。 请求和响应的两个参数必须是与传递给servlet的service()方法相同的对象,或者是由ServletRequestWrapper、ServletResponseWrapper的子类(封装的)对象。
include的处理方式:首先客户端发出一个请求,这个请求会请求servlet1,servlet1通过include方法将这个请求转发给servlet2,servlet2处理结束之后将处理结果再发回给servlet1,由servlet1把结果相应给客户。这个过程中servlet1 始终是控制者,servlet2是执行者。
演示代码:
index页面:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="s1">Dispatcher</a> </body> </html>
web页面配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet> <servlet-name>s1</servlet-name> <servlet-class>com.iotek.jee.servlet.Servlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>s1</servlet-name> <url-pattern>/s1</url-pattern> </servlet-mapping> <servlet> <servlet-name>s2</servlet-name> <servlet-class>com.iotek.jee.servlet.Servlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>s2</servlet-name> <url-pattern>/s2</url-pattern> </servlet-mapping> </web-app>
src中的servlet1类:
package com.iotek.jee.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 5673468877806355401L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 使用dispatch的forward方法 // System.out.println("Servlet doget1!"); // resp.setContentType("text/html;charset=UTF-8"); // resp.getWriter().write("<strong>Servlet1</strong><br/>"); // RequestDispatcher res = req.getRequestDispatcher("s2"); // req.setAttribute("test", Math.random()); // res.forward(req, resp); System.out.println("Servlet doget1!"); resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("<strong>Servlet1</strong><br/>"); RequestDispatcher res = req.getRequestDispatcher("s2"); res.include(req, resp); Double d = (Double)req.getAttribute("test"); resp.getWriter().write("include servlet2 double values:" + d); } }
SRC中的servlet2类:
package com.iotek.jee.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet2 extends HttpServlet { private static final long serialVersionUID = 5673468877806355401L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 调用dispatcher的forward的方法 // System.out.println("Servlet2 doget!"); // Double d = (Double)req.getAttribute("test"); // resp.getWriter().write("req attr test" + d + "<br/>"); // resp.getWriter().write("Servlet2 你好 <br/>"); System.out.println("Servlet2 doget!"); // Double d = (Double)req.getAttribute("test"); // resp.getWriter().write("req attr test" + d + "<br/>"); req.setAttribute("test", Math.random()); resp.getWriter().write("Servlet2 你好 <br/>"); } }
运行结果: