JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          18.12  物資處理模塊

          18.12.1  物資處理模塊總體架構

          物資處理模塊主要包括以下功能。

            ●   庫存盤點:用于分頁打印庫存盤點表;

            ●   部門報損:用于對部門報損信息進行登記。

          18.12.2  創建物資處理模塊的持久化類及映射文件

          1.創建持久化類和映射文件

          物資處理模塊涉及到的數據表的持久化類和映射文件如表18.20所示。持久化類及映射文件的具體實現方法請參見18.8.2節。

          表18.20                        物資處理模塊涉及到的數據表的持久化類和映射文件

          數據表名稱

          持久化類名稱

          映射文件名稱

          tb_damage

          DamageForm

          DamageForm.hbm.xml

          tb_branch

          BranchForm

          BranchForm.hbm.xml

          tb_goods

          GoodsForm

          GoodsForm.hbm.xml

          tb_storage

          StorageForm

          StorageForm.hbm.xml

          2.映射關聯關系

          在物資出庫模塊中,涉及到兩對關聯關系,如表18.21所示。

          表18.21                                                 物資出庫模塊的表間關系

          主  鍵  表

          外  鍵  表

          名    稱

          字  段  名

          名    稱

          字  段  名

          tb_goods

          id

          tb_damage

          goodsid

          tb_branch

          id

          tb_damage

          branchid

          說明:在Hibernate中映射關聯關系的具體方法請參見18.10.2節。

          3.修改Hibernate配置文件

          在創建持久化類、映射文件和關聯關系后,還需要在Hibernate配置文件hibernate.cfg.xml中指定持久化類映射文件,關鍵代碼如下:

          <mapping resource="com/actionForm/DamageForm.hbm.xml"/>

          說明:由于物資信息表、部門信息表和物資借出信息表的持久化類及映射文件在前面的章節中已經配置了,所以此時不需要再進行配置。

          18.12.3  創建物資處理模塊的Action實現類

          物資處理模塊的Action實現類繼承了Action類,在該類中首先需要在構造方法中實例化物資管理模塊的OutStorageDAO類(該類用于實現業務邏輯操作),然后通過Action實現類的主要方法execute()執行相應的業務邏輯操作。Action實現類的execute()方法會被自動執行,這個方法本身沒有具體的事務,它是根據HttpServletRequest的getParameter()方法獲取的action參數值執行相應方法的。

          物資處理模塊的Action實現類的關鍵代碼如下。

          例程18-108:光盤\mr\18\MaterialManage\src\com\action\Damage.java

          public class Damage extends Action {

              ……     //此處省略了在構造方法中實例化OutStorageDAO類的方法

              public ActionForward execute(ActionMapping mapping, ActionForm form,

                                           HttpServletRequest request,HttpServletResponse response) {

                  String action = request.getParameter("action");

                  if (action.equals("") || action == null) {

                      request.setAttribute("error", "您的操作有誤!");

                      return mapping.findForward("error");

                  } else if (action.equals("damageaddquery")) {     //查詢部門領用物資信息

                      return damageadd_request(mapping, form, request, response);

                  } else if (action.equals("damageadd")) {     //添加部門報損信息

                      return damageadd(mapping, form, request, response);

                  }else{

                      request.setAttribute("error", "您的操作有誤!");

                      return mapping.findForward("error");

                  }

              }

              ……  //此處省略了該類中其他方法,這些方法將在后面的具體過程中給出

          }

          18.12.4  庫存盤點設計

          使用的數據表:tb_goods、tb_storage     主要技術:通過Hibernate 的本地SQL查詢查詢多表數據

          用戶登錄后,選擇“物資處理”→“庫存盤點”菜單項,進入到庫存盤點頁面,在該頁面中將顯示庫存信息列表及庫存總金額,單擊“打印盤點報表”超級鏈接可以分頁打印庫存盤點表。庫存盤點頁面運行結果如圖18.25所示,打印預覽效果如圖18.26所示。

          圖18.25  庫存盤點頁面運行結果

          圖18.26  庫存盤點頁面打印預覽效果

          在庫存盤點頁面中調用OutStorageDAO類中的storage_query()方法查詢庫存中的物資信息,關鍵代碼如下。

          例程18-109:光盤\mr\18\MaterialManage\defaultroot\storageCheck.jsp

          <%

              List listgoods = null;

              OutStorageDAO outStorageDAO = new OutStorageDAO();

              listgoods = outStorageDAO.storage_query();     //查詢庫存中的物資信息

              java.util.Date date=new java.util.Date();

          %>

          說明:OutStorageDAO類中storage_query()方法的詳細代碼請參見例程18-96。

          在庫存盤點頁面中添加用于顯示庫存盤點報表內容的表格,并設置好表頭、表尾及打印分頁。需要注意的是:由于盤點數量需要手工填寫,所以在打印時需要留出相應的位置,關鍵代碼如下。

          例程18-110:光盤\mr\18\MaterialManage\defaultroot\storageCheck.jsp

          <table width="90%" border="1" cellpadding="0" cellspacing="0" bgcolor="#000000" id="pay"

          bordercolor="#00000" bordercolordark="#000000" bordercolorlight="#FFFFFF" >

          <thead style="display:table-header-group;">

          <tr>

            <td width="7%" align="center" bgcolor="#FFFFFF">編號</td>

            ……     //此處省略了部分HTML代碼

            <td width="9%" align="center" bgcolor="#FFFFFF">盤點數量</td>

          </tr>

          </thead>

          <%if (listgoods.size() <= 0) {%>

          <tr> <td colspan="7" align="center" bgcolor="#FFFFFF">&nbsp;暫無庫存信息!</td></tr>

          <%}else {

          String Producer="";     //生產廠家

          String Unit="";     //單位

          float Price=0.0f;     //單價

          float amount=0.0f;     //總金額

          int storagenumber=0;     //庫存數量

          String goodsname="";     //物資名稱

          int goodsId=0;     //物資ID

          String spec="";     //規格

          for(int i=0;i<listgoods.size();i++){

              Object obj[]=(Object[])listgoods.get(i);

              GoodsForm goodsF=(GoodsForm)obj[0];

              StorageForm storageF=(StorageForm)obj[1];

              goodsId=goodsF.getId();

              goodsname=goodsF.getName();

              spec=goodsF.getSpec();

              Producer=goodsF.getProducer();

              Unit=goodsF.getUnit();

              Price=goodsF.getPrice();

              storagenumber=storageF.getNumber();

              amount=amount+Price*storagenumber;

          %>

          <tr<%if((i+1)%18==0){%> style="page-break-after:always;"<%}%>>

            <td align="center" bgcolor="#FFFFFF">&nbsp;<%=i+1%></td>

            ……     //此處省略了部分HTML代碼

            <td bgcolor="#FFFFFF">&nbsp;</td>

          </tr>

          <%}%>

          <tfoot style="display:table-footer-group;"><tr><td class="tableBorder_B1"></td></tr></tfoot>

          </table>

          ……     //此處省略了部分HTML代碼

          <%}%>

          </table>

          控制頁面背景、系統導航信息、版權信息及“打印”超級鏈接,在打印時不顯示,關鍵代碼如下。

          例程18-111:光盤\mr\18\MaterialManage\defaultroot\storageCheck.jsp

          <style>

          @media print{

          div{display:none}

          .bgnoprint{

              background:display:none;

          }

          .noprint{

              display:none

          }

          }

          </style>

          <body onLoad="clockon(bgclock)" class="bgnoprint">

          <table width="757" height="174" border="0" align="center"cellpadding="0" cellspacing="0">

            <tr class="noprint">

              <td height="133" align="center" valign="top"><%@include file="top.jsp"%>

              </td>

            </tr>

          ……     //此處省略了部分HTML代碼

          <div>庫存總金額:<%=amount%>

          &nbsp;&nbsp;&nbsp;&nbsp;<a href="#" onClick="window.print();">打印盤點報表</a></div>

          ……     //此處省略了部分HTML代碼

            <tr class="noprint">

              <td height="55" valign="top" background="images/bottom.jpg"><%@include file="copyright.jsp"%>

              </td>

            </tr>

          18.12.5  部門報損設計

          使用的數據表:tb_damage、tb_branch、tb_goods  主要技術:通過Hibernate API操作數據庫

          用戶登錄后,選擇“物資處理”→“部門報損”菜單項,進入到部門報損頁面。在部門報損頁面中,首先從“物資名稱”下拉列表框中選擇要報損的物資(系統將自動檢索出該物資的生產廠家、單價和計量單位等信息),然后選擇部門名稱并輸入報損數量、負責人名稱及報損原因,單擊【保存】按鈕,保存部門報損信息,運行結果如圖18.27所示。

          1.設計部門報損頁面

          從系統主菜單中選擇“物資處理”→“部門報損”菜單項或是在部門報損頁面中改變“物資名稱”下拉列表框的值時都會觸發一個URL地址,這個URL地址是“damage.do?action=damageaddquery”。從這個URL地址中可以知道部門報損頁面所涉及到的action的參數值為“damageaddquery”,當action=damageaddquery時,會調用查詢已領用物資信息的方法damageadd_request(),具體代碼如下。

          例程18-112:光盤\mr\18\MaterialManage\src\com\action\Damage.java

          if (action.equals("damageaddquery")) {

              return damageadd_request(mapping, form, request, response);

          }

          在查詢已領用物資信息的方法damageadd_request()中,首先需要獲取從頁面中傳遞的參數id的值并保存到HttpServletRequest的對象id中,然后調用OutStorageDAO類中的getuseGoods_query()方法查詢出已領用物資信息,再將返回的查詢結果保存到HttpServletRequest的對象getuse中。查詢已領用物資信息的方法damageadd_request()的具體代碼如下。

          圖18.27  部門報損頁面運行結果

          例程18-113:光盤\mr\18\MaterialManage\src\com\action\Damage.java

          public ActionForward damageadd_request(ActionMapping mapping,ActionForm form,

                                              HttpServletRequest request,HttpServletResponse response) {

              int goodsid = 0;

              if (request.getParameter("id") != null) {

                  goodsid = Integer.parseInt(request.getParameter("id"));

              }

              request.setAttribute("id", goodsid);

              request.setAttribute("getuse", outStorageDAO.getuseGoods_query()); //獲取部門已領用物資信息

              return mapping.findForward("selGetuseGoods");

          }

          從上面的代碼中可以知道查詢已領用物資信息使用的OutStorageDAO類的方法是getuseGoods_query(),在該方法中首先需要利用Hibernate的本地SQL查詢獲取已領用物資的詳細信息,然后將查詢結果保存到List集合list中,并返回list。getuseGoods_query()方法的具體代碼如下。

          例程18-114:光盤\mr\18\MaterialManage\src\com\action\OutStorageDAO.java

          public List getuseGoods_query() {

              session = MySession.openSession();

              List list = null;

              String sql = "select * from tb_goods where id in (select goodsid from tb_getuse group by goodsid)";

              try {

                  SQLQuery query = session.createSQLQuery(sql);

                  query.addEntity("goods", GoodsForm.class); //將數據表與持久化類關聯在一起

                  list = query.list();

              } catch (Exception e) {

                  System.out.println("查詢時的錯誤信息:" + e.getMessage());

              }

              return list;

          }

          在struts-config.xml文件中配置查詢已領用物資信息所涉及的<forward>元素,代碼如下:

          <forward name="selGetuseGoods" path="/damageAdd.jsp" />

          接下來的工作是將getuseGoods_query()方法返回的查詢結果顯示在部門報損頁面damageAdd.jsp中。在damageAdd.jsp中首先通過request.getAttribute()方法獲取查詢結果并將其顯示在相應的位置或表單元素中。

          2.保存部門報損信息

          在部門報損頁面中錄入部門報損信息后,單擊【保存】按鈕,系統會訪問一個URL,這個URL是“damage.do?action=damageadd”。從該URL地址中可以知道保存部門報損信息涉及到的action的參數值為“damageadd”,也就是當action=damageadd時,會調用保存部門報損信息的方法damageadd(),具體代碼如下。

          例程18-115:光盤\mr\18\MaterialManage\src\com\action\Damage.java

          if (action.equals("damageadd")) {

              return damageadd(mapping, form, request, response);

          }

          在保存部門報損信息的方法damageadd()中,首先需要將接收到的表單信息強制轉換成ActionForm類型,然后調用OutStorageDAO類中的damageAdd()方法保存部門報損信息到相應的數據表中,并將返回值保存到變量rtn中。如果返回值為1,表示信息修改成功,將頁面重定向到部門報損頁面,否則將錯誤提示信息“部門報損信息添加失敗!”保存到HttpServletRequest的對象error中,然后將頁面重定向到錯誤提示信息頁面。保存部門報損信息的方法getuseadd()的關鍵代碼如下。

          例程18-116:光盤\mr\18\MaterialManage\src\com\action\Damage.java

          public ActionForward damageadd(ActionMapping mapping,ActionForm form,

                                              HttpServletRequest request,HttpServletResponse response) {

              DamageForm getUseForm = (DamageForm) form;

              int rtn = outStorageDAO.damageAdd(getUseForm);

              ……    //此處省略了根據返回值重定向頁面的代碼

          }

          3.編寫保存部門報損信息的OutStorageDAO類的方法

          從上面的代碼中可以知道保存部門報損信息時使用的OutStorageDAO類的方法是damageAdd(),在該方法中首先需要建立“GoodsForm和DamageForm的關聯關系”以及“BranchForm和DamageForm的關聯關系”,再保存部門報損信息。damageAdd()方法的具體代碼如下。

          例程18-117:光盤\mr\18\MaterialManage\src\com\dao\OutStorageDAO.java

          public int damageAdd(DamageForm damageForm) {

              session = MySession.openSession();     //打開Session

              Transaction tx = null;

              int rtn = 0;

              try {

                  //保存物資借出信息

                  tx = session.beginTransaction();

                  int goodsid = damageForm.getGoodsid();

                  GoodsForm goodsForm = (GoodsForm) session.get(GoodsForm.class,goodsid);

                  damageForm.setGoods(goodsForm);

                  int branchid = damageForm.getBranchid();

                  BranchForm branchForm = (BranchForm) session.get(BranchForm.class,branchid);

                  damageForm.setBranch(branchForm);

                  damageForm.setCreatetime(new Date());

                  session.save(damageForm);

                  tx.commit();

                  rtn = 1;

              } catch (Exception e) {

                  if (tx != null) {

                      tx.rollback();

                  }

                  System.out.println("添加部門報損信息時的錯誤信息:" + e.getMessage());

                  rtn = 0;

              } finally {

                  MySession.closeSession(session); //關閉Session

              }

              return rtn;

          }

          4.struts-config.xml文件配置

          在struts-config.xml文件中配置保存部門報損信息所涉及的<forward>元素,代碼如下:

          <forward name="damageAddok" path="/damageAddok_ok.jsp?para=1" />

          posted on 2009-01-07 10:43 rogerfan 閱讀(250) 評論(0)  編輯  收藏 所屬分類: 【開源技術】
          主站蜘蛛池模板: 平泉县| 姚安县| 双柏县| 成安县| 桦川县| 塔河县| 曲阜市| 内黄县| 洛隆县| 定襄县| 金乡县| 尉氏县| 普格县| 通州市| 江永县| 乌什县| 大兴区| 兴隆县| 宝山区| 福鼎市| 开阳县| 微山县| 朔州市| 井陉县| 丹棱县| 星子县| 神池县| 威远县| 濮阳市| 陇西县| 赤水市| 湖州市| 甘洛县| 故城县| 德钦县| 鄂伦春自治旗| 中阳县| 商丘市| 合阳县| 福建省| 黑水县|