分享java帶來的快樂

          我喜歡java新東西

          提交多行數(shù)據(jù)到Struts的ActionForm的List屬性中

          WEB 應(yīng)用中一般都會處理主從表的信息, 或者稱之為頭層與行層的一對多的關(guān)系數(shù)據(jù),如訂單頭/訂單明細(xì). 對于這種關(guān)系數(shù)據(jù)提交到后臺的 Struts 的 ActionForm 的話, 這個 ActionForm 就要好好的設(shè)計(jì)一下, 不然會給自已帶來許多額外的代碼. 比如有的人的處理方法就是把頁面提交到后臺的毫無關(guān)系的散裝數(shù)據(jù)非常吃力的拼湊一對多的關(guān)系對象出來.

          下面舉一個如今非?,F(xiàn)實(shí)的關(guān)于股票的例子, 簡單的應(yīng)用場景是: 記錄某個帳戶所持有的股票信息,提交到后臺,然后顯示出來. 輸入頁面如下圖

          帳戶信息包括帳戶名和資金帳號;持有股票的每一行信息包括股票代碼, 股票名稱, 成本價, 股票數(shù)量. 股票行可以動態(tài)增刪.


          輸入頁面 input.jsp


          后臺處理類圖

          為了簡化不必要的代碼, 我們要實(shí)現(xiàn)的終及目標(biāo)是: 在輸入頁面上點(diǎn)擊 "保存數(shù)據(jù)" 按鈕, 由 Struts 的 RequestProcessor.processPopulate() 方法把頁面提交的基本信息組裝到 AccountStockForm 的 account 的對應(yīng)屬性中,股票行信息對應(yīng)生成一個 Stock 實(shí)例加到 AccountStockForm的 List 屬性 stocks 中, 后續(xù)在 AccountStockAction 中直接處理account和stocks屬性就非常簡單了. AccountStockForm在這里只作為一個殼.

          下面從前臺到后臺說明關(guān)鍵性的代碼, 完整的 MyEclipse 工程包可以點(diǎn)擊 TestStruts135.zip下載到.

          一: struts-config.xml 配置


          二: 輸入頁面 input.jsp, 注意表單域命名

          例如輸入框名 account.name 提交后能設(shè)置到 accountStockForm 的account的name屬性
          輸入框名為 stocks[0].code 提交后會設(shè)置到 accountStockForm 的 List stocks的第一個元素的code屬性.以此類推
          在提交表單前要重排行層的索引,從 0 起, 否則到后右的 Form 會一些空數(shù)據(jù).

          三: AccountStockForm 的關(guān)鍵代碼

          定義了兩個屬性,分別是一個bean(Account,接受基本信息)和一個List(stocks,接受股票行信息),注意這兩個屬性必須初始化,不然在表單提交后會出現(xiàn)空指針錯誤. setStocks方法是讓stocks屬性永遠(yuǎn)保有持是一個 AutoArrayList 實(shí)例. 這樣在表單提交后設(shè)置值是總能調(diào)用 AutoArrayList 的 get(int index) 方法.

          四: 自定義的 AutoArrayList

          理解為什么要繼承一個ArrayList, 覆寫get(int index)方法要簡單了解 Struts 處理提交數(shù)據(jù)的工作原理: 大致如下: 頁面提交后, 由 ActionServlet交給RequestProcessor的processPopulate()方法,由processPopulate()方法收集請求數(shù)據(jù),放在map中,key為表單域的name屬性,如 name, account.name, stocks[0].code. 然后借助于 Common-beanutils 工具包設(shè)置到 ActionForm 的相應(yīng)屬性中
          如果key是簡單的'name',直接form.setName(map.get('name'));
          如果key是'account.name', 執(zhí)行的操作是 form.getAccount().setName(map.get('account.name');
          如果key是'stocks[0].code', 它可以對應(yīng)到數(shù)據(jù)或集合中,如對于數(shù)組 form.stocks[0].code=map.get('stocks[0].code'); 對于集合(List) form.get(0).setCode(map.get('stocks[0].code'))
          從上也能理解為什么 form 中的那兩個屬性必須實(shí)始化,不然會出現(xiàn)空指針錯. 而且為什么 stocks 要用 AutoArrayList 實(shí)例化, 避免出現(xiàn)索引越界的錯誤.

          五: 在 AccountStockAction 中可以打印出提交的數(shù)據(jù)

          在Action中就能直接取用提交來的數(shù)據(jù)了,不需要 getParameterValues()了.

          六: 最后一步, 對于這樣的 ActionForm 我們應(yīng)該如何顯示出來呢,我們用了 nested 標(biāo)簽 (show.jsp)

          可以查看生成的HTML源文件, 你就能更好理解 input.jsp 中的表單域?yàn)槭裁匆敲疵?


          小結(jié)的內(nèi)容是請注意以下幾個重點(diǎn):
          1. 輸入信息的頁面 input.jsp 沒有使用 Struts 標(biāo)簽,目的是讓大家理解,表單域應(yīng)如何命名才能對應(yīng)上 ActionForm 中的哪一個屬性
          2. 顯示數(shù)據(jù)的頁面是用的 Struts 標(biāo)簽,并留意 nested 標(biāo)簽的應(yīng)用. 可以從生成的 HTML 源文件中體會出什么
          3. 提交數(shù)據(jù)前要重新編排行層中輸入框 Name 屬性的下標(biāo)植.
          4. 回味為什么要引入 ArrayList 的子類 AutoArrayList, 關(guān)鍵在 get(int index) 方法的覆寫
          5. 最后是 ActionForm 中 List 屬性 stocks 的 setter 方法的實(shí)現(xiàn), 保持那個 List 的運(yùn)行時具體類型不變

          參考:
              1. 移:使用Struts提交多行數(shù)據(jù) - kent的專欄 - CSDNBlog

          完整 MyEclipse 工程文件下載 TestStruts135.zip , 不包含 Struts1.35 的jar.
          標(biāo)簽: Struts,List,Form,多行

          posted on 2009-01-02 21:58 強(qiáng)強(qiáng) 閱讀(2268) 評論(3)  編輯  收藏 所屬分類: Java 、web技巧

          評論

          # re: 提交多行數(shù)據(jù)到Struts的ActionForm的List屬性中 2009-09-07 10:14 zhangqiulong

          謝啦!  回復(fù)  更多評論   

          # re: 提交多行數(shù)據(jù)到Struts的ActionForm的List屬性中 2009-11-02 16:46 w

          非常感謝!收藏并使用了  回復(fù)  更多評論   

          # re: 提交多行數(shù)據(jù)到Struts的ActionForm的List屬性中 2012-05-15 15:49 吳軍

          阿士大夫  回復(fù)  更多評論   

          主站蜘蛛池模板: 阿坝县| 循化| 谢通门县| 子洲县| 武清区| 曲麻莱县| 屏山县| 凤台县| 南溪县| 应城市| 酒泉市| 夏河县| 肥西县| 黔西县| 柏乡县| 黄大仙区| 江油市| 焦作市| 古交市| 湟源县| 莲花县| 桃江县| 墨竹工卡县| 仁寿县| 杭锦后旗| 行唐县| 威海市| 长泰县| 林周县| 马尔康县| 昭平县| 尉犁县| 会东县| 五原县| 钟祥市| 昌乐县| 炎陵县| 山阴县| 拉孜县| 岚皋县| 禹州市|