Servlet中的转发

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上,最终页面显示如下:

clipboard[6]

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

clipboard[7]

以上输出说明

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值