struts2_day03笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2 框架第三天
今天重点内容安排:
第一天:struts2 开发流程、访问Action,Action方法调用,结果集类型
第二天:获取请求参数,请求数据校验机制,拦截器
1、V alueStack 值栈的存储原理和相关操作
2、Ognl 表达式语言语法
3、struts2 页面控制标签
4、struts2 form表单相关标签
重点难点:值栈和Ognl
1.值栈和Ognl表达式
1.1.什么是Ognl
Ognl 对象导航图语言Object Graphic Navigation Language,类似EL,比EL ${}语法要强大很多,Struts2框架使用OGNL作为默认的表达式语言必须要引入struts标签库
EL Expression Language 表达式语言,用来获取JSP页面四个域范围数据
pageContext、request、session、application )
Ognl 主要用法:
1、访问OGNL上下文值栈对象获取数据(最重要)
2、操作集合对象(结合struts2 标签库使用)---- 生成checkbox 、生成select 1.2.什么是值栈ValueStack接口!
值栈ValueStack 实际上是一个接口,struts2 Ognl使用都是基于值栈完成的
Struts2 内部提供OgnlValueStack的接口实现类,实现了值栈接口!
前端控制器每一次请求都会创建一个值栈对象源码:
一次请求对应一个值栈对象值栈生命周期= request 生命周期的!!
值栈是struts2 一个数据结构,贯穿整个Action实例生命周期(request生命周期),一次请求对应一个Action实例,一个Action实例对应一个值栈实例
值栈保存了Action 和其它常用web对象的引用,通过值栈,间接操作这些对象!1.3.值栈的存储结构
1:采用标签
map Context 结构图
2:采用degbug模式查看值栈重要的两个部分结构如图所示:
得出结论:
值栈包含两个部分:root map
⏹CompoundRoot对象,保存Action相关对象--- List结构
⏹ContextMap 上下文Map,保存常用web对象引用---- Map结构
值栈对象获取两种方式:可以由源码追踪得到:
如图:
1、request.getAttribute(“struts.valueStack”);
2、ActionContext.getContext().getValueStack() ;
值栈包括CompoundRoot (对象栈,继承ArrayList)、OgnlContext (ognl上下文,实现Map接口)OgnlContext 上下文,引入CompoundRoot,提供HashMap (values),引用常用web对象
1.4.详细分析值栈内部对象的创建和生命周期
值栈生命周期,就是request生命周期,一次请求,对应一个值栈实例每次新的请求对应一个新的值栈对象实例! 源码:
值栈创建过程源码分析:
如果请求资源是jsp静态页面而非action 值栈对象也创建:但是拦截器不起作用!
如果访问的是action组件需要注意拦截器会起作用生效!!
1、在StrutsPrepareAndExecuteFilter的
prepare.createActionContext(request, response);
创建ValueStack ,将常用web对象,保存OgnlContext的Map 中
2、访问Action ,通过ActionProxy ,调用ActionInvocation
DefaultActionInvocation 的init 方法
stack.push(action); 将当前Action对象,压入root栈顶部
V alueStack 的root 栈存在2个对象,DefaultTextProvider、ValueStackAction(Action栈顶)
3、执行ModelDriven 拦截器,判断Action是否实现ModelDriven接口,如果实现了,
stack.push(model); 将model压入root栈顶部,root栈三个对象
1.5.ognl表达式会执行ValueStack 的findValue 搜索值栈中数据
搜索顺序,先搜索Root栈每个对象的属性,如果都没有搜索Map的key
直接搜索Map的key ,不会搜索root栈
⏹如果访问root (CompoundRoot 对象栈内容),不需要#
⏹如果访问Map 内容(request、response、session、servletContext、attr、parameters),
⏹需要# 进行访问例如# 相当于request.getAttribute(“name” )
1.6.案例演示:值栈存储数据和ognl获取数据
1.6.1.值栈中保存基本数据类型(int double String) action 存储数据
m1.jsp 获取数据
2: 采用set 方法压入栈顶
action 代码
m2.jsp 页面获取之
3: 数据存放在context map 值栈下方数据action 代码:
m3.jsp
1.6.
2.值栈中保存对象数据类型
action 存储对象因action 存放值栈对象中所以提供成员对象通过值栈存储页面获取相关数据
对象存储除了栈顶之外栈顶对象: 通过属性名获取值!!非栈顶对象valuestack.find(搜索表达式); action 代码
m4.jsp页面获取数据