在线客服
扫描二维码
下载博学谷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四大作用域及请求范围的全部总结。相信无论是在实际应用中,还是在面试提问中,大家都会经常遇到这些知识点,因此大家一定要熟记以上的总结。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
折半插入排序讲解 干货教程
相信大家都了解折半插入排序的定义,即对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。本文将从插入排序思想介绍、算法说明、折半插入排序的代码实现这些方面讲解折半插入排序讲解 ,感兴趣的小伙伴就接着看下去吧!
9936
2019-07-30 11:10:06
Activiti实战教程学习哪些知识点?
Activiti实现自定义工作流程,新版Activiti7的工作流体系架构与内部工作机制,实现IHRM常见多种业务流程,Activiti自动化业务流程管理,实现SpringBoot+Activiti整合开发审批中心模块,可以做到项目中审批中心模块,针对不同需求做到工作流的定制化。
5397
2019-11-28 15:44:45
MySQL数据库高级应用需要掌握哪些知识点?
MySQL数据库高级应用需要学习解了MySQL中的视图/存储过程/触发器/索引等对象的使用、常见的SQL优化的技巧、MySQL Server优化、应用优化、查询缓存优化、MySQL锁、数据库常用工具、复制和日志等方面的知识。
5188
2020-01-06 17:40:16
设计模式的六大原则是什么?
设计模式的六大原则是什么?分别是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。下面就请大家跟随小编一起来深入理解这六大原则吧!
6111
2020-07-24 17:01:25
Java开发中Netty线程模型原理解析
Netty是Java领域有名的开源网络库,具有高性能和高扩展性的特点,很多流行的框架都是基于它来构建。netty 线程模型不是一成不变的,取决于用户的启动参数配置。通过设置不同的启动参数Netty ,可同时支持 Reactor 单线程模型、多线程模型。
5013
2021-05-13 10:28:26