天天看点

Struts工作机制图+OGNL+EL+值栈(Map,对象栈)

Struts工作机制图+OGNL+EL+值栈(Map,对象栈)

struts 值栈  通过get set方法 方便的获取,设置属性值      例如从jsp页面传来的参数。。。从action设置jsp所要回显的内容

注意el表达式,struts2对request进行了封装,所以它的查找顺序 多了一个findvalue() 如上图

再看下面的代码:

public class useraction {

    private string username;

    //查看用户的详细信息

    public string detail(){

       username = "张三";

       list list = new arraylist();

       for(int i=0; i<10; i++){

           user user = new user();

           user.setusername("user"+i);

           list.add(user);

       }

       actioncontext.getcontext().put("users", list);

       user u = new user();

       u.setusername("赵毅");

       actioncontext.getcontext().getvaluestack().push(u);

       return "detail";

    }

对应的jsp如下:

1:  <s:property value="username"/> <br/>

2:  <s:iterator value="#users">

3:     <s:property value="username"/>

4:     <s:property value="#root[2].username"/><br/>

5:  </s:iterator>

6:  <s:property value="username"/>

7:  <s:property value="#root[1].username"/> <!-- 张三 -->

根据刚才的示例,我们知道,第1行的username是“赵毅”(因为jsp在执行这行代码的时候,compoundroot中有两个元素:第0个是“user对象赵毅”,第1个是“useraction对象张三”),因此第1行的username将取出compoundroot中第0个元素的username属性:赵毅

第2行代码是iterator标签,只定义了一个value属性,iterator标签将循环访问users这个list中的user对象,并把当前循环的user对象压入到compoundroot中!所以,在第3行和第4行代码被执行的时候,compoundroot中总共有3个元素:第0个元素是被iterator标签压入的当前循环的user对象;第1个元素是“user对象赵毅”;第2个元素是“useraction对象张三”,因此第3行代码的执行结果就是输出“userx”,即当前循环的user对象的username属性!iterator标签将会依次取出list中的user对象,并不断压入/弹出user对象(每次循环,都将执行一遍压入/弹出)。而第4行代码取第2个元素的username属性,即useraction对象的username属性:张三。

第5行代码执行完成之后,在compoundroot中将剩下2个元素,与第2行代码被执行之前一样。所以,第6行代码的输出和第1行代码的输出结果是一样的,而第7行代码将取出useraction对象的username属性:张三

继续阅读