JavaWeb——关于RequestDispatcher的原理
RequestDispatcher简介
public interface RequestDispatcher {public void forward(ServletRequest request, ServletResponse response)throws ServletException, IOException;public void include(ServletRequest request, ServletResponse response)throws ServletException, IOException; }
RequestDispatcher.forward(request, response)
public class User{private String name;private int age;public String getName(){return name ;}public void setName( String name ){this .name = name ;}public int getAge() {return age ;}public void setAge( int age ){this .age = age ;} }
UsersServlet.java
public class UsersServlet extends HttpServlet {private static final long serialVersionUID = 1L ;protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {/*****************一般实际开发这些用户数据都是从数据库查出来的*********/List <User > users = new ArrayList <> ();User u1 = new User () ;u1 .setAge ( 20) ;u1 .setName ( "Bob") ;User u2 = new User () ;u2 .setAge ( 21) ;u2 .setName ( "Tony") ;users .add ( u1) ;users .add ( u2) ;/*********************************************/request .setAttribute ( "users", users) ; //对request 进制预处理准备工作request .getRequestDispatcher ( "users.jsp").forward( request , response );//转发到users.jsp,让他去具体响应
} }
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"session ="true" %> <%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html> < html> <head> <meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8"> <title> 用户列表</title> </head> <body><p> -----------------转发到的资源users.jsp产生的响应数据------------------ </p>< c:forEach var ="user" items= " ${users}" > 用户姓名:${user.name} 用户年龄:${user.age} <br /> </ c:forEach> </body> </html>
例子2:不使用Attribute,使用Paramter向转发的资源传递参数。
虽然request对象没有setParameter方法来设置参数,但是我们可以在转发的URL后通过QueryString 的方式添加。JSP中的<jsp:foward>标签下的<jsp:param>标签就是使用的这个原理。
AimServlet.java
public class AimServlet extends HttpServlet {private static final long serialVersionUID = 1L ;protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {request .getRequestDispatcher ( "foo.jsp?num=1") . forward( request , response );} }
foo.jsp
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"session ="true" %> <%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %><! DOCTYPE html> <html> <head> <meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8"> <title> 标题</title> </head> <body>通过forward传递过来的参num=${param.num}</body> </html>
RequestDispatcher.include(request, response)
注意事项:
1、被包含者不能设置ServletResponse的响应状态和响应头(否则并不会产生效果),因为这些都是包含者做的事,被包含者只需要产生响应数据解可以了。
2、不同于 forward中的request的传递特性:在被包含的资源中从request中获取请求路径相关的信息,发现依然是原始请求的路径,也就是浏览器地址栏相关的路径,也就是说被包含的资源获得的request对象的路径属性和原始请求资源的路径一样(见下面的例子1)。其它的API调用也是一样的(Attribute 和Parameter)。
例子1
TargetServlet.java
public class TargetServlet extends HttpServlet {private static final long serialVersionUID = 1L ;protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {response .setContentType ( "text/html;charset=utf-8" );PrintWriter out = response .getWriter () ;out .println ( "----------来自TargetServlet的告白----------------<br />" ) ;out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的<br/>" ) ;request .getRequestDispatcher ( "test.jsp") . include( request , response );out .flush () ;out .close () ;} }
test.jsp
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"session = "false" %><p> ------------------------来自test.jsp的告白-------------------------- </p> <p> 我输出的响应数据将被其它的资源包含 </p> 请的URL是 <%= request.getRequestURL().toString() %> ,可以看出客户端真正请求的不是我,我只是幕后工作者。 <p> 但我很开心,因为响应给客户端的数据一部分来自于我 </p>
例子2:通过包含路径后追加QueryString来向被包含资源传递参数,以及通过request.setAttribute传递属性。
同样, JSP中的<jsp:include>标签下的<jsp:param>标签就是通过在含路径后追加QueryString达到的传递参数的效果。
public class TargetServlet extends HttpServlet {private static final long serialVersionUID = 1L ;protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {response .setContentType ( "text/html;charset=utf-8" );PrintWriter out = response .getWriter () ;out .println ( "----------来自TargetServlet的告白----------------<br />" ) ;out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的<br/>" ) ;request .setAttribute ( "sharedatt", "I`m shared attribute") ;request .getRequestDispatcher ( "test.jsp?sharedparam=Im-shared-parameter" ). include (request , response ) ;out .flush () ;out .close () ;} }
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"session = "false" %><p> ------------------------来自test.jsp的告白-------------------------- </p> <p> 我输出的响应数据将被其它的资源包含 </p> <p> 从request中提取共享的属性Attribute : <%= request.getAttribute("s haredatt") %> <p> 从request中提取共享的参数Parameter : <%= request.getParameter("sharedparam" ) %>
参考:http://www.cnblogs.com/lulipro/
转载于:https://www.cnblogs.com/LCharles/p/10267238.html
JavaWeb——关于RequestDispatcher的原理相关推荐
- Javaweb servlet体系结构与原理剖析
Javaweb servlet体系结构与原理剖析 1.Servlet的工作过程 2.Servlet体系结构 3.Servlet工作原理 4.Servlet生命周期 1.Servlet的工作过程 当用户 ...
- JAVAWEB入门之Requset原理
Request 1.request和respinse对象的原理 request和respinse对象是由服务器创建的,我们只是使用他们 request对象是来获取请求消息,response是来设置响应 ...
- JavaWeb中的Servlet原理是什么?(存库,建议收藏)
Servlet原理 Servlet是由web服务器调用,web服务器在收到浏览器请求之后,经过一系列传输,最后web服务器读取响应信息,将其读取的信息传送到浏览器 Mapping问题: 一个Servl ...
- JavaWeb - SSO单点登录原理之基于CAS(一)
一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...
- struts2控制标签(一)选择标签,iterator标签,append标签
选择标签就不用说了 iterator迭代器标签主要是对集合进行迭代操作,集合可以是List,Map,Set和数组等 id:指定集合元素的ID value: 指定迭代输出的集合,该集合可以试OGNL表达 ...
- 资料汇总--java开发程序员必备技能
1. 熟练使用Java语言进行面向对象程序设计(面向对象:继承.多态.抽象): 有良好的编程习惯(阿里开发手册 链接:http://pan.baidu.com/s/1dFEA6cT 密码:kqj4 ...
- Java后端程序员技术栈
Java后端程序员技术栈 它可以是知识提纲,便于快速复习与查阅 它也可以是你的学习规划,帮助小白快速了解学Java要走的路(当然你也可以选择搭配我的学习路线一起享用!) 相关链接: <gitee ...
- JavaWeb第一讲 Servlet的工作原理及生命周期
Servlet的工作原理及生命周期 (一)Tomcat容器模型 Servlet的运行离不开Tomcat,那我们先弄清楚Tomcat的容器模型. 由上图可以看出,在Tomcat下有一个Container ...
- 【JavaWeb】Cookie的基本使用、原理分析、使用细节
[JavaWeb]Cookie的基本使用.原理分析.使用细节 一.Cookie的基本使用 对于Cookie的使用,我们更关注的应该是后台代码如何操作Cookie,对于Cookie的操作主要分两大类,本 ...
最新文章
- 第十五届全国大学生智能汽车竞赛山东赛区国赛获奖队伍详细信息
- 是否可以将Java 8用于Android开发?
- 暴汗,今天遇到个奇事
- 只须9招牵着职场幸福走
- .NET中使用Memcached的相关资源整理 转载之DUDU 程序员打杂的站长
- 思科:2022年视频将占移动通信流量79%
- 【零基础学Java】—对象的向上和向下转型(二十七)
- 【汇编语言与计算机系统结构笔记19】虚存概念初步,MIPS内存管理
- matlab拟合不显示直线,新人求助一下MATLAB直线拟合问题
- 同济第七版高数资料(教材+习题解答)
- ps去水印教程_Adobe Photoshop CS2去除水印方法 PS去水印教程
- DVWA 跨站请求伪造(CSRF)
- 3dmax su 简单_Sketchup导入3DSMAX的方法 3DMAX导入SU技巧
- cad怎么画立体图形教学_CAD画三维图中如何绘制三维实体
- 几款笔记软件的优缺点
- Java如何实现手动连接数据库(Mysql或Oracle) | 超级详细,建议收藏
- node-addon-api的设计和实现
- mysql timediff函数极限值
- vue3+setup写法
- python08课后练习歌手成绩
热门文章
- 诺基亚继续打情怀牌:怀旧小屏手机入网!
- 图片保存到数据库和从数据库读取图片并显示(C#)
- 红黑树的java实现
- MySQL数据类型不一致_数据类型不一致导致的SQL不走索引
- 如何判断基因组的重复区域_利用宏基因组数据组装巨病毒基因组的优势与限制...
- 关于“EXP-00056: ORACLE error 12154 encountered”的解决方法
- 【java】RMI教程:入门与编译方法 远程
- 【Elasticsearch】在 Elasticsearch 中每秒存储 5000 万个事件:我们是如何做到的
- 【kibana】kibana 7.* 设置中文 汉化
- 【Docker】elasticsearch 监控工具 elasticsearch-HQ