在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
程序员在写代码的时候,难免会遇到作用域的问题,今天我们要谈的也是JSP的四大作用域。本文主要总结了JSP四大作用域page、request、session和application和它们的请求范围。
1、page
page直译就是页面的意思,所以page作用域就比较好理解了——page作用域表示只在当前页面有效,也就是用户请求的页面有效。当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放。当程序运行跑出了当前的页面,你就无法在其它的页面访问当前页面设置的属性值。
我们都知道,JSP最终会被编译成Servlet文件。在Servlet容器中,每个Servlet都只存在一个实例。但是对于page作用域的属性来说,在当前页面设置的属性只在本次访问该页面有效,当你再次访问该页面时,又会重新初始化页面的属性。例如以下代码:
<%
out.print(pageContext.getAttribute("SiteName")); // 输出null
pageContext.setAttribute("SiteName", "果冻想-一个原创技术文章分享网站");
%>
当我在浏览器访问该页面时会输出null;当我再重新打开一个该页面时,还会输出null,并不会输出”果冻想-一个原创技术文章分享网站”。也就是说,page作用域范围的不会存在线程安全的问题,每一次访问同一个页面,设置的page作用域的属性都是不一样的。
2、request作用域
request表示一次客户端的请求,他在请求中有效。
request可以通过setAttribute()和getAttribute方法存取值实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转(需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址,浏览器感知不到),在这些转发页面中都可以使用request中存储的信息。
一次请求的生命周期从客户端发起到服务器接收并响应该请求,或者将该请求forward到另一个页面或者Servlet进行处理而结束。在此期间,本次请求的参数,属性都是有效的;一旦客户端刷新浏览器,重新发起请求,则之前的请求参数和属性都将失效。
特别需要注意的是,当我们使用<jsp:forward .../>动作将当前请求转向另一个页面或者Servlet的时候,该请求的参数和属性也一并转过去,并不会因为<jsp:forward .../>动作而丢失request的参数和属性。
3、session作用域
session作用域在当前回话中有效。当我们向服务器发送第一个请求开始,只要页面不关闭,或者会话未过期(默认30分钟),或者未调用HttpSession的invalidate()方法,接下来的操作都属于同一次会话的范畴。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,在浏览器关闭时结束会话,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话。session也可以通过setAttribute赋值和getAttribute取值。
在JSP中,每当向服务器发送一个请求,服务器响应这个请求的时候,会在客户端的Cookie中写一个session id值。每次发送请求的时候,会将该session id值一起发送到服务器端,服务器端根据该session id值来判断每次请求是否属于同一个session的范畴之内。
4、application作用域
application的作用域是最广的,它在所有的应用程序中都有效。它代表着整个Web应用的全局变量,对每一个页面,每一个Servlet都是有效的。当我们在application中设置属性时,这个属性在任意的一个页面都是可以访问的。
也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。要注意application里的变量可以被所有用户共用,当一个用户对application中的变量做了修改,其他用户再访问的是修改后的值。
在application作用域中设置的属性如果不手动调用removeAttribute函数进行删除的话,那么application中的属性将永远不会删除,如果Web容器发生重启,此时application范围内的所有属性都将丢失。
以上就是JSP四大作用域及请求范围的全部总结。相信无论是在实际应用中,还是在面试提问中,大家都会经常遇到这些知识点,因此大家一定要熟记以上的总结。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
组合模式深度解析
我们常常谈的组合模式,其实就是允许你将对象组合成树形结构来表现 "整体/部分" 层次结构。本文将从组合模式的定义、包含角色、通用源代码以及优缺点几方面来详细分析,帮助大家深刻了解Java设计模式之组合模式。
8472
2019-07-29 17:51:14
iHRM实战项目教程课程学什么?
要学习Activiti7工作流引擎、SAAS-HRM系统概述与搭建环境、SAAS-HRM-数据库设计与前端框架、SAAS-HRM系统用户权限设计概述、权限分配与jwt概述、权限分配与jwt概述、JWT的权限控制与Shiro入门、Shiro高级及SaaS-HRM的认证授权等内容。
6970
2019-11-08 10:24:19
复工后求职Git面试题整理
随着疫情的好转,近期将迎来复工热潮,不少公司企业也纷纷开始了招聘。虽然说受疫情影响,招聘需求比起往年有了一定程度的减少,但是总体上来看互联网公司的技术岗位仍然处于人才紧缺的现状,因此大家更要抓住这次复工求职的机会,好好准备面试。本文为大家整理了Java面试必考的Git面试题,需要复习这部分知识点的朋友可以尝试着做一做。
4429
2020-03-02 23:52:05
Java学完基础之后学什么?怎么学?
Java学完基础之后学什么?需要学习HTML、css、原生js、SQL、Jquery、网络编程、设计模式、框架、Ajax等。Java基础部分学习难度较大,需要建立自己的Java编程思想,掌握各种抽象概念基本运用等,基础阶段学习很重要,Java基础学好下一阶段学习更容易。
6430
2020-09-30 11:03:11
一文说清楚应聘Java开发工程师的基本要求
很多同学来问小谷老师,程序员之间的工资差别为什么那么大,不同等级的程序员分别需要哪些不同的技能,这篇文章小谷老师就以Java为例,讲讲其中的区别。那根据技术水平不同,Java程序员可以分为初级、中级、高级、资深等。不同级别的Java程序员,企业的要求也是有区别。
5328
2021-08-16 18:26:48