刨根问底--action属性赋值过程分析

转载 2015年07月10日 12:16:50

转载于大神博客网址 http://my.oschina.net/winHerson/blog/109536  里面有很多原理的东西 暂看不懂 先Mark

首先看一个简单的action类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.xing.action;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class Login extends ActionSupport{ 
    private String userName;
    private String password;
       
    public String getUserName() {
        return userName;
    
    public void setUserName(String userName) {
        this.userName = userName;
    
    public String getPassword() {
        return password;
    
    public void setPassword(String password) {
        this.password = password;
    
       
    public String execute() { 
        System.out.println(userName);
        System.out.println(password);
         
        if("123456".equals(this.userName) && "123456".equals(this.password))
            return "success";
        else
            return "fail";
    
}
这个类很简单,就是继承了ActionSupport,并且重写了execute()方法。当执行execute()方法的时候,调用成员变量userName和password,并且判断是否是123456。


现在有一个疑问,这里的userName和password值,是怎么传递过来的呢?以前学习struts2的时候只知道jsp页面上的属性名称要和action类中的set方法名称其余字符相同,和属性名称是否相同没有关系。具体为什么这样呢?带着这些疑问,继续探索struts2的源码。

    这里分享是怎么把这里相关的源码找到,并且分析完成:

 (1)action类中属性设置值,是在执行action方法之前完成的,那就详细的看看在执行action方法之前,是否有代码进行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分析。

刨根问底--action属性赋值过程分析

首先看一个简单的action类: ? 1 2 3 4 5 6 7 8 9 10 11 12 ...
  • z69183787
  • z69183787
  • 2015年08月12日 21:46
  • 1755

Struts2-Action接受参数方式、method属性使用及通配符的配置

一、Action接受参数的方式1、属性方式接收 首先编写一个用于上传参数的页面action配置成功跳转的页面action类代码 public class UserAction extends Acti...
  • qq_32588349
  • qq_32588349
  • 2016年05月26日 21:25
  • 3885

struts2 上传文件在action 里的属性 name

struts2 上传文件在action里必须提供 private File url;  //strunts2 自动将文件流--》临时储存成tmp文件 private String urlContent...
  • sinat_35767703
  • sinat_35767703
  • 2017年03月28日 10:50
  • 319

Struts2的Action属性名和s三种实现方法

ction中的属性名的含义: name:对应一个struts2的请求的名字(或对一个servletPath,但去除‘/’和扩展名),不包含拓展名 class:需要调用的Action,默认值为:com....
  • yuhui123999
  • yuhui123999
  • 2016年06月04日 11:40
  • 1865

(ios开发中的@property)属性赋值,深浅拷贝

个人对于深浅拷贝的认识,以及对于字符串NSString属性用copy修饰的一些理解.
  • chenjinrong07
  • chenjinrong07
  • 2016年11月30日 16:09
  • 502

javascript对象属性的赋值解析

- 当对象的原型链中的原型对象上有对应的属性名,但是其是**只读的,那么对象属性的赋值操作无效**; - 当对象的原型链中的原型对象上有对应的属性名,但是**其是可写的,且设置了set方法**,那么对...
  • wkyseo
  • wkyseo
  • 2016年05月18日 10:30
  • 2360

Action调用过程分析

MVC6 Action调用分析
  • jezzyzhang
  • jezzyzhang
  • 2015年09月26日 21:34
  • 208

c#属性的赋值问题:为什么属性只读,但是构造函数却还是可以赋值

c#属性的赋值问题
  • BenedictCumberbatch
  • BenedictCumberbatch
  • 2016年12月22日 16:03
  • 1311

Struts2中Action的属性接收参数

Struts2中Action的属性接收参数,有三种传递并接收参数的方式,第一种是在Action添加成员属性接收参数,第二种是域模型,就是利用对象域来进行传递和接收参数,第三种是ModelDriven接...
  • u012561176
  • u012561176
  • 2015年03月23日 22:45
  • 2082

Verilog 连续赋值、过程赋值、过程性连续赋值

连续赋值: 1)语法上,有关键词“assign”来标识; 2)左侧被赋值的数据类型必须是线网型数据(wire); 3)连续赋值语句不能出现在过程快中(initial/always);...
  • wads23456
  • wads23456
  • 2014年12月26日 18:36
  • 3396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:刨根问底--action属性赋值过程分析
举报原因:
原因补充:

(最多只允许输入30个字)