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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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响应。
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1641245 ,如需转载请自行联系原作者