EL表达式为什么可以在值栈中取值

我在后台将一个对象的list集合放到了值栈的Map栈中
Java code
?
1
2
3
4
public  String getLastVersionPD(){
ActionContext.getContext().put( "pdList" this .pdManager.getLastVersonPD());
return  "listAction" ;
}

然后在前台用OGNL表达式迭代
XML/HTML code
?
1
2
3
4
5
6
< s:iterator  value = "#pdList" >
   < s:property  value = "name" />
   < s:property  value = "version" />
   < s:a  action = "pdManagerAction_delete?key=%{key}" >删除</ s:a >
   < a  href = "javascript: showProcessImage('${requestScope.deploymentId}')" >查看流程图</ a >
</ s:iterator >

name version key deploymentId都是一个对象的属性,迭代时是放在值栈的对象栈的顶部的,前边的name version key使用OGNL表达式能在值栈的对象栈取到值,为什么使用EL表达式也可以在request作用域取得deploymentId属性呢



楼主这个问题,为什么用el取request范围的东西会同样取到值栈的内容呢.这个问题就要结合struts2的源码来说了,我们知道request在javaee里面是HttpServletRequest它是一个接口里面的一切包装都是通过javax.servlet.http.HttpServletRequestWrapper类来实现的.struts2有自己的javax.servlet.http.HttpServletRequestWrapper实现,也就是在struts2-core包下的org.apache.struts2.dispatcher.StrutsRequestWrapper重新对getAttribute方法进行了重写.
我们知道el表达式取request范围的值就是调用request.getAttribute(String s);
一下这段是struts2的org.apache.struts2.dispatcher.StrutsRequestWrapper对getAttribute方法重写的源码部分

Java code
?
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
public  Object getAttribute(String s) {
         if  (s !=  null  && s.startsWith( "javax.servlet" )) {
             //如果是${requestScope.javax.servlet.属性名的}就直接去request里面取值
             return  super .getAttribute(s);
         }
//关键在下面,先从request里面取值取不到时就从值栈里面取值,所以就可以解释楼主这个为啥也能取到值了
         ActionContext ctx = ActionContext.getContext();
         Object attribute =  super .getAttribute(s);
         if  (ctx !=  null ) {
             if  (attribute ==  null ) {
                 boolean  alreadyIn =  false ;
                 Boolean b = (Boolean) ctx.get( "__requestWrapper.getAttribute" );
                 if  (b !=  null ) {
                     alreadyIn = b.booleanValue();
                 }
                 if  (!alreadyIn && s.indexOf( "#" ) == - 1 ) {
                     try  {
                         // If not found, then try the ValueStack
                         ctx.put( "__requestWrapper.getAttribute" , Boolean.TRUE);
                         ValueStack stack = ctx.getValueStack();
                         if  (stack !=  null ) {
                             attribute = stack.findValue(s);
                         }
                     finally  {
                         ctx.put( "__requestWrapper.getAttribute" , Boolean.FALSE);
                     }
                 }
             }
         }
         return  attribute;
     }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值