el为什么可以取到值栈里的数据

来源:互联网 发布:知名数据咨询公司 编辑:程序博客网 时间:2024/06/06 13:53
下面这个类会在 Struts2 初始化的时候,替换 HttpServletRequest,运行于整个 Struts2 的运行过程中,当我们试 图调用 request.getAttribute() 的时候,就会执行上面的这个方法。(这是一个典型的装饰器模式)在执行上面的方法时,会首先调用 HttpServletRequest 中原本的 request.getAttribute(),如果没有找到,它会继续到 ValueStack 中去查找, 而 action 在 ValueStack 中,所以 action 中的变量通过 OGNL 表达式,就能找到对应的值了
 public class StrutsRequestWrapper extends HttpServletRequestWrapper {      /**      * The constructor      * @param req The request      */     public StrutsRequestWrapper(HttpServletRequest req) {         super(req);     }      /**      * Gets the object, looking in the value stack if not found      *      * @param s The attribute key      */     public Object getAttribute(String s) {         if (s != null && s.startsWith("javax.servlet")) {             // don't bother with the standard javax.servlet attributes, we can short-circuit this             // see WW-953 and the forums post linked in that issue for more info             return super.getAttribute(s);         }          ActionContext ctx = ActionContext.getContext();         Object attribute = super.getAttribute(s);          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 && attribute == null && 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;    }}
在 Webwork2.1.X 的年代,我们会编写一个拦截器来做这个事情的。大致的原理是:在 Action 执行完返回之前,依次读取 Action 中的所有的变 量,并依次调用 request.setAttribute() 来进行设置。具体的整合方式,请参考以下这篇文档:http://wiki.opensymphony.com/display/WW/Using+WebWork+and+XWork+with+JSP+2.0+and+JSTL+1.1
转自 Silence_Mind:http://blog.csdn.net/marvel__dead/article/details/59719103
阅读全文
0 0
原创粉丝点击