在线客服
扫描二维码
下载博学谷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开发中静态变量和实例变量的区别是什么?
Java开发中静态变量和实例变量的区别是什么?在语法定义上的区别:静态变量前要加 static 关键字,而实例变 量前则不加。
8475
2019-05-24 14:16:01
学Java有什么用?能做哪些开发的岗位?
学Java有什么用?能做哪些开发的岗位?Java的应用场景十分广泛,毫不夸张的说,当下的互联网已经离不开Java语言了。按照不同的用途,Java在Android应用、服务器程序、网站领域、软件工具、交易系统、J2ME系统、嵌入式领域等等方面,发挥了重要作用。因此只要学好Java,大家再也不用担心能做的开发岗位被限制了。
6238
2019-10-29 11:01:11
2019蚂蚁金服Java开发面试题含答案
一般来讲,蚂蚁金服这样的大公司都会有至少三次的技术面试。前一轮的问题一般都是比较基础的问题,当然对于许多人来讲,基础性的问题也不一定简单。本文就专门针对Java开发的面试者,整理出了最新的蚂蚁金服一面题,并附上了参考答案,希望可以帮到即将要到蚂蚁金服面试的求职者。如果近期没有面试需求的朋友,也可以查漏补缺,看看自己的学习有哪些欠缺的地方。
6637
2019-12-02 19:29:44
英语不好能学好Java开发吗?
学好Java开发对英语的要求并不高,编程常用的高频词并不多,有的单词是程序员随便写的不要求是完整的英文单词()变量名可以用部分英文,拼音,数字组成。系统已有的成员方法的名字,有的英文还挺长,可以借助开发工具输入提醒功能进行自动录入,不需要你记住很长的方法名字。
5996
2019-12-04 10:56:53
怎样从0开始学好Java开发?
许多想要从事IT技术工作的朋友,在一开始都会把Java作为入门编程的首选语言。的确,Java作为久盛不衰的流行语言,一直一以来都备受程序开发者的青睐。那么,怎样从0开始学好Java开发呢?这里本文将推荐给大家免费的零基础入门Java开发的在线课程,一起来看看相关课程的介绍吧!
5287
2020-07-15 17:10:31
