请求转发和请求包含

2022-09-14 21:00:30 浏览数 (1)

一、概述

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

注意: 请求转发和请求包含都是在一个web应用内部完成的

二、请求转发

代码语言:javascript复制
public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse 			response)
			throws ServletException, IOException {
		System.out.println("AServlet");
        /*
        获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>			值。
        */
		RequestDispatcher rd = 													request.getRequestDispatcher("/BServlet"); 
        //调用“调度器”的转发方法,该方法等同与告诉服务器,去调用BServlet的service()方法一样。
		rd.forward(request, response) ;
	}
}
代码语言:javascript复制
public class BServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("BServlet");
	}
}
代码语言:javascript复制
Aservlet
BServlet

三、请求包含

在AServlet中,把请求包含到BServlet:

代码语言:javascript复制
public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("AServlet");
		RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
        //请求包含
		rd.include (request, response);
	}
}
代码语言:javascript复制
public class BServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("BServlet");
	}
}

Aservlet

BServlet

四、请求转发与请求包含比较

如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;

如果是使用请求包含,那么没有这个限制;

请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);

请求包含大多是应用在JSP页面中,完成多页面的合并;

请求转发大多是应用在Servlet中,转发目标大多是JSP页面;

注意:请求转发,留头不留体;请求包含,既可以有响应头,也可以有响应体

五、请求转发与重定向比较

请求转发是一个请求,而重定向是两个请求;

请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;

请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;

请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;

重定向的第二个请求一定是GET;

0 人点赞