在线客服
扫描二维码
下载博学谷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开发对英语的要求并不高,编程常用的高频词并不多,有的单词是程序员随便写的不要求是完整的英文单词()变量名可以用部分英文,拼音,数字组成。系统已有的成员方法的名字,有的英文还挺长,可以借助开发工具输入提醒功能进行自动录入,不需要你记住很长的方法名字。
5613
2019-12-04 10:56:53
GC垃圾回收学习笔记整理
只要掌握了GC垃圾回收的相关知识点,程序员在工作中就不用担心内存管理了,因为垃圾收集器会自动进行管理。本文为大家整理了GC垃圾回收的学习笔记,主要内容包括了判断回收条件,虚拟机频繁full GC的解决对策以及经典的垃圾回收算法。大家要是对GC垃圾回收的相关学习学习感兴趣,就接着看下去吧!
5354
2020-03-26 22:20:37
零基础入门Java编程语言学习路线及目标
零基础入门Java编程语言学习内容及目标,Java语言零基础入门阶段主要学习Java基础语法、面向对象基础、API基础、集合基础等知识,Java编程入门阶段学习目标掌握Java开发环境基本配置;运算符、表达式、流程控制语句、数组等的使用;熟练使用IDEA开发工具;Java基本面向对象知识;常用类String、ArrayList等的使用;学生管理系统编写。
5118
2020-04-16 16:02:11
线程池经典面试题整理附答案
线程池是一种多线程处理形式,它是Java开发面试中的必考知识点,尤其是在一些大厂的求职面试中,线程池是对求职者考核的重点。为了帮助大家可以更好地通过面试,本文特地为大家整理了线程池经典面试题并附上了答案,下面一起来尝试着做一做吧!
9081
2020-06-17 14:44:17
30种MySQL查询语句优化方法分享
30种MySQL查询语句优化方法分享,对于MySQL查询语句来说效率是最重要的能用一分钟搞定的绝不能花费两分钟。今天整理了30种MySQL查询语句优化方法,供大家学习使用。
3008
2022-06-16 11:21:52