Struts2中值栈

来源:互联网 发布:最好的网络电话软件 编辑:程序博客网 时间:2024/06/06 04:07

Struts2中值栈的理解 




一、拦截器的初始化

     如图所示呢,在一次请求过程中,拦截器首先会创建以及初始化一个值栈对象以供使用。初始化过程中,在Map对象里面放了request=,session=,application=,sttr=,parameters=,....;在Stack里放了action对象和其他一些对象(注意对象栈是先进后出,类似弹匣)。由此可见值栈的生命周期是一次请求

    另外的拦截器,比如说ModelDriven和Params也会对值栈对象进行操作。ModelDriven的初始化会把model压到栈顶

Params的初始化会把参数设置到值栈对象里,从栈顶开始先查找对象栈里对象的属性,找到就初始化进去,找不到再放到Map的parameters里面。    例如参数是这样:xx.action?id=3&name=ab&age=20&aaa=100,而栈中从栈顶的对象初始化依次为model(id=3 name=ab)、action(id age=20),而aaa参数会放到Map的parameters里面。

二、操作值栈

   1.在action类中对值栈的操作

     操作Map:  ActionContext.getContext()

                       .put(k, v)

                       .get(k)  

                      或者

                       ActionContext.getContext().getValueStack()

                       .put(k, v)

                       .get(k)

 

     操作Stack: ActionContext.getContext.getValueStack()

                          .push(obj)

                         .pop()


      2.在Result中操作值栈(大多在jsp文件中的操作)

      通过使用OGNL表达式操作值栈

       格式:struts.xml中,格式如${ognl}

                   Jsp文件中,格式如%{ognl},而且必须写在struts2的自定义标签的属性中,在外面不会被解析

       语法 user                 = findValue("user") *

                   #user               = map.get("user")

                   #user.name     = map.get("user").getName()

         * findValue()的查找顺序

        ①从对象栈的栈顶开始查找对象的属性,找到返回

        ②如果对象栈中找不到,进Map查找对应key,返回value,找到返回

    

例子:                  

[html] view plain copy
  1. <span style="font-size:18px;background-color: rgb(255, 255, 255);"><s:iterator value="#roleList">  
  2.     <s:property value="id"/>,  
  3.     <s:property value="name"/>,  
  4.     <s:property value="description"/>,  
  5.     <s:a action="role_delete?id=%{id}" onclick="return confirm('确定要删除吗?')">删除</s:a>  
  6.     <s:a action="role_editUI?id=%{id}">修改</s:a>  
  7.     <br/>  
  8. </s:iterator></span>  

 

    在值栈的Map里面有roleList的List,取出来循环

    循环标签还有个特定的功能,循环一次开始后,会把对象拿到栈顶,因此id,name,dedcription会取到当前对象的属性,这里的“%{}”可以省略。


看官看到这里会有一问:

EL表达式可以使用值栈吗?

       EL表达式原本的查找顺序为:

    page,request,session,application,找到返回。

    值栈并不在EL表达式的作用范围之内,因此不能使用。但是


    struts2对request对象进行了增强,即StrutsRequestWrapper对象,里面重写了getAttribute()方法:在request找不到之后到值栈里面找,因此

EL表达式的查找顺序变为:page,request,valueStack.findValue(),session,application。

所以上述例子也可以写为:

[html] view plain copy
  1. <s:iterator value="#roleList">  
  2.     ${id},  
  3.     ${name},  
  4.     ${description},  
  5.     <s:a action="role_delete?id=%{id}" onclick="return confirm('确定要删除吗?')">删除</s:a>  
  6.     <s:a action="role_editUI?id=%{id}">修改</s:a>  
  7.     <br/>  
  8. </s:iterator>  

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喉咙痒咳嗽有痰怎么办 痒咳嗽停不下来怎么办 嗓子疼咳嗽有痰怎么办 上火了喉咙干痒怎么办 喉咙里总是有痰怎么办 1岁宝宝喉咙有痰怎么办 嗓子总感觉有痰怎么办 嗓子痒感觉有痰怎么办 1岁宝宝嗓子有痰怎么办 3岁宝宝嗓子有痰怎么办 喉咙总感觉有痰怎么办 感冒了喉咙有痰怎么办 咽喉有异物感是怎么办 老感觉喉咙有痰怎么办 感冒有痰怎么办最有效 感冒快好了有痰怎么办 喉咙里一直有痰怎么办 一到晚上就咳嗽怎么办 1岁宝宝咳嗽痰多怎么办 3岁宝宝咳嗽痰多怎么办 六岁儿童咳嗽有痰怎么办 很多白痰在喉咙怎么办 我喉咙总是有痰怎么办 喉咙老感觉有痰怎么办 喉咙痒老是有痰怎么办 抽烟多了嗓子疼怎么办 抽烟多了老咳嗽怎么办 抽烟抽多了咳嗽怎么办 嗓子咳出异物臭怎么办 鼻子有鼻涕喉咙有痰怎么办 怀孕39周感冒了怎么办 一口痰卡在喉咙怎么办 鼻塞黄鼻涕黄痰怎么办 小孩咳嗽流黄鼻涕怎么办 小孩鼻塞怎么办最简单方法 有黄鼻涕黄痰怎么办 咳嗽有泡沫白痰怎么办 痰多咳嗽老不好怎么办 5岁儿童咳嗽有痰怎么办 感冒后一直有痰怎么办 感冒吐绿色的痰怎么办