打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Struts2为什么可以用EL表达式取值?

在一个应用了Struts2系列框架的项目中,在JSP页面常常用Struts附带的标签对表单元素取值,但,为什么EL表达式也能取到值栈(valuestack)中的值呢?
我们知道,JSTL默认是从page,request,session,application这四个Scope逐次查找相应的EL表达式所对应的对象的值。那么如果要使用JSTL来读取Action中的变量,就需要把Action中的变量放到request域中才行。所以,早在Webwork2.1.X的年代,我们会编写一个拦截器来做这个事情的。大致的原理是:在Action执行完返回之前,依次读取Action中的所有的变量,并依次调用request.setAttribute()来进行设置。
自从Webwork2.2以后,包括Struts2,都使用另外一种整合方式:对HttpServletRequest进行装饰。源码如下:

 public class StrutsRequestWrapper extendsHttpServletRequestWrapper {
   
    publicStrutsRequestWrapper(HttpServletRequest req) {
       super(req);
    }
   
    publicObject getAttribute(String s) {
       if (s != null && s.startsWith("javax.servlet")) {
           // don't bother with the standard javax.servlet attributes, we canshort-circuit this
           // see WW-953 and the forums post linked in that issue for moreinfo
           return super.getAttribute(s);
       }
       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();
               }
               // note: we don't let # come through or else a request for
               // #attr.foo or #request.foo could cause an endless loop
               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;
    }
}
可以发现,在该类重写的的getAttribute()方法中,首先调用了父类的(即HttpServletRequestRequestWrapper)的getAttribute()方法。之后如果属性值没有得到的话,就再去根属性存储区——值栈ValueStack中获取。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Struts2中OGNL,valueStack,stackContext的学习
ognl全面总结
Struts2 中的值栈是什么?
OGNL表达式struts2标签
jQuery 中 attr() 和 prop() 方法的区别
值栈和OGNL使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服