标签: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上,最终页面显示如下:
在控制台中,还可以看到如下输出:
以上输出说明
1,Source中的响应并未输出。
2,Source中的Response对象和Target中的Response对象上同一个,但是Request对象却不同。
3,dispatcher.forward(request, response);语句执行后,从Target退出,还会继续往下执行。因此顺序是先打印target中的代码,后打印source中的代码。
Servlet的这个forward方法和ASP.net中的Server.Transfer类似,都是对客户端屏蔽了这个跳转。而不像Redirect那样,会有一次302响应。
本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/1641245
标签:servlet
原文地址:http://cnn237111.blog.51cto.com/2359144/1641245