我是靠谱客的博主 单身薯片,最近开发中收集的这篇文章主要介绍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;
     }

最后

以上就是单身薯片为你收集整理的EL表达式为什么可以在值栈中取值的全部内容,希望文章能够帮你解决EL表达式为什么可以在值栈中取值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部