JAVAEE_Servlet_16_HttpServletRequest中常用方法(三)
HttpServletRequest中常用方法(三)
* 回顾ServletContext对象,ServletContext对象是Servlet上下文对象
- 创建ServletContext对象
ServletContext application = config.getServletContext();
- ServletContext是Servlet上下文对象,该接口也有这样几个方法,管理ServletContext范围内的数据
- Object getAttribute(String name) 向ServletContext范围中添加数据
- void setAttribute(String name Object o) 从ServletContext范围中读取数据
- void removeAttribute(String name) 移除ServletContext范围中的数据
- ServletContext是怎样的一个范围?
一个Webapp只有一个ServletContext , 所有用户共享的一个上下文范围对象,可以实现数据共享,一般将ServletContext变量命名为Application,可见这个对象代表一个应用。
* HttpServletRequest中常用方法第三类: 操作HttpServletRequest范围内的对象
- 方法:
Object setAttribute(String name Object o) 向ServletRequest范围中添加数据
void getAttribute(String name) 从ServletRequest范围中读取数据
void removeAttribute(String name) 移除ServletRequest范围中的数据
- HttpServletRequest是怎么样的一个范围?
1.HttpServletRequest的变量通常命名为 request,代表当前用户的本次请求, 一次请求代表一个request对象。
2.request只能完成在同一次请求中传递数据。 比如有ServletA和ServletB , A将数据存进去,B是取不出来的,因为B取得时候A请求已经结束了,不是一个请求。
3.如果想要实现 A将数据存进去,B能将数据取出来,需要将两个请求进行连接,执行完成A后自动跳转到B开始执行, 将ServletA和ServletB,放在同一个请求里,必须使用转发技术(forward)。
- 向ServletRequest范围中添加数据 和 读取数据 Object setAttribute(String name Object o)
// 创建一个User对象
User user=new User();
user.setUserCode("11111");
user.setUserName("Morty");
// 向HttpServletRequest范围内添加数据
request.setAttribute("userObj",user);
// 从HttpServletRequest范围内取出数据
Object obj=request.getAttribute("userObj");
// 输出该对象
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.print(obj);
System.out.println(obj);
以上代码,因为实在同一个request中进行的存取操作,所以存进去的数据,可以取出来, 如果在一个Servlet对象中向request对象中添加数据,然后在另一个Servlet对象中取出来,那么就取不出来了,因为第一个请求已经结束了。
## RequestDispatcher 转发
- 如何才能实现在AServlet对象的请求中存入数据,而在Bservlet对象的请求中取出来呢?
* 使用转发技术(forward),将两次Request请求合并在一起,就可以实现了,AServlet对象执行结束后接着执行Bservlet。
* 代码 forward 转发技术
```
// 1.获取请求转发器对象,以下转发器对象指向了ServletRequestTestB
String dispatcherPath="/ServletRequestTest2"; // 需要跳转的对象的路径 <url-pattern>
RequestDispatcher requestDispatcher=request.getRequestDispatcher(dispatcherPath);
// 2.调用请求转发器对象的forward方法,将两个请求合并,即可完成转发
requestDispatcher.forward(request,response);
// 以上代码合并成一行代码,获取请求转发器对象,调用转发器对象的forward方法
request.getRequestDispatcher("/ServletRequestTest2").forward(request,response);
## 关于范围对象 ServletContext 和 HttpServletRequest 的选择 ?
- ServletContext 应用范围广, 可以夸用户传递数据。
- HttpServletRequest 请求范围很小,只能在同一个请求中传递数据,使用请求转发器后可以夸Servlet传递数据,但不可以跨用户传递,因为一个用户一个请求,不同的用户是不同的请求。
- 但优先选择HttpServletRequest传递数据,因为该范围对象占用资源小,请求结束就销毁了。
JAVAEE_Servlet_16_HttpServletRequest中常用方法(三)的更多相关文章
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- 创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。
创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法). ackage com.chuoji.text01; pub ...
- Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循
第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...
- C语言中的三字母词
C语言中的三字母词(trigraph) 在ANSI C标准中,定义了9个三字母词(trigraph),三字母词就是几个字符的序列,合起来表示另一个字符.三字母词使C语言环境可以在缺少一些必需字符的字符 ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...
- TCP/IP源码(59)——TCP中的三个接收队列
http://blog.chinaunix.net/uid-23629988-id-3482647.html TCP/IP源码(59)——TCP中的三个接收队列 作者:gfree.wind@gmai ...
- IT第九天 - 包、访问修饰符、变量的内存分配、String类中常用方法
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为p ...
- httpClient中的三种超时设置小结
httpClient中的三种超时设置小结 本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结,希望此教程能给各位朋友带来帮助. ConnectTimeoutExceptio ...
- TCP协议中的三次握手和四次挥手(图解)【转】
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...
随机推荐
- while(1)和system("pause")区别
我们在调试时,有时候会用到这两个语句. 1.显而易见,第一个是一个循环函数,占cpu.占内存: 2.system("pause")是一个系统调用,占内存,不占cpu;这个开销还是有 ...
- 大数据开发-Spark-Streaming处理数据到mysql
前面一篇讲到streamin读取kafka数据加工处理后写到kafka数据,大数据开发-Spark-开发Streaming处理数据 && 写入Kafka是针对比如推荐领域,实时标签等场 ...
- Newbe.Claptrap 框架入门,第二步 —— 创建项目
接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...
- loadrunner学习笔记一
这篇笔记主要是针对一个具体的loadrunner脚本里面出现的方法进行解释,具体脚本如下: ` Action() { char *transactionName = "Test"; ...
- c++类的简介
一 类的定义 在c++中,我们使用"类"来描述"对象",可以说"类"的实现是c++OOP的核心. 类中包括对象的"属性" ...
- Mybatis检查SQL注入
Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ }. 使用#{ }是来防止SQL注入,使用${ }是用来动态拼接参数. 如 ...
- 番外----python入门----关于pycharm
江湖上有句话叫 "武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋". 今天,我们就来介绍一下,python编程界的"屠龙刀",pycharm. 一. ...
- solr 远程代码执行(CVE-2019-12409)
Apache Solr 远程代码执行漏洞(CVE-2019-12409) 简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.是apache的顶级开源项 ...
- 漫漫Java路1—基础知识—初涉java
前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...
- EmEditor, 在正则使用()匹配后 使用$1 $2进行对括号内的值进行引用
$1表示第一个括号,$2表示第二个括号,以此类推