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 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...
随机推荐
- Windows定时重新启动(适用于server 2012 r2)
直接看链接吧:https://jingyan.baidu.com/article/2d5afd69dd8e9d85a2e28eb7.html 开始菜单,找到"计划任务程序"; 2 ...
- 可以设置过期时间的Java缓存Map
前言 最近项目需求需要一个类似于redis可以设置过期时间的K,V存储方式.项目前期暂时不引进redis,暂时用java内存代替. 解决方案 1. ExpiringMap 功能简介 : 1.可设置Ma ...
- 快速入门Redis调用Lua脚本及使用场景介绍
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...
- SpringBoot(九):SpringBoot集成Mybatis
(1)新建一个SpringBoot工程,在pom.xml中配置相关jar依赖 贴代码: <!--加载mybatis整合springboot--> <dependency> &l ...
- Spirent Tester二层裸流配置
1.OLT配置 配一个VLAN,若GE口打Tag,不需要打PVID,打Untag,配PVID. 在ONU上配一个Other Bridge Wan链接. 2.TestCenter配置 选定两个TestC ...
- python工业互联网应用实战7—业务层
本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...
- CodeBlocks的安装配置以及使用教程
CodeBlocks的安装配置以及使用教程 教程写的很啰嗦,本来几句话就能搞定的,但为了照顾到那部分真正的小白还请大家见谅! 一.下载 前往CodeBlocks官网下载带编译器的版本,目前的最新版本为 ...
- 手工实现一个ThreadPoolExecutor
以下代码的实现逻辑出自于公众号 码农翻身 <你管这破玩意叫线程池?> - PS:刘欣老师在我心中是软件技术行业的大刘. 线程池接口 public interface Executor { ...
- 如何在 C# 中使用 const,readonly,static
平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...
- 记录自己第一次搭建本地fabric框架
写在前,第一次搭建fabric框架,对于小白的我很是艰辛,参考了很多博主的博客才最终完成,在此记录一下搭建过程. 参考的网站 https://blog.csdn.net/smallone233/art ...