请求包含(Include)和请求转发(Forward)
定义
请求包含是指将另一个Servlet的请求处理流程包含进来。
请求转发是指将请求转发给别的Servlet处理。
实现
实现请求包含和请求转发,可以使用HttpServletRequest的getRequestDispatcher()方法取得RequestDispatcher接口的实现对象实例,调用时传入请求、响应对象即可。
取得RequestDispatcher还有两个方式,通过ServletContext的getRequestDispatcher()或getNamedDispatcher()。
demo
package com.test; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet({"/some.controller", "/world"})
public class Some extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Some do one...");
RequestDispatcher dispatcher = request.getRequestDispatcher("other.view");
// 请求包含
dispatcher.include(request, response);
// 请求转发
// dispatcher.forward(request, response);
out.println("Some do two...");
}
}
Some.java
package com.test; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays; @WebServlet({"/other.view", "/view"})
public class Other extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.getWriter().println("Other do one...");
}
}
Other.java
请求转发 forward 的响应结果是:
Other do one...
请求包含 include 的响应结果是:
Some do one...
Other do one...
Some do two...
区别
forward:目前的Servlet不能有任何响应确认,如果在目前的Servlet中通过响应对象设置了一些响应但未确认(响应缓冲区未满或未调用任何清除方法),则所有响应设置会被忽略,如果已经有响应确认且调用了forward()方法,则会抛出IllegalStateException。
include:被包含的Servlet中任何对请求标头的设置都会被忽略。但被包含的Servlet中可以使用getSession()方法取得HttpSession对象。
相同点
1、在取得RequestDispatcher时,也可以包括查询字符串。
例如:req.getRequestDispatcher("other.view?data=123456").include(req, resp);
这样在被包含或转发的Servlet中就可以使用getParameter("data")取得请求参数值。
2.查询字符串的方式,仅适用于传递字符串值给另一个Servlet;如果有必须共享的“对象”,可以设置给请求对象成为属性。
HttpServletRequest上与请求范围属性有关的几个方法如下。
setAttribute():指定名称与对象设置属性。
getAttribute():指定名称取得属性。
getAttributeNames():取得所有属性名称。
removeAttribute():指定名称移除属性。
example:
package com.test; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet({"/some.controller", "/world"})
public class Some extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("setAttr", new int[]{1, 2, 3}); PrintWriter out = response.getWriter();
out.println("Some do one...");
RequestDispatcher dispatcher = request.getRequestDispatcher("other.view?data=123456");
// 请求包含
// dispatcher.include(request, response);
// 请求转发
dispatcher.forward(request, response);
out.println("Some do two...");
}
}
Some.java
package com.test; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays; @WebServlet({"/other.view", "/view"})
public class Other extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String data = request.getParameter("data");
int[] getAttr = (int[])request.getAttribute("setAttr"); response.getWriter().println("Other do one..." + " | "
+ "include or forward parameter: " + data + " | " // 请求或转发时携带的查询参数
+ "setAttrbute object: " + Arrays.toString(getAttr)); // 共享对象
}
}
Other.java
请求转发 forward 的响应结果是:
Other do one... | include or forward parameter: 123456 | setAttrbute object: [1, 2, 3]
请求包含 include 的响应结果是:
Some do one...
Other do one... | include or forward parameter: 123456 | setAttrbute object: [1, 2, 3]
Some do two...
相似点
|
请 求 包 含 |
javax.servlet. include.request_uri |
javax.servlet. include.context_path |
javax.servlet. include.servlet_path |
javax.servlet. include.path_info |
javax.servlet. include.query_string |
|
请 求 转 发 |
javax.servlet. forward.request_uri |
javax.servlet. forward.context_path |
javax.servlet. forward.servlet_path |
javax.servlet. forward.path_info |
javax.servlet. forward.query_string |
|
表 示 上 一 个 Servlet 的 |
Request URI | Context path | Servlet path | Path info |
取得RequestDispatcher时 给定的查询参数 |
如果被包含或转发的Servlet还包含或转发其他的Servlet,则这些属性名称的对应值也会被代换。
example:
package com.test; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet({"/some.controller", "/world"})
public class Some extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Some do one...");
RequestDispatcher dispatcher = request.getRequestDispatcher("other.view?data=123456");
// 请求包含
dispatcher.include(request, response);
// 请求转发
// dispatcher.forward(request, response);
out.println("Some do two...");
}
}
Some.java
package com.test; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet({"/other.view", "/view"})
public class Other extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String request_uri, context_path, servlet_path, path_info, query_string; // 默认的请求包含时的参数
/*request_uri = (String)request.getAttribute("javax.servlet.include.request_uri");
context_path = (String)request.getAttribute("javax.servlet.include.context_path");
servlet_path = (String)request.getAttribute("javax.servlet.include.servlet_path");
path_info = (String)request.getAttribute("javax.servlet.include.path_info");
query_string = (String)request.getAttribute("javax.servlet.include.query_string");*/
// 默认的请求转发时的参数
request_uri = (String)request.getAttribute("javax.servlet.forward.request_uri");
context_path = (String)request.getAttribute("javax.servlet.forward.context_path");
servlet_path = (String)request.getAttribute("javax.servlet.forward.servlet_path");
path_info = (String)request.getAttribute("javax.servlet.forward.path_info");
query_string = (String)request.getAttribute("javax.servlet.forward.query_string"); response.getWriter().println("Other do one..." + " | "
+ "request_uri: " + request_uri + " | "
+ "context_path: " + context_path + " | "
+ "servlet_path: " + servlet_path + " | "
+ "path_info: " + path_info + " | "
+ "query_string: " + query_string
);
}
}
Other.java
请求转发 forward 的响应结果是:
Other do one... | request_uri: /hello/some.controller | context_path: /hello | servlet_path: /some.controller | path_info: null | query_string: null
请求包含 include 的响应结果是:
Some do one...
Other do one... | request_uri: /hello/other.view | context_path: /hello | servlet_path: /other.view | path_info: null | query_string: data=123456
Some do two...
请求包含(Include)和请求转发(Forward)的更多相关文章
- 请求转发(forward)和请求包含(include)的区别?
请求包含的例子 第一个Servlet (DispatcherServlet) @Override protected void doGet(HttpServletRequest req, HttpSe ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- 20160326 javaweb 请求转发和请求包含
(1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...
- Web---字节输出流和字符输出流的共存问题、转发、重定向、请求包含知识点讲解
本章博客的知识点: 1.字节输出流和字符输出流的共存问题 2.转发时,两个servlet都输出信息的问题 详细知识,见OneServlet和TwoServlet源代码中的注释 转发:传参,访问顺序(d ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- getRequestDispatcher 中请求转发和请求包含的使用说明
getRequestDispatcher() getRequestDispatcher() 包含两个方法,分别是请求转发和请求包含. RequestDispatcher rd = request.ge ...
- 直接请求转发(Forward)和间接请求转发(Redirect)两种区别?
用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...
- 请求转发(forward)和请求重定向(redirect)的区别(转)
作者:@haimishasha本文为作者原创,转载请注明出处:https://www.cnblogs.com/haimishasha/p/5952129.html 用户向服务器发送了一次HTTP请求, ...
- 请求转发(forward)和重定向(redirect)的区别
转发不会改变地址栏,重定向会. 转发是请求一次,重定向请求两次. 转发过程中只有一个request对象产生,重定向是两个. 转发不能转发到站外,重定向可以发送到站外. 重定向的第2个请求的请求方式是什 ...
随机推荐
- nodejs(三) --- nodejs进程与子进程
嗯,对于node的学习还远远不够,这里先做一个简单的api的记录,后续深入学习. 第一部分:nodejs中的全局对象之process进程对象 在node中的全局对象是global,相当于浏览器中的wi ...
- Windows里如何正确安装Redis以服务运行(博主推荐)(图文详解)
不多说,直接上干货! 注意 : Redis官方并没有提供Redis的windows安装包,但在github上, 有相关的下载地址. 一.Redis的下载地址 相关的下载地址,如下: ...
- 高级网络功能(Docker支持的网络定制配置)
网络的高级知识,包括网络的启动和配置参数.DNS的使用配置.容器访问和端口映射的相关实现. 在一些具体场景中,Docker支持的网络定制配置,通过Linux命令来调整.补充.甚至替换Docker默认的 ...
- Spring Boot 使用Redis
转载自:http://www.cnblogs.com/ityouknow/p/5748830.html Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化 ...
- JDK 泛型
JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛 ...
- 用java做操作系统内核:软盘读写
在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的.只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要 ...
- JavaScript函数——预编译
四部曲 创建AO对象 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined. 将实参值和形参值统一 在函数体内找函数声明,值赋予函数体. 权重按顺序依次增加.以下例子即可体现上述规则 ...
- Dubbo2.7源码分析-如何发布服务
Dubbo的服务发布逻辑是比较复杂的,我还是以Dubbo自带的示例讲解,这样更方便和容易理解. Provider配置如下: <?xml version="1.0" encod ...
- Start transaction not working with Revit 2014
You're right, it's not being used correctly. The Transaction needs to take place inside the Idling e ...
- java JDBC 数据库链接
1.准备环境搭建: myeclipse,sql2005,jdbc. 2.都下载完之后开始进行安装 ,前两个是属于数据库软件,正常安装即可(注意数据库登陆不要使用windows验证) <1> ...