Java Web中的Servlet请求转发和请求包含

为什么需要这样的操作呢?因为很多时候一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet中跳转到另一个Servlet中处理。

1.格式

首先调用request的getRequestDispatcher(“参数”)方法,获取到一个RequestDispatcher对象:

ResquestDispatcher rd=request.getRequestDispatcher("/MyServlet");  

参数为被包含或被转发的目标Servlet路径。

若是请求转发,接下来输入

rd.forward(request,response);  

若是请求包含,接下来输入

rd.include(request,response);  

即可完成我们的请求转发和请求包含。二者的区别为:

  • 请求转发:由当前Servlet设置响应头(不能设置响应体),下一个Servlet既可设置响应头也可设置响应体。
  • 请求包含:当前Servlet和下一个Servlet共同完成相应头和响应体。

需要注意的是无论是请求转发还是请求包含,都在一个请求范围内,所以多个Servlet中使用的是同一个request和response。

2.请求转发

OneServlet代码如下:

TwoServlet代码如下:

网页响应结果为:

由响应结果我们可以看到OneServlet中设置的响应体没有在网页中显示出来,只有TwoServlet中设置的响应体显示出来了。

3.请求包含

请求包含和请求转发中代码相比,只是在OneServlet中将forward()方法改为include()方法而已。

OneServlet中代码:

TwoServlet中代码:

网页响应结果为:

从响应结果中我们可以看到在OneServlet和TwoServlet中设置的响应体都显示了出来。

4.请求转发和重定向的区别

  1. 请求转发是一个请求一次响应,而重定向是两次请求两次响应。
  2. 请求转发地址栏不变化,而重定向会显示后一个请求的地址。
  3. 请求转发智能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目。
  4. 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名。
  5. 请求转发和重定向二者效率前者高,因为前者只发出一个请求。

    很多时候我们需要地址栏发生变化,那时候必须使用重定向。
    需要在下一个Servlet中获取到request域中的数据,必须用请求转发。

既然请求转发和请求包含都是一个请求需要多个servlet协作完成,那么这些Servlet是如何传递数据的呢?见下文新概念。

5.request域

何为域?上一篇文章中提到对ServletContext域对象(详见Servlet的实现方式)的介绍时已经说过域的功能,即具有能存数据和取数据的功能。

同一请求范围内使用request.setAttribute()来传值、使用request.getAttribute()方法来取值.即前一个Servlet使用request.setAttribute()来传值、后一个Servlet使用request.getAttribute()方法来取值。而当想清除request中的值时,调用request.removeAttribute()方法即可清除。如下图:

上图中三大域对象的生命周期长度为:

request<session<application  

扩展:  注意上图中三个方法和请求参数方法的区别,请求参数是客户端传给服务器的,我们不能修改;而此处的setAttribute()是我们自己设置的属性与属性值。另外Servlet类中有上述三大域,而JSP中有四大域,多了一个pageContext域。

2018.3.19更

欢迎加入我的Java交流1群:659957958。

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626


联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

记得扫一扫领一下红包再走哦