為actin mpping之attribute屬性正身! (轉)

gugu99發表於2007-08-15
為actin mpping之attribute屬性正身! (轉)[@more@]在很多時候,action map中的attribute 和 name 這兩個屬性一直困擾我,今天我覺得是該痛下決心拔掉這顆釘子的時候了。

翻看一些資料。。。。。

在《Programming Jakarta 》這本書中的第四章“Configuring the Struts Application”中這樣一段說明來分別闡述這兩
個屬性:(102頁)
++++++++
atribute:
++++++++
The name of the request or session pe attribute under which the fobean for this action can be accessed.
A value is only allowed here if there is a form bean specified in the name attribute. This attribute is
optional and has no default value.

++++++++
name:
++++++++
The name of the form bean, if any, that is associated with this action. This value must be the name attribute
from one of the form-bean elements defined earlier. This attribute is optional and has no default value.

最初看這些真的還是不好區分這兩者。 不過在仔細看過struts的以後,豁然開朗。。。

下面主要對attribute進行解釋,應為沒有人會對name屬性不瞭解的(呵呵。。。)


解釋:在struts例項化actionform的時候,有兩種情況:如果已經存在,那麼從中取回;如果第一次例項化,那麼建立,並放入記憶體。
這樣就有一個問題了,struts是根據什麼來取回並建立actionform的呢,答案就是attribute的值。讓我們進入struts的原始碼:

/**
*建立或者取回formbean方法
*該方法在:org..struts.util.RequestUtils中
*/
   public static Actionform createActionform(
       HttpRequest request,
       ActionMapping mapping,
       ModuleConfig moduleConfig,
       ActionServlet servlet) {
       。。。。
       。。。
       // Is there a form bean associated with this mapping?
       //得到action mapping中attribute的值
       String attribute = mapping.getAttribute();
       。。。。
       。。。。
       Actionform instance = null;
       HttpSession session = null;
       //yes!!就在這裡了,把建立以後的actionform放在request或者session裡,看到放入的名字了麼,就是mapping.getAttribute();
       if ("request".equals(mapping.getScope())) {
           instance = (Actionform) request.getAttribute(attribute);
       } else {
           session = request.getSession();
           instance = (Actionform) session.getAttribute(attribute);
       }
       。。。
       。。。
       
       
       }
       
       
下面又有一個問題浮出水面:如果我沒有在action mapping中指定attribute呢,那struts 是如何解決的?
答案很簡單,如果單從結果上看,此時struts使用的name的值,為什麼呢,看struts原始碼:

   /**
    * The request-scope or session-scope attribute name under which our
    * form bean is accessed, if it is different from the form bean's
    * specified name.
    *該程式碼在:org.apache.struts.config.ActionConfig中
    */
   protected String attribute = null;

   public String getAttribute() {
   //yes!!!!就在這裡,看到了吧,如果你沒有設定attribute,那麼struts 會把name的值拿過來用。呵呵。。。
       if (this.attribute == null) {
           return (this.name);
       } else {
           return (this.attribute);
       }
   }

   public void setAttribute(String attribute) {
       if (configured) {
           throw new IllegalStateException("Configuration is frozen");
       }
       this.attribute = attribute;
   }
   
要是有人問如果我在action mapping中沒有name呢?。。。。暈倒~~~~```

大家學習愉快!

這個貼子最初是發貼在CJW(world">)的struts專區


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959591/,如需轉載,請註明出處,否則將追究法律責任。

相關文章