刨根问底--action属性赋值过程分析
2015-08-12 21:46
218 查看
首先看一个简单的action类:
?
这个类很简单,就是继承了ActionSupport,并且重写了execute()方法。当执行execute()方法的时候,调用成员变量userName和password,并且判断是否是123456。
现在有一个疑问,这里的userName和password值,是怎么传递过来的呢?以前学习struts2的时候只知道jsp页面上的属性名称要和action类中的set方法名称其余字符相同,和属性名称是否相同没有关系。具体为什么这样呢?带着这些疑问,继续探索struts2的源码。
这里分享是怎么把这里相关的源码找到,并且分析完成:
(1)action类中属性设置值,是在执行action方法之前完成的,那就详细的看看在执行action方法之前,是否有代码进行action属性的设置。请参照《刨根问底-struts-serviceAction()创建并执行action》
(2)创建action对象的过程中没有发现
(3)执行action方法的过程也没有发现
到这里不可思议那到底是在那执行的呢?突然想到,在执行action方法之前,会循环执行所有的拦截器,不会是某个拦截器,做了这份工作吧。实践证明确实是ParametersInterceptor拦截器做了这份工作。
如果package使用了ParameterIntercepter这个拦截器,OgnlValueStack会自动为Action中有set方法的属性赋值(如果用了modeldriven,同样也会为实体中有set方法的属性赋值),赋值时,OGNL会将此时值栈中的action当做当前节点(默认情况下在请求进入action之前,该action也会被放入值栈),然后访问它的成员属性的set方法,如果ognl的context中的参数在action中找不到对应的set方法,就会抛出OgnlException。
struts有三大核心包:xwork,ognl,struts-core。xwork,struts-core这个2个jar包在前面都有亲密的接触,而ognl则没有太多的接触,现在来熟悉一下他。
1、OGNL概念:
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
2、OGNL三要素:
(1).expression 求值表达式——首先会被解析成对象树
(2).rootobject 根对象——默认的操作对象
(3).context OGNL执行环境——OGNL执行的上下文环境
OGNL context是一个Map结构,ognl.OgnlContext类implements
Map接口,root对象也在context里面,并且做这一个特殊的对象处理,具体表现为对root 对象的操作不需要加#指示符号(并且加上了#一定取不到root对象里面的值)。
3、Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
(1)支持对象方法调用,如xxx.doSomeSpecial();
(2)支持类 静态 的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名
| 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
(3)支持赋值操作和 表达式 串联,如price=100,
discount=0.8, calculatePrice(),这个表达式会返回80;
(4)访问OGNL上下文(OGNL context)和ActionContext;
(5)操作集合对象。
由于ognl前面没有详细分析过,首先对ognl读取数据的过程和设置数据的过程分析完成,然后在联系struts2分析。
《刨根问底--ognl--get获取数据》
《刨根问底--ognl-set设置数据》
《刨根问底-struts和ognl密切分析》
更详细的ognl信息请参照:
《忘记李刚,一步一步跟我学Struts2
—— OGNL,数据运转的催化剂》
《Struts2学习笔记(十) OGNL》
?
现在有一个疑问,这里的userName和password值,是怎么传递过来的呢?以前学习struts2的时候只知道jsp页面上的属性名称要和action类中的set方法名称其余字符相同,和属性名称是否相同没有关系。具体为什么这样呢?带着这些疑问,继续探索struts2的源码。
这里分享是怎么把这里相关的源码找到,并且分析完成:
(1)action类中属性设置值,是在执行action方法之前完成的,那就详细的看看在执行action方法之前,是否有代码进行action属性的设置。请参照《刨根问底-struts-serviceAction()创建并执行action》
(2)创建action对象的过程中没有发现
(3)执行action方法的过程也没有发现
到这里不可思议那到底是在那执行的呢?突然想到,在执行action方法之前,会循环执行所有的拦截器,不会是某个拦截器,做了这份工作吧。实践证明确实是ParametersInterceptor拦截器做了这份工作。
如果package使用了ParameterIntercepter这个拦截器,OgnlValueStack会自动为Action中有set方法的属性赋值(如果用了modeldriven,同样也会为实体中有set方法的属性赋值),赋值时,OGNL会将此时值栈中的action当做当前节点(默认情况下在请求进入action之前,该action也会被放入值栈),然后访问它的成员属性的set方法,如果ognl的context中的参数在action中找不到对应的set方法,就会抛出OgnlException。
struts有三大核心包:xwork,ognl,struts-core。xwork,struts-core这个2个jar包在前面都有亲密的接触,而ognl则没有太多的接触,现在来熟悉一下他。
1、OGNL概念:
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
2、OGNL三要素:
(1).expression 求值表达式——首先会被解析成对象树
(2).rootobject 根对象——默认的操作对象
(3).context OGNL执行环境——OGNL执行的上下文环境
OGNL context是一个Map结构,ognl.OgnlContext类implements
Map接口,root对象也在context里面,并且做这一个特殊的对象处理,具体表现为对root 对象的操作不需要加#指示符号(并且加上了#一定取不到root对象里面的值)。
3、Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
(1)支持对象方法调用,如xxx.doSomeSpecial();
(2)支持类 静态 的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名
| 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
(3)支持赋值操作和 表达式 串联,如price=100,
discount=0.8, calculatePrice(),这个表达式会返回80;
(4)访问OGNL上下文(OGNL context)和ActionContext;
(5)操作集合对象。
由于ognl前面没有详细分析过,首先对ognl读取数据的过程和设置数据的过程分析完成,然后在联系struts2分析。
《刨根问底--ognl--get获取数据》
《刨根问底--ognl-set设置数据》
《刨根问底-struts和ognl密切分析》
更详细的ognl信息请参照:
《忘记李刚,一步一步跟我学Struts2
—— OGNL,数据运转的催化剂》
《Struts2学习笔记(十) OGNL》
相关文章推荐
- 用一个数来保存多个开关
- SecureCRT 绝佳配色方案, 保护你的眼睛
- Java学习之路0811(预编译、事务、web项目)
- 对象和数组(8.11)
- 没做过编译器就是被人欺——从一道变态的类型转换题猜编译器的行为(指针直接调用自己的非虚函数,当时是什么类型就是什么,但数据成员仍用自己的)
- Delphi FastReport动态加载图片 (转载)
- c++函数指针与默认参数
- 递归求n!
- Longest Run on a Snowboard
- 使用直方图统计像素
- SDUT 1124-飞跃荒野(三维BFS)
- lucene003_lucene的索引文件格式
- 数据库SQL优化大总结之 百万级数据库优化方案
- 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全
- 【Struts2学习笔记-4】包含其他配置文件
- CXF简单示例(一)
- MySQL5.6主从复制(读写分离)
- 工具类:MD5加密
- 机房之报表(日、周结账单)
- SecureCRT 讲解以及安装