Ordinary hut

          人間一福地,勝似天仙宮
          posts - 61, comments - 50, trackbacks - 0, articles - 1
          ActionContext是被存放在當(dāng)前線程中的,獲取ActionContext也是從ThreadLocal中獲取的。所以在執(zhí)行攔截器、 action和result的過(guò)程中,由于他們都是在一個(gè)線程中按照順序執(zhí)行的,所以可以可以在任意時(shí)候在ThreadLocal中獲取 ActionContext。
          ActionContext包括了很多信息,比如Session、Application、Request、Locale、ValueStack等,其中 ValueStack可以解析ognl表達(dá)式,來(lái)動(dòng)態(tài)后去一些值,同時(shí)可以給表達(dá)式提供對(duì)象。值棧是建立在ognl的基礎(chǔ)之上的。

          HttpServletRequest等對(duì)象是如何與struts2的ActionContext互通的
          是struts2重新實(shí)現(xiàn)了HttpServletRequest接口,就是類StrutsRequestWrapper,看下struts2的說(shuō)明:
          All Struts requests are wrapped with this class, which provides simple JSTL accessibility. This is because JSTL works with request attributes, so this class delegates to the value stack except for a few cases where required to prevent infinite loops. Namely, we don't let any attribute name with "#" in it delegate out to the value stack, as it could potentially cause an infinite loop. For example, an infinite loop would take place if you called: request.getAttribute("#attr.foo").
          說(shuō)明struts重新包裝了request接口,所以如果用request.getAttribute()的話,是執(zhí)行了StrutsRequestWrapper類,在這個(gè)類里面有訪問(wèn)ActionContext的代碼:
          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);
                  

          在這里實(shí)現(xiàn)了getAttribute方法,然而沒(méi)有實(shí)現(xiàn)全部,所以只有用getAttribute方法才能獲取ActionContext中的信息
          但是它繼承了sun的HttpServletRequestWrapper類,所以其他的方法還是用的默認(rèn)實(shí)現(xiàn),也就是不能訪問(wèn)到ActionContext中的信息
          jstl標(biāo)簽會(huì)觸發(fā)request等的getAttribute方法,所以jstl也能獲取到ActionContext的數(shù)據(jù),比如Struts2的Action中的屬性等等。
          主站蜘蛛池模板: 阳东县| 永平县| 九江市| 洱源县| 海丰县| 阜康市| 孝义市| 扎囊县| 广丰县| 革吉县| 泗洪县| 红安县| 九龙坡区| 峨山| 太保市| 深州市| 宜宾市| 独山县| 旬邑县| 酉阳| 莫力| 子洲县| 兰考县| 东明县| 溧水县| 嘉善县| 东辽县| 出国| 类乌齐县| 茂名市| 湖州市| 苍溪县| 东辽县| 毕节市| 兴和县| 沂水县| 岑巩县| 息烽县| 藁城市| 新郑市| 鹤山市|