什么是作用域?

我们在写代码的时候,都会遇到变量的作用域的问题;比如这是一个局部变量,出了它的作用域就无法访问了。对于作用域的概念,最简单的理解就是:

在你的地盘,你还算根葱;出了你的地盘,你啥也不是。

我们在定义每一个变量,每一个属性的时候,都会考虑这个变量、属性的作用范围,也就是作用域。我们会根据我们的需求定义最适当作用域内的变量和属性。在写Java,C++等代码的时候,这个作用域问题还比较好理解,无非就是局部变量、全局变量、静态变量等区别。而到了JSP开发中,这个作用域概念就和一些新的名词混在一起,变的模糊,难懂了起来。这篇文章将对JSP开发中涉及到的四大作用域进行详细的剖析与总结,还自己一个“明白”。

JSP中的四大作用域

阅读过我总结的这篇《JSP内置对象——pageContext对象》文章的伙计,应该对JSP中的四大作用域有个初步的印象和理解。对于JSP中的四大作用域,主要是指以下四个:

page作用域

request作用域

session作用域

application作用域

这四个作用域的作用范围,由上到下是一个比一个大。下面就对上述的四个作用域分别进行详细的总结。

page作用域详解

page直译就是页面的意思,所以page作用域就比较好理解了——page作用域表示只在当前页面有效。当程序运行跑出了当前的页面,你就无法在其它的页面访问当前页面设置的属性值。

我们都知道,JSP最终会被编译成Servlet文件。在Servlet容器中,每个Servlet都只存在一个实例。但是对于page作用域的属性来说,在当前页面设置的属性只在本次访问该页面有效,当你再次访问该页面时,又会重新初始化页面的属性。例如以下代码:

当我在浏览器访问该页面时会输出null;当我再重新打开一个该页面时,还会输出null,并不会输出”果冻想-一个原创技术文章分享网站”。也就是说,page作用域范围的不会存在线程安全的问题,每一次访问同一个页面,设置的page作用域的属性都是不一样的。

request作用域详解

request表示一次客户端的请求。一次请求的生命周期从客户端发起到服务器接收并响应该请求,或者将该请求forward到另一个页面或者Servlet进行处理而结束。在此期间,本次请求的参数,属性都是有效的;一旦客户端刷新浏览器,重新发起请求,则之前的请求参数和属性都将失效。

特别需要注意的是,当我们使用动作将当前请求转向另一个页面或者Servlet的时候,该请求的参数和属性也一并转过去,并不会因为动作而丢失request的参数和属性。

session作用域详解

我一直都在强调session是一个非常重要的概念。当我们向服务器发送第一个请求开始,只要页面不关闭,或者会话未过期(默认30分钟),或者未调用HttpSession的invalidate()方法,接下来的操作都属于同一次会话的范畴。

在JSP中,每当向服务器发送一个请求,服务器响应这个请求的时候,会在客户端的Cookie中写一个session id值。每次发送请求的时候,会将该session id值一起发送到服务器端,服务器端根据该session id值来判断每次请求是否属于同一个session的范畴之内。

application作用域详解

application的作用域是最广的,它代表着整个Web应用的全局变量,对每一个页面,每一个Servlet都是有效的。当我们在application中设置属性时,这个属性在任意的一个页面都是可以访问的。

在application作用域中设置的属性如果不手动调用removeAttribute函数进行删除的话,那么application中的属性将永远不会删除,如果Web容器发生重启,此时application范围内的所有属性都将丢失。

总结

你看完以后,可能会想,这都总结了点啥啊。不就是几个作用域么?其实并不是这么简单,在实际开发中,我们会经常和本文总结的这四种作用域打交道,有的时候搞不清楚,会让你深陷代码,页面和Servlet的泥潭,你根本不知道这个变量是从哪里来的,为什么这里又可以访问那个变量;就是这样,这些貌似很小的知识点,可能就是你日后开发中把握代码,熟悉功能的关键。

果冻想-一个原创技术文章分享网站。

2015年11月18日 于呼和浩特。

java的四大作用域_JSP中的四大作用域相关推荐

  1. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  2. python中函数作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  3. python函数中变量的作用域_Python中变量的作用域(variable scope)

    此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...

  4. java默认作用域_java中默认的作用域

    Java期末复习题全_其它_高等教育_教育专区.JAVA语言程序设计(第2版)吕凤翥 马浩编著 第一部分 Java 语言概述 1 选择题 1-1 在下列概念中,Java 语言只保留了 ...... ( ...

  5. jsp中接收java的返回值_jsp中request的一些方法返回值

    在页面上打印如下内容,通过服务器本地和客户端异地调用的结果如下 String url111 = request.getRequestURI(); System.out.println("ur ...

  6. python类中变量作用域_Python中的变量作用域

    1.块级作用域 1 if 1 == 1:2 name = "lzl" 3 4 print(name) //输出lzl5 6 7 for i in range(10):8 age = ...

  7. python编程中的运算_Python编程中的四大运算法则

    接触过编程的人都知道,编程中的数学知识无处不在,通过数学建模能够解决我们实际生活中的很多问题.当然这并不是说必须要成为一名数学大神才能学编程,但掌握数学知识在编程中的表达方法却是很有必要的,今天南京小 ...

  8. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

  9. java中变量的作用域

    java中变量的作用域 变量一定会被定义在某一对大括号中,该大括号所包含的代码区便是这个变量的作用域.变量分为四个级块:类级 ,对象实例级 ,方法级 ,块级 类级:所谓的全局变量,需要使用static ...

最新文章

  1. mysql的worker 线程_MySQL线程
  2. c 获取mysql列数据_转 用C API 操作MySQL数据库
  3. c语言模拟实现oc引用计数
  4. 百度提出PADDLESEG:一个高效的图像分割开发工具
  5. linux读取nand的文件,Linux Kernel 之AP读写Nand Flash上的Yaffs2文件的全过程浅析
  6. python工具-文件及文件夹移动及处理
  7. 4、已知圆的半径radius= 1.5,求其面积
  8. (26)VHDL实现或(数据流描述)
  9. case when then else end 用法
  10. 区块链开发指南_区块链软件开发详解
  11. 2022年最新《谷粒学院开发教程》:1 - 构建工程篇
  12. 啦啦外卖商家端APP打包
  13. Avaya Aura™ 独家观察报告
  14. 3DMark03 测试显卡
  15. phpmywind调用方法大全
  16. 利用excel表格将IP(IPV4)地址自动按段拆分每一段的数值至单元格
  17. linux xxd命令
  18. nodejs卸载安装
  19. java中的事件都继承自_下列说法中不正确的是()。A.Java语言中的事件都是继承自Java.awt.AW-TEvent类B.AWTEve...
  20. 算法(Java实现)-算法的时间复杂度和空间复杂度

热门文章

  1. 知网检测”独创性声明”、“版权声明”吗
  2. qt 点击按钮不抬起,按钮无法点击
  3. netcraft 查询网络数据结构
  4. 网站开发相关术语发音
  5. 商品sku算法php,笛卡尔乘积-电商网站商品sku组合算法应用
  6. 【C#/.NET】record介绍
  7. jmeter接口测试面试题(jmeter接口测试步骤)
  8. web常见的几种数据交互的常见方式
  9. STC用PCA测量脉宽_利用微处理器设计的电机数字测速系统,抗干扰能力强、测量精确...
  10. 农业气象环境监测系统