一:servlet的控制分发主要由RequestDispatcher对象完成(由于整个servlet存在于web容器中,所以它不像spring那样要指定一个控制分发器,它已经内置在web容器里面)。获取RequestDispatcher主要有两种方式,他们都是在ServletContext定义的接口之下
1.public RequestDispatcher getRequestDispatcher(String path)
path是资源的绝对路径,应该以"/"开始
2.public RequestDispatcher getRequestDispatcher(String name)
name是在web.xml中注册的servlet所对应的名字
二:完成请求分发主要有两个方法
1.public void include(request,response);
改方法的可以使其他资源生成的任务动静态的内容包含在它生成的响应中
eg:ServletContext context = getServletContext();
RequestDispatcher rd = context.getRequestDispatcher("HeaderServlet");//HeaderServlet包含了头部的输出流
rd.include(res,rps);
rps.getWriter.println("<FONT SIZE=*******");
rd = context.getRequestDispatcher("/foot.html");
rd.include(res.rps);
这样就完成了一次各个组件的共同输出流到客户端
2.public void forward(request,response);
改方法使Servlet将请求转发给另一个Servlet或者任何其他的Web组件,然后该Servlet或者其他组件将负责进一步处理该请求并生成响应
eg: RequestDispatcher rd = null;
if(valid){
rd = context.getRequestDispatcher("InboxServlet");
}else{
rd = context.getRequestDispatcher("error.jsp");
}
rd.forward(res,rps);
下面看看两个方法的对比:
forward方法 | include方法 |
在控制必须转移到其他web组件时使用 | 在必须由另一个web组件执行部分处理时使用。一旦 处理完成,当前的web组件就收回控制权 |
在转发请求之前,转发请求的web组件不应 使用用于与客户通信的输出流 | 所有web组件共享该输出流来与客户端进行通信 |