浅谈Struts2中的值栈

Struts2中值栈的理解
这里写图片描述

一、拦截器的初始化
如图所示呢,在一次请求过程中,拦截器首先会创建以及初始化一个值栈对象以供使用。初始化过程中,在Map对象里面放了request=,session=,application=,attr=,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)

  • ActionContext.getContext().get(k)

    或者

  • ActionContext.getContext().getValueStack().put(k, v)

  • ActionContext.getContext().getValueStack().get(k)

操作Stack:

  • ActionContext.getContext.getValueStack().push(obj)

  • ActionContext.getContext.getValueStack().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,找到返回
例子:

<span style="font-size:18px;background-color: rgb(255, 255, 255);"><s:iterator value="#roleList">  
    <s:property value="id"/>,  
    <s:property value="name"/>,  
    <s:property value="description"/>,  
    <s:a action="role_delete?id=%{id}" onclick="return confirm('确定要删除吗?')">删除</s:a>  
    <s:a action="role_editUI?id=%{id}">修改</s:a>  
    <br/>  
</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。
所以上述例子也可以写为:

<s:iterator value="#roleList">  
    ${id},  
    ${name},  
    <s:a action="role_delete?id=%{id}" onclick="return confirm('确定要删除吗?')">删除</s:a>  
    <s:a action="role_editUI?id=%{id}">修改</s:a>  
    <br/>  
</s:iterator>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值