<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    分享java帶來的快樂

    我喜歡java新東西

    提交多行數據到Struts的ActionForm的List屬性中

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

    下面舉一個如今非常現實的關于股票的例子, 簡單的應用場景是: 記錄某個帳戶所持有的股票信息,提交到后臺,然后顯示出來. 輸入頁面如下圖

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


    輸入頁面 input.jsp


    后臺處理類圖

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

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

    一: struts-config.xml 配置


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

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

    三: AccountStockForm 的關鍵代碼

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

    四: 自定義的 AutoArrayList

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

    五: 在 AccountStockAction 中可以打印出提交的數據

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

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

    可以查看生成的HTML源文件, 你就能更好理解 input.jsp 中的表單域為什么要那么命名了.


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

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

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

    posted on 2009-01-02 21:58 強強 閱讀(2264) 評論(3)  編輯  收藏 所屬分類: Javaweb技巧

    評論

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

    謝啦!  回復  更多評論   

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

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

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

    阿士大夫  回復  更多評論   

    主站蜘蛛池模板: 中文字幕在线观看亚洲| 日本视频在线观看永久免费| 91精品国产亚洲爽啪在线观看| 亚洲黄片手机免费观看| 日韩视频在线免费| 欧洲精品成人免费视频在线观看 | 在线观看的免费网站| 日本卡1卡2卡三卡免费| 国产福利免费视频 | 日本免费一区二区三区最新vr| 免费大片黄在线观看yw| 久久免费的精品国产V∧| 精品一卡2卡三卡4卡免费视频| 色哟哟国产精品免费观看| 成a人片亚洲日本久久| 亚洲 日韩经典 中文字幕| 青青草原精品国产亚洲av| 精品亚洲永久免费精品| 国产亚洲精品影视在线产品| 亚洲色欲久久久久综合网| 深夜国产福利99亚洲视频| 日韩黄色免费观看| 在线观看91精品国产不卡免费| 成年人免费网站在线观看| 成年18网站免费视频网站| 性感美女视频在线观看免费精品 | 亚洲精品无码av片| 久久亚洲精品无码网站| 欧美日韩亚洲精品| 国产精品亚洲一区二区三区 | 四虎影视www四虎免费| 女人18毛片特级一级免费视频| 成年轻人网站色免费看| 免费无码又爽又高潮视频| 国产真人无遮挡作爱免费视频| 国产无遮挡色视频免费视频| 免费国产不卡午夜福在线| 亚洲精品岛国片在线观看| 国产亚洲精品影视在线产品 | 久久免费的精品国产V∧| 国产免费久久精品99re丫y|