14.(3)Struts2_值栈

值栈是struts2内部一片很重要的区域,我在初学的时候,发现对于值栈这个数据结构的理解不是很深刻.例如OGNLContext是什么,ActionContext和值栈有什么关系.为什么ActionContext可以获得值栈和contextMap等等,这些都是在我初学的时候的难以理解的概念性问题.我在网上查找了很多资料,发现网上对于这一概念的解释很多都是复制粘贴或者解释的不是很清楚,因此写一篇博文帮助和我一样对于struts2值栈内部的数据结构的引用不清楚的童鞋!首先看看值栈的数据结构:


可以看出OgnlValueStack(值栈的实现类)包含两大部分:CompoundRoot(这其实是一个ArrayList.)和context.(我们通常称为contextMap).有了这个知识储备,接下来我们去看struts2关于值栈创建的源码:

在学习中,我们知道.值栈是和ActionContext同步创建的.因此需要了解值栈的创建,必须要进入ActionContext的创建方法里去观察.实际上,在struts2的核心过滤器StrutsPrepareAndExecuteFilter里在每次请求都会调用的doFilter方法里很容易就能找到这个方法.


进入到这个方法的内部观察,我们可以获得很多的信息.


整个过程分为4步,首先我们进入第一步(标注为1的代码)的方法内部,观察值栈的创建.


可以看出在struts2中值栈的实现类是OgnlValueStack.继续进入构造方法内部观察:


可以看出contextMap内部是维护了值栈的引用的.进入createDefaultContext方法内部:

从标志的这一句可以看出来contextMap内部也维护了root的引用.至此,我们知道,在这时,值栈已经创建完毕.且值栈的contextMap内部维护了值栈本身(OgnlValueStack)以及根(ComponentRoot)的引用.实际上,也可以看出来值栈的contextMap的实际数据结构为OgnlContext.接下来我们跟踪在PreparedOperations类内部createActionContext方法的stack.getContext().putAll这一句(上面标注的第二步).直接进入dispatcher.createContextMap的内部.


可以看出这个操作,就是在contextMap内部加入了各个域对象(request,ServletContext,session)的引用.通过contextMap可以获取到各个域对象的引用.
  返回,在createActionContext方法内,继续往下走,第三步,可以看出将值栈(OgnlValueStack)的contextMap作为ActionContext的构造方法的参数传了进去.进入ActionContext类,实际上其内部是维护了一个叫做context的map来指向OgnlValueStack的contextMap的.而构造方法,正是对这个叫做context的成员变量初始化赋值.


返回createActionContext方法,进入第四步.也就是ActionContext.setContext()方法.这个方法将新建的ActionContext以静态方法的参数传入ActionContext.进入这个方法内部:


原来这个方法是将新创建的ActionContext绑定到了ThreadLocal上.ThreadLocal的set方法是将ThreadLocal对象和数据对象作为键值对存入线程对象内部的一个Map类型的数据结构里.因此,由于ActionContext被绑定在ThreadLocal对象上,所以ActionContext是线程安全的.


  综上,这就是值栈的创建过程.可以看出ActionContext和值栈同时创建,而且都是一次请求创建一次.生命周期为1次请求!值栈包括两部分:contextMap和root.其中contextMap维护了值栈本身和root的引用.ActionContext内部维护了contextMap的引用,因此一些教程上说的,ActionContext内部维护了值栈的引用是不正确的!正确的说法应该是ActionContext内部维护了contextMap的引用,contextMap内部维护了值栈的引用!为了便于理解,我画出了下面的图,仅供参考: 



<转载于博客园博主大胡龙的小圈子>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值