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

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

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响应。














本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1641245 ,如需转载请自行联系原作者



相关文章
|
4月前
|
存储 Java 应用服务中间件
Javaweb | 转发、重定向
Javaweb | 转发、重定向
40 0
|
6天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
20 8
|
7月前
|
缓存 Java 数据库
Servlet 处理请求的原理
Servlet 处理请求的原理
175 0
|
4月前
|
Java Spring
SpringMVC中转发与重定向(redirect与forward)实践实例
SpringMVC中转发与重定向(redirect与forward)实践实例
53 0
|
7月前
|
存储 应用服务中间件 数据库
Servlet请求转发和重定向
Servlet请求转发和重定向
112 0
|
7月前
|
应用服务中间件 API
JavaWeb 速通Servlet(请求转发和请求重定向)
JavaWeb——HttpServletRequest 和 HttpServletResponse 内容分享。
129 0
QGS
|
11月前
|
容器
浅谈SpringMVC之转发与重定向
SpringMVC转发与重定向的使用 转发:由web服务器跳转(可携带数据集合)。 重定向:由浏览器跳转(跳转页面)。
QGS
81 0
QGS
|
11月前
|
容器
手拉手入门Servlet转发与重定向
转发与重定向的区别 在Web应用中通过两种方式,可以完成资源的跳转 转发、重定向
QGS
36 0
Servlet学习(八):请求转发(两个servlet程序的交互)
Servlet学习(八):请求转发(两个servlet程序的交互)
110 0
Servlet学习(八):请求转发(两个servlet程序的交互)
Servlet学习(四):请求的分发处理
Servlet学习(四):请求的分发处理