版权声明: 本文由 一只博客 发表于 bloghome博客

文章链接: https://www.bloghome.com.cn/user/cnn237111


Servlet中可以把当前的请求和响应转发到另一个Servlet中,并由另一个Servlet负责输出响应。转发时,源Servlet会把它的ServletRequest对象和ServletRespnse对象都传递给目标Servlet。转发需要调用javax.servlet.RequestDispatcher接口的forward方法。转发的路径在生成RequestDispatcher实例的时候传入。有两种方法可生成RequestDispatcher实例,分别:

ServletContext的getRequestDispatcher方法

ServletRequest的getRequestDispatcher方法

两种方法的区别在于前者的传入参数path必须是绝对路径,而后者的传入参数既可以是绝对路径,也可以是相对路径。在调用forward方法时,会先清空存放响应正文数据的缓冲区,因此再源Servlet中响应的结果无法被发送到客户端 。注意,不能在转发请求之前提交响应,比如调用flushBuffer,输出流的close之类的方法,不然会出现异常。

演示代码,生成2个HttpServlet,一个是Source,一个Target。

Source Servlet

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ServletContext context=getServletContext();
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<pre>");
		out.println("in source.");
		out.println("request object's hashCode is ");out.println(request.hashCode());
		out.println("response object's hashCode is ");out.println(response.hashCode());
		out.println("</pre>");
		RequestDispatcher dispatcher=context.getRequestDispatcher("/servlet/Target");
		dispatcher.forward(request, response);	
		
		System.out.println("in source.");
		System.out.println("request object's hashCode is ");System.out.println(request.hashCode());
		System.out.println("response object's hashCode is ");System.out.println(response.hashCode());
				
	}


Target Servlet


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter out = response.getWriter();
		out.println("<pre>");
		out.println("in target.");
		out.println("request object's hashCode is ");out.println(request.hashCode());
		out.println("response object's hashCode is ");out.println(response.hashCode());

		out.println("</pre>");
		out.flush();
		out.close();
		System.out.println("in target.");
		System.out.println("request object's hashCode is ");System.out.println(request.hashCode());
		System.out.println("response object's hashCode is ");System.out.println(response.hashCode());
	}

当访问SourceServlet的时候,请求会被转发到Target上,最终页面显示如下:

Servlet中的转发_转发

在控制台中,还可以看到如下输出:

Servlet中的转发_转发_02

以上输出说明

1,Source中的响应并未输出。

2,Source中的Response对象和Target中的Response对象上同一个,但是Request对象却不同。

3,dispatcher.forward(request, response);语句执行后,从Target退出,还会继续往下执行。因此顺序是先打印target中的代码,后打印source中的代码。

Servlet的这个forward方法和ASP.net中的Server.Transfer类似,都是对客户端屏蔽了这个跳转。而不像Redirect那样,会有一次302响应。