struts2_day03笔记

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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页面获取数据

相关文档
最新文档