javaGrowing

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
          ?在 Strust 中,我們可能經常要在 ActionForm 中使用其他 JavaBean 作為屬性類型,這里就存在著如何使用好這些屬性與 HTML Form 之間的數據交換,下面我們就這些問題做一講解。

          如在用戶注冊界面中,我們通常會將用戶的聯系方式形成一個單獨的新的 Class ,如 Contact ,包含以下屬性:電話 (tel) ,手機(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,這樣條理也比較清晰,以下是這個ActionForm 的部分代碼:

          public class RegisterForm extends ActionForm

          {

          private Integer id;

          private String logonName;

          private String realName;

          private Contact contact=new Contact();

          ………..

          }

          在這里我們需要將 Contact 實例化(在 reset 函數中需要重新實例化),這主要因為 Struts 的機制:如我們將 HTML 的Form 元素(如 email )值傳給 ActionForm , Struts 需要執行的操作是getContact().setEmail(String email) ,如果這時返回的 contact 對象為空的話,那么賦值如何進行,而且Struts 也不會知道如何去實例化 Contact ,有時這些 JavaBean 的類型有可能是接口,實例化更是未知,所以關于JavaBean 類型在 ActionForm 中的實例化,你需要自行完成,而且必須完成。至于在實際操作中判斷 JavaBean是否被進行過相關操作(不再是初始狀態),你需要自行判斷,其實也很簡單,如可在 Contact 類中編寫一個函數檢驗一下即可。

          ActionForm 創建完畢后,我們需要在 Jsp Form 中引用這些 JavaBean 類型的屬性值,那就很簡單啦,只需采用“ Form 的屬性名稱”+“ . ”+“ JavaBean 中的屬性名稱”結構構成的名稱付給相關元素即可。如:

          <html:text property="contact.email">

          通過這種方式我們就可以處理好 ActionForm 中的 JavaBean 類型的屬性值了。

          實際的情況可能更復雜些,我們有時可能要提交多行數據到后退,而且行內的數據是相關的,如我們需要提交多個用戶的聯系方式,這些行內的數據,如email ,電話,手機,這些數據都是和用戶編碼相關的,現在我們修改一下 Contact 類,添加一個用戶編碼 (userId)屬性,這時我們構建的 ActionForm 中可能需要一個列表數據( List )類型來處理這種情況。以下是這個 ActionForm的部分代碼:

          public class ModifyBatchContactForm extends ActionForm

          {

          private List contact =new AutoArrayList (Contact.class);

          …..

          }

          在以上代碼中,我們同樣處理了 List 類型數據的初始化。 Struts 在給 List 中的對象賦值時,當然需要先獲取 List數據,然后在獲取 List 中某一個對象(通過 Index),最后給對象賦值。在這里想我們可以更詳細點分析瀏覽器端傳過來數據,字段值形式如下:contact[0].email= linux_china@hotmail.com , Struts 獲取 ActionForm 中的 List數據后,通過 Index (此時為 0 )來獲取 List 中封裝的 JavaBean 對象,然而此時 List是空的(盡管初始化了,但是沒有數據),是無法取得封裝的對象的,因此我們要在 Struts 獲取 List中封裝的對象的時候給它創建一個,這樣就保證對象的獲取和賦值的成功進行,所有我們新建一個 AutoArrayList 類,繼承ArrayList ,只要重寫 get(int index) 方法即可,其實很簡單,代碼如下:

          public class AutoArrayList extends ArrayList {

          private Class itemClass;

          public AutoArrayList(Class itemClass) {

          this.itemClass = itemClass;

          }

          public Object get(int index) {

          try {

          while (index &gt;= size()) {

          add( itemClass.newInstance());

          }

          } catch (Exception e) {

          e.printStackTrace();

          }

          return super.get(index);

          }

          }

          這樣我們就完成可以多行數據提交的 ActionForm設計,這里還有點提醒,如果從瀏覽器端傳過來的行索引是跳躍是的,如缺少中間行,而你不想要這些數據的話,且首尾行 index相差很大的話,這種方式可能不太適合。這種多行提交形式比較適合對固定行的數據處理。如果行數不固定的話,你可以參考使用 MapForm 方式實現。

          下面我們就看看如何在 Jsp 中使用這個 ActionForm ,其實只需要執行一個循環即可:

          <logic:iterate id=" contact " name=" FormName " property=" contact " indexid="index">

          <html:text name=" contact " property="userId" indexed="true">

          <html:text name=" contact " property="email" indexed="true">

          </html:text>

          這里我們再講解一下,代碼中出現的“ contact ”(紅色)都是 ActionForm 中的 List數據類型變量名稱,請確保一致,請不要更改名稱,這也是方便提交到后臺的數據接收。“ FormName ”為在 struts-config中聲明的 ActionForm 名稱。 indexed="true" 可以確保生成的 html 元素的名稱唯一,不要缺少這個聲明。以上的Jsp 代碼,你也可以使用 JSTL 來完成,就看你習慣如何了。

          通過以上步驟,我們完成了多行數據的提交所有環節,這樣 Struts 就會完成其他所有的事情,我們的代碼邏輯和實現也簡單多了。

          總結:通過以上兩個例子,相以信對 ActionForm 中使用 JavaBean 和 List 類型數據不會再陌生,同時使用 Map類型,這樣可創建更好的 ActionForm 設計,關于 MapForm ,請參考http://www.jetmaven.net/documents/j_mapformInStruts.php 。不過引入這種方式后,在Validator 方面你可能要花點腦筋啦(如通過 XDoclet 生成 Validator文件可能功能不全),可能你需要手寫一些代碼來完成相關工作</html:text></logic:iterate></html:text>
          posted on 2006-12-14 09:28 javaGrowing 閱讀(620) 評論(0)  編輯  收藏 所屬分類: struts學習

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 页游| 观塘区| 兴化市| 西林县| 安阳市| 托克逊县| 通城县| 榆林市| 元江| 延长县| 钦州市| 兴业县| 宁国市| 青龙| 孝昌县| 海城市| 衡东县| 大连市| 汕尾市| 新巴尔虎左旗| 和林格尔县| 江安县| 玉环县| 祁阳县| 赤水市| 双江| 四子王旗| 莱州市| 龙口市| 东兴市| 永顺县| 米易县| 宁明县| 西充县| 夏邑县| 咸丰县| 孙吴县| 香河县| 轮台县| 大悟县| 额济纳旗|