看到一篇比较有意思的文章,分享一下。原网址:http://blog.csdn.net/rushkid02/article/details/8063792

几乎所有的Web开发语言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的。

作用域分为四种,分别为:

page 在当前页面有效(仅用于JSP中)  
request 在当前请求中有效  
session 在当前会话中有效  
application 在所有应用程序中有效

是不是看不太明白?page因为仅用于JSP中,这里只讲述其他三种作用域。 首先要声明的一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。

话说武松一日来到景阳岗,见一旗帜迎风飘扬,旗子上书五个大字“三碗不过岗”。 武松叫道:“店家,拿三碗酒来,再切两斤熟牛肉!”店小二应声道:“三碗好酒,二斤熟牛肉啰~~”里面厨师赶忙当当当当切好牛肉,店小二倒上三碗酒,店小二端上前来。

武松咕咚咕咚连干三碗,叫一声“好酒!店家,再来三碗!”小二忙又倒上三碗好酒, 武松一饮而尽。就这样前前后后武松一共喝了十八大腕。付了帐刚要走,店小二道: “客官,这前面山上有大虫,客官刚刚喝完十八碗酒恐怕过不得岗,不如在小店暂住一夜, 待明天和猎户一同过岗岂不是好?”

之后武松说什么就留待各位看官自己去回忆啦。在这段武松打虎中, 大家有没有看到些熟悉的东西?

武松: 浏览器。  
酒馆: 服务器。  
店小二、厨师: Servlet或者JSP。  
来三碗好酒!: 浏览器向服务器发出HTTP请求。  
店小二上酒: 服务器的响应。  
武松从进店到离开: 一个HTTP对话。  
我们可以看到,Web交互的最基本单位为HTTP请求(武松点菜)。 每个用户从进入网站到离开网站这段过程称为一个HTTP会话 (武松进店到出店),一个服务器的运行过程中会有多个用户访问, 就是多个HTTP会话(酒馆当然不可能只接待武松一个客人)。那么作用域就可以理解为:

request HTTP请求开始到结束这段时间  
session HTTP会话开始到结束这段时间  
application 服务器启动到停止这段时间

request

一个HTTP请求的处理可能需要多个Servlet合作(武松点菜时店小二就要吩咐厨房做菜), 几个Servlet之间可以通过某种方式传递信息(店小二就用吆喝的方式通知厨房),但这个信息在请求结束后就无效了(厨房在做完菜之后就不用再管这道菜的事儿了)。

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:

void setAttribute(String name, Object value) 将对象 value 以 name 为名称保存到request作用域中。  
Object getAttribute(String name) 从request作用域中取得指定名字的信息。  
doGet()、doPost()函数的第一个参数就是 HttpServletRequest 对象, 使用这个对象的 setAttribute 即可传递信息。

那么设置好信息之后,如何将信息传给其他Servlet? 这就要用到 RequestDispatcher 接口的 forward 方法,将请求转发给其他Servlet。

RequestDispatcher ServletContext.getRequestDispatcher(String path) 取得Dispatcher以便转发。path为转发的目的Servlet。  
void RequestDispatcher.forward(ServletRequest request, ServletResponse response) 将request和response转发。  
因此,只要在当前Servlet中先 setAttribute,然后forward,最后在forward到的Servlet中 getAttribute即可实现信息传递。

PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念, 一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。 需要注意两点:

转发不是重定向,转发是在Web应用内部进行的。PHP支持重定向但没有转发。  
转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。  
session

session作用域比较容易理解,同一浏览器访问多次,在这多次访问之间传递信息,就是session作用域。 ('''武松每次点菜帐房先生都要记一笔账,等武松走之前结帐用。这笔帐在武松吃饭过程中始终有效,即位于session作用域中''')

session是通过HttpSession接口实现的。

Object HttpSession.getAttribute(String name) 从session中获取信息  
void HttpSession.setAttribute(String name, Object value) 向session中保存信息  
而通过HttpServletRequest.getSession()方法可以获得HttpSession对象。

HttpSession HttpServletRequest.getSessio() 获取当前请求所在的session的对象。  
session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始), 但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”),所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。 Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。

void setMaxInactiveInterval(int interval) 设置绘画的超时值。  
如果想主动让会话结束,如用户单击“注销”的时候,可以使用 HttpSession 的 invalidate 方法:

vooid invalidate() 强制结束当前session。  
application

application作用域就是服务器启动到关闭的整段时间, 在这个作用域内设置的信息可以被所有应用程序使用。 (餐馆打烊后结帐,用到的即是开张到打烊之间的所有信息。)

还记得上一节提到的ServetContext吗? application作用域上的信息传递就是通过ServetContext实现的。

Object getAttribute(String name) 从application中获取信息。  
void setAttribute(String name, Object value) 向application作用域中设置信息。  
总结

可以看到,每个作用域除了实现接口不同、意义不同之外,它们的使用方法和作用都是相同的, 都是通过 getAttribute 和 setAttribute 方法进行信息传递。

作用域 意义 实现接口  
request HTTP请求内 HttpServletRequest  
session HTTP会话内 HttpSession  
application 服务器生命周期内 ServletContext

转载于:https://www.cnblogs.com/jxlsomnus/p/4453148.html

对request,session,application作用域形象理解相关推荐

  1. 观看慕课老师milanlover视频JavaBean+Jsp动作元素+page/request/session/application作用域范围+Model1

    Javabeans类写在src包里. 建一个实体类的po包,建一个用户类. 使用普通方式创建javabean实例: 新建Users.java: package com.po; /*用户类*/ publ ...

  2. JSP之四大作用域(pageContext,request,session,application)

    JSP的四大作用域的存储和获取数据的方式一样,差别在于取值的范围不同. 四大域各自作用范围为: pageContext:当前JSP页面有效 request:请求有效 session:会话有效(关闭浏览 ...

  3. 暑期项目经验(九) -- request session application

    request.session.application 一.基础知识 可以看看  浅谈:request,session,application (http://blog.csdn.net/hzc543 ...

  4. 通过ActionContext获取request session application 以及ActionContext的简单解析

    ActionContext:action的上下文对象. 获取application : // 获取ActionContext对象 是action的上下文对象 ActionContext actionC ...

  5. java application作用域_servlet三大作用域:request,session,application

    1. request request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效. 用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件 ...

  6. 网页计数器 javabean session application 多种方法实现

    运用session,javabean,servlet实现网页计数器  目录 一.运行结果 二.原理 1.session 2.Javabean 但是有个小问题 3.application 三.代码分享 ...

  7. [javaweb] servlet-session 会话跟踪技术 与 session保存作用域 (三)

    引入 Http是无状态的 -HTTP无状态︰服务器无法判断这两次请求是同一个客户端发过来的,还是不同的客户端发过来的 -无状态带来的现实问题∶第一次请求是添加商品到购物车,第二次请求是结账;如果这两次 ...

  8. [转帖]Cookies和Session的区别和理解

    https://www.toutiao.com/a6580918457276039684 官方理解: cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器 ...

  9. django Sometimes request.session.session_key is None

    参考 https://stackoverflow.com/questions/39181655/sometimes-request-session-session-key-is-none 加入 一句 ...

最新文章

  1. html 字母列表通讯录,仿微信通讯录字母排序列表
  2. 全球及中国皮肤晒黑喷雾行业销售模式及动态盈利分析报告2021年版
  3. mysql.user表中Host为%的含义
  4. 51单片机——UART
  5. 三星Galaxy S22或放弃Exynos 2200?假消息!依旧双版本
  6. “球鞋一面墙,堪比一套房” 央视评炒鞋乱象:呼吁“鞋穿不炒”
  7. python 调试代码_菜鸟世界 -借助ipython 调试代码
  8. Css实现页面元素置顶时悬浮
  9. Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决
  10. efi分区咋移动到c盘里_efi系统分区是什么?重装系统EFI系统分区图文教程
  11. PLC如何读取模拟量
  12. 抓取百度翻译的接口(通过反编译js获取token、gtk、sign等签名信息)
  13. 达梦数据库磁盘空间满之多种解决办法
  14. d3.js学习笔记(5)drag拖拽操作数据
  15. oracle安装后,电脑变得很卡,解决办法(安装的是oracle11g)
  16. 暗黑2 计算机中丢失,《暗黑破坏神2》部分源代码丢失不是事 暴雪照样重制
  17. 09-kafka分区数的设置
  18. 2021年塔式起重机司机考试及塔式起重机司机复审考试
  19. 用unionID作为oneID的实质:不管理账号和密码
  20. 【数据分析】基于时间序列的预测方法(2021-01-08)时间序列预测

热门文章

  1. 奥松机器人PHP,Arduino四位七段数码管 LED数码管 4位共阳数码管 显示屏模块
  2. Design Patterns(设计模式-发布/订阅)
  3. 浪漫的表白 (5 分)
  4. 实时获取ccd图像_图像处理基础
  5. 计算机excelsumif的公式,EXCELsumif函数的用法展示
  6. php打包mysql_PHP封装MySQL的单例
  7. android屏幕亮度权限,安卓支持将屏幕亮度设为0的方法。
  8. elasticsearch x-pack license过期
  9. 一些加快 程序运行速度的方法
  10. Ajax--同源策略,jsonp跨域传输原理(callback),