JAVA—咖啡館

          ——?dú)g迎訪問(wèn)rogerfan的博客,常來(lái)《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來(lái)的快樂(lè)!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問(wèn)題請(qǐng)與我聯(lián)系。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          18.11  物資出庫(kù)模塊

          18.11.1  物資出庫(kù)模塊總體架構(gòu)

          物資出庫(kù)模塊主要包括以下功能:

            ●   部門(mén)領(lǐng)用:用于對(duì)部門(mén)領(lǐng)用信息進(jìn)行登記;

            ●   物資借出:用于對(duì)物資借出信息進(jìn)行登記;

            ●   借出審核:用于對(duì)物資借出信息進(jìn)行審核。

          18.11.2  創(chuàng)建物資出庫(kù)模塊的持久化類(lèi)及映射文件

          1.創(chuàng)建持久化類(lèi)和映射文件

          物資出庫(kù)模塊涉及到的數(shù)據(jù)表的持久化類(lèi)和映射文件如表18.18所示。持久化類(lèi)及映射文件的具體實(shí)現(xiàn)方法請(qǐng)參見(jiàn)18.8.2節(jié)。

          表18.18                         物資出庫(kù)模塊涉及到的數(shù)據(jù)表的持久化類(lèi)和映射文件

          數(shù)據(jù)表名稱(chēng)

          持久化類(lèi)名稱(chēng)

          映射文件名稱(chēng)

          tb_getUse

          GetUseForm

          GetUseForm.hbm.xml

          tb_branch

          BranchForm

          BranchForm.hbm.xml

          tb_loan

          LoanForm

          LoanForm.hbm.xml

          tb_goods

          GoodsForm

          GoodsForm.hbm.xml

          tb_storage

          StorageForm

          StorageForm.hbm.xml

          2.映射關(guān)聯(lián)關(guān)系

          在物資出庫(kù)模塊中,涉及到3對(duì)關(guān)聯(lián)關(guān)系,如表18.19所示。

          表18.19                                                 物資出庫(kù)模塊的表間關(guān)系

          主  鍵  表

          外  鍵  表

          名    稱(chēng)

          字  段  名

          名    稱(chēng)

          字  段  名

          tb_goods

          id

          tb_getUse

          goodsid

          tb_branch

          id

          tb_getUse

          branchid

          tb_goods

          id

          tb_loan

          goodsid

          說(shuō)明:在Hibernate中映射關(guān)聯(lián)關(guān)系的具體方法請(qǐng)參見(jiàn)18.10.2節(jié)。

          3.修改Hibernate配置文件

          在創(chuàng)建持久化類(lèi)、映射文件和關(guān)聯(lián)關(guān)系后,還需要在Hibernate配置文件hibernate.cfg.xml中指定持久化類(lèi)映射文件,關(guān)鍵代碼如下:

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

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

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

          說(shuō)明:由于物資信息持久化類(lèi)及映射文件已經(jīng)在18.9.2節(jié)介紹了,所以此時(shí)不需要再配置了。

          18.11.3  創(chuàng)建物資出庫(kù)的Action實(shí)現(xiàn)類(lèi)

          物資出庫(kù)模塊涉及到兩個(gè)Action實(shí)現(xiàn)類(lèi),一個(gè)是用于部門(mén)領(lǐng)用操作的GetUse類(lèi),另一個(gè)是用于物資借出操作的Loan類(lèi),下面將分別介紹。

          1.創(chuàng)建部門(mén)領(lǐng)用操作的Action實(shí)現(xiàn)類(lèi)GetUse

          在部門(mén)領(lǐng)用操作的Action實(shí)現(xiàn)類(lèi)GetUse中首先需要在構(gòu)造方法中實(shí)例化物資出庫(kù)模塊的OutStorageDAO類(lèi)(該類(lèi)用于實(shí)現(xiàn)業(yè)務(wù)邏輯操作),然后通過(guò)Action實(shí)現(xiàn)類(lèi)的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實(shí)現(xiàn)類(lèi)的execute()方法會(huì)被自動(dòng)執(zhí)行,這個(gè)方法本身沒(méi)有具體的事務(wù),它是根據(jù)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。

          實(shí)現(xiàn)部門(mén)領(lǐng)用操作的Action實(shí)現(xiàn)類(lèi)的關(guān)鍵代碼如下。

          例程18-92:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

          public class GetUse extends Action {

              private OutStorageDAO outStorageDAO = null;

              public GetUse() {

                  outStorageDAO = new 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("getuseaddquery")) {     //查詢(xún)庫(kù)存中的物資信息

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

                  } else if (action.equals("getuseadd")) {     //部門(mén)領(lǐng)用

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

                  }

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

                  return mapping.findForward("error");

              }

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

          }

          2.創(chuàng)建用于物資借出操作的Action實(shí)現(xiàn)類(lèi)Loan

          在用于物資借出操作的Action實(shí)現(xiàn)類(lèi)Loan中,首先需要在構(gòu)造方法中實(shí)例化物資出庫(kù)模塊的OutStorageDAO類(lèi)(該類(lèi)用于實(shí)現(xiàn)業(yè)務(wù)邏輯操作),然后通過(guò)Action實(shí)現(xiàn)類(lèi)的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實(shí)現(xiàn)類(lèi)的execute()方法會(huì)被自動(dòng)執(zhí)行,這個(gè)方法本身沒(méi)有具體的事務(wù),它是根據(jù)通過(guò)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。實(shí)現(xiàn)物資借出操作的Action實(shí)現(xiàn)類(lèi)Loan的關(guān)鍵代碼如下。

          例程18-93:光盤(pán)\mr\18\MaterialManage\src\com\action\Loan .java

          public class GetUse extends Action {

              ……     //此處省略了在構(gòu)造方法中實(shí)例化OutStorageDAO類(lèi)的方法

              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("loanaddquery")) {     //查詢(xún)庫(kù)存中的物資信息

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

                  } else if (action.equals("loanadd")) {     //物資借出

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

                  }else if(action.equals("approveloan")){     //借出審核

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

                  }else if(action.equals("backloan")){     //借出歸還

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

                  }else{

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

                      return mapping.findForward("error");

                  }

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

          }

          18.11.4  部門(mén)領(lǐng)用設(shè)計(jì)

          使用的數(shù)據(jù)表:tb_getuse、tb_branch、tb_goods、tb_storage
          主要技術(shù):通過(guò)Hibernate API操作數(shù)據(jù)庫(kù)

          用戶(hù)登錄后,選擇“物資出庫(kù)”→“部門(mén)領(lǐng)用”菜單項(xiàng),進(jìn)入到部門(mén)領(lǐng)用登記頁(yè)面。在部門(mén)領(lǐng)用頁(yè)面中,首先從“物資名稱(chēng)”下拉列表框中選擇要領(lǐng)用的物資(系統(tǒng)將自動(dòng)檢索出該物資的生產(chǎn)廠家、單價(jià)、計(jì)量單位和庫(kù)存數(shù)量等信息),然后在“領(lǐng)用數(shù)量”文本框中輸入領(lǐng)用數(shù)量(系統(tǒng)會(huì)自動(dòng)檢驗(yàn)庫(kù)存數(shù)量,如果庫(kù)存數(shù)量不足,系統(tǒng)將給予提示),最后選擇領(lǐng)用部門(mén)并輸入負(fù)責(zé)人名稱(chēng),單擊【保存】按鈕,保存部門(mén)領(lǐng)用信息,運(yùn)行結(jié)果如圖18.22所示。

          圖18.22  部門(mén)領(lǐng)用頁(yè)面運(yùn)行結(jié)果

          1.設(shè)計(jì)部門(mén)領(lǐng)用頁(yè)面

          從系統(tǒng)主菜單中選擇“物資出庫(kù)”→“部門(mén)領(lǐng)用”菜單項(xiàng)或是在部門(mén)領(lǐng)用頁(yè)面中改變“物資名稱(chēng)”下拉列表框的值時(shí)都會(huì)觸發(fā)一個(gè)URL地址,這個(gè)URL地址是“getUse.do?action=getuseaddquery”,從這個(gè)URL地址中可以知道部門(mén)領(lǐng)用頁(yè)面所涉及到的action的參數(shù)值為“getuseaddquery”,當(dāng)action=getuseaddquery時(shí),會(huì)調(diào)用查詢(xún)庫(kù)存中的物資信息的方法getuseadd_request(),具體代碼如下。

          例程18-94:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

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

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

          }

          在查詢(xún)庫(kù)存物資信息的方法getuseadd_request()中,首先需要獲取從頁(yè)面中傳遞的參數(shù)id的值并保存到HttpServletRequest的對(duì)象id中,然后調(diào)用OutStorageDAO類(lèi)中的storage_query()方法查詢(xún)出庫(kù)存中的物資信息,再將返回的查詢(xún)結(jié)果保存到HttpServletRequest的對(duì)象GoodsStorage中。查詢(xún)庫(kù)存中物資信息的方法getuseadd_request()的具體代碼如下。

          例程18-95:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

          public ActionForward getuseadd_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("GoodsStorage", outStorageDAO.storage_query()); //獲取物資信息

              return mapping.findForward("selStorageGoods");

          }

          從上面的代碼中可以知道查詢(xún)庫(kù)存中物資信息使用的OutStorageDAO類(lèi)的方法是storage_query(),在該方法中首先需要利用Hibernate的本地SQL查詢(xún)從兩個(gè)表中獲取庫(kù)存中物資的詳細(xì)信息,然后將查詢(xún)結(jié)果保存到List集合list中,并返回list。storage_query()方法的具體代碼如下。

          例程18-96:光盤(pán)\mr\18\MaterialManage\src\com\action\OutStorageDAO.java

          public List storage_query() {

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

              String sql = "select {goods.*},{storage.*} from tb_goods goods inner join tb_storage storage on goods.id= storage.goodsid where storage.number>0"; //使用內(nèi)連接查詢(xún)庫(kù)存信息

              List list = null;

              try {

                  SQLQuery query = session.createSQLQuery(sql);

                  query.addEntity("goods", GoodsForm.class); //將數(shù)據(jù)表與持久化類(lèi)關(guān)聯(lián)在一起

                  query.addEntity("storage", StorageForm.class);

                  list = query.list();

              } catch (Exception e) {

                  System.out.println("查詢(xún)時(shí)的錯(cuò)誤信息:" + e.getMessage());

              }

              return list;

          }

          在struts-config.xml文件中配置查詢(xún)庫(kù)存中物資信息所涉及的<forward>元素,代碼如下:

          <forward name="selStorageGoods" path="/getUseAdd.jsp" />

          接下來(lái)的工作是將Action實(shí)現(xiàn)類(lèi)中的storage_query()方法返回的查詢(xún)結(jié)果顯示在部門(mén)領(lǐng)用頁(yè)面getUseAdd.jsp中。在getUseAdd.jsp中通過(guò)request.getAttribute()方法獲取查詢(xún)結(jié)果并將其顯示在相應(yīng)的位置或表單元素中。

          2.保存部門(mén)領(lǐng)用信息

          在部門(mén)領(lǐng)用頁(yè)面中錄入部門(mén)領(lǐng)用信息后,單擊【保存】按鈕,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL,這個(gè)URL是“getUse.do?action=getuseadd”。從該URL地址中可以知道保存部門(mén)領(lǐng)用信息涉及到的action的參數(shù)值為“getuseadd”,也就是當(dāng)action=getuseadd時(shí),會(huì)調(diào)用保存部門(mén)領(lǐng)用信息的方法getuseadd(),具體代碼如下。

          例程18-97:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

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

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

          }

          在保存部門(mén)領(lǐng)用信息的方法getuseadd()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類(lèi)型,然后調(diào)用OutStorageDAO類(lèi)中的getuseAdd()方法保存部門(mén)領(lǐng)用信息到相應(yīng)的數(shù)據(jù)表中,并將返回值保存到變量rtn中。如果返回值為1,表示信息修改成功,將頁(yè)面重定向到部門(mén)領(lǐng)用頁(yè)面,否則將錯(cuò)誤提示信息“部門(mén)領(lǐng)用信息添加失敗!”保存到HttpServletRequest的對(duì)象error中,然后將頁(yè)面重定向到錯(cuò)誤提示信息頁(yè)面。保存部門(mén)領(lǐng)用信息的方法getuseadd()的關(guān)鍵代碼如下。

          例程18-98:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

          public ActionForward getuseadd(ActionMapping mapping, ActionForm form,

                                         HttpServletRequest request,HttpServletResponse response) {

              GetUseForm getUseForm = (GetUseForm) form;

              int rtn = outStorageDAO.getuseAdd(getUseForm);

              ……    //此處省略了根據(jù)返回值重定向頁(yè)面的代碼

          }

          3.編寫(xiě)保存部門(mén)領(lǐng)用信息的OutStorageDAO類(lèi)的方法

          從上面的代碼中可以知道保存部門(mén)領(lǐng)用信息時(shí)使用的OutStorageDAO類(lèi)的方法是getuseAdd()。實(shí)現(xiàn)getuseAdd()方法主要分為以下4個(gè)步驟。

          (1)將部門(mén)領(lǐng)用信息保存到部門(mén)領(lǐng)用信息表中,由于映射了關(guān)聯(lián)關(guān)系,所以需要建立“GoodsForm和GetUseForm的關(guān)聯(lián)關(guān)系”以及“BranchForm和GetUseForm的關(guān)聯(lián)關(guān)系”。

          (2)獲取部門(mén)領(lǐng)用信息表中最大的自動(dòng)編號(hào),與字符“LY”和系統(tǒng)日期組合成“LYYYYY-MM-DDnnnnn”格式的領(lǐng)用單號(hào),并插入到部門(mén)領(lǐng)用信息表中。

          (3)修改庫(kù)存信息表。

          (4)如果在執(zhí)行過(guò)程中不拋出異常,則將標(biāo)志變量賦值為1,否則將標(biāo)志變量賦值為0,最后返回該標(biāo)志變量。

          getuseAdd()方法的具體代碼如下。

          例程18-99:光盤(pán)\mr\18\MaterialManage\src\com\dao\OutStorageDAO.java

          public int getuseAdd(GetUseForm getUseForm) {

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

              Transaction tx = null;

              int rtn = 1;

              try {

                  //保存部門(mén)領(lǐng)用信息

                  tx = session.beginTransaction();

                  int goodsid = getUseForm.getGoodsid();

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

                  getUseForm.setGoods(goodsForm);

                  int branchid = getUseForm.getBranchid();

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

                  getUseForm.setBranch(branchForm);

                  getUseForm.setCreatetime(new Date());

                  session.save(getUseForm);

                  NumberFormat formater = NumberFormat.getNumberInstance();

                  int id = getUseForm.getId();

                  formater.setMinimumIntegerDigits(5);

                  java.util.Date createTime = getUseForm.getCreatetime();

                  java.sql.Date date = new java.sql.Date(createTime.getTime());

                  String gNo = "LY" + date +formater.format(id).toString().replace(",", "");   //組合領(lǐng)用單號(hào)

                  GetUseForm getUseF = (GetUseForm) session.get(

                          GetUseForm.class, id);

                  getUseF.setGno(gNo);

                  session.update(getUseF);

                      //修改庫(kù)存信息

                  List list = session.createQuery("FROM StorageForm WHERE goodsid=" +

                                                  getUseForm.getGoodsid() + "").list();

                  StorageForm storageF = (StorageForm) list.get(0);

                  int storageNum = storageF.getNumber() - getUseForm.getNumber();

                  if (storageNum >= 0) {

                      storageF.setNumber(storageNum);

                      session.update(storageF);

                  } else {      //庫(kù)存數(shù)量不足

                      rtn = 0;

                  }

                  if (rtn == 1) {

                      tx.commit();

                  } else {

                      if (tx != null) {

                          tx.rollback();

                      }

                  }

              } catch (Exception e) {

                  ……   //此處省略了事務(wù)回滾和輸出錯(cuò)誤信息的代碼

                  rtn = 0;

              } finally {

                  MySession.closeSession(session); //關(guān)閉Session

              }

              return rtn;

          }

          4.struts-config.xml文件配置

          在struts-config.xml文件中配置保存部門(mén)領(lǐng)用信息所涉及的<forward>元素,代碼如下:

          <forward name="getUseAddok" path="/getUseAdd_ok.jsp?para=1" />

          18.11.5  物資借出設(shè)計(jì)

          使用的數(shù)據(jù)表:tb_loan、tb_goods、tb_storage      主要技術(shù):通過(guò)Hibernate API操作數(shù)據(jù)庫(kù)

          用戶(hù)登錄后,選擇“物資出庫(kù)”→“物資借出”菜單項(xiàng),進(jìn)入到 物資借出登記頁(yè)面。在物資借出頁(yè)面中。首先從“物資名稱(chēng)”下拉列表框中選擇要借出的物資(系統(tǒng)將自動(dòng)檢索出該物資的生產(chǎn)廠家、單價(jià)、計(jì)量單位和庫(kù)存數(shù)量等信息),然后在“借出數(shù)量”文本框中輸入借出數(shù)量(系統(tǒng)會(huì)自動(dòng)檢驗(yàn)庫(kù)存數(shù)量,如果庫(kù)存數(shù)量不足,系統(tǒng)將給予提示),最后輸入借用人基本信息及負(fù)責(zé)人名稱(chēng),單擊【保存】按鈕,保存物資借出信息,運(yùn)行結(jié)果如圖18.23所示。

          圖18.23  物資借出頁(yè)面運(yùn)行結(jié)果

          1.設(shè)計(jì)物資借出頁(yè)面

          從系統(tǒng)主菜單中選擇“物資出庫(kù)”→“物資借出”菜單項(xiàng)或是在物資借出頁(yè)面中改變“物資名稱(chēng)”下拉列表框的值時(shí)都會(huì)觸發(fā)一個(gè)URL地址,這個(gè)URL地址是“loan.do?action=loanaddquery”,從這個(gè)URL地址中可以知道物資借出頁(yè)面所涉及到的action參數(shù)值為“loanaddquery”,當(dāng)action=loanaddquery時(shí),會(huì)調(diào)用查詢(xún)庫(kù)存中的物資信息的方法loanadd_request(),具體代碼如下。

          例程18-100:光盤(pán)\mr\18\MaterialManage\src\com\action\GetUse.java

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

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

          }

          在查詢(xún)庫(kù)存中物資信息的方法loanadd_request()中,首先需要獲取從頁(yè)面中傳遞的參數(shù)id的值并保存到HttpServletRequest的對(duì)象id中,然后調(diào)用OutStorageDAO類(lèi)中的storage_query()方法查詢(xún)出庫(kù)存中的物資信息,再將返回的查詢(xún)結(jié)果保存到HttpServletRequest的對(duì)象GoodsStorage中。查詢(xún)庫(kù)存中物資信息的方法getuseadd_request()的具體代碼同例程18-98類(lèi)似,這里就不再贅述。

          查詢(xún)庫(kù)存中物資信息使用的OutStorageDAO類(lèi)的方法是storage_query(),在該方法中首先需要利用Hibernate的本地SQL查詢(xún)從兩個(gè)表中獲取庫(kù)存中物資的詳細(xì)信息,然后將查詢(xún)結(jié)果保存到List集合list中,并返回list。storage_query()方法的具體代碼請(qǐng)參見(jiàn)例程18-99。

          在struts-config.xml文件中配置查詢(xún)庫(kù)存中物資信息所涉及的<forward>元素,代碼如下:

          <forward name="selStorageGoods" path="/getUseAdd.jsp" />

          接下來(lái)的工作是將Action實(shí)現(xiàn)類(lèi)中storage_query()方法返回的查詢(xún)結(jié)果顯示在物資借出頁(yè)面loanAdd.jsp中。在loanAdd.jsp中通過(guò)request.getAttribute()方法獲取查詢(xún)結(jié)果并將其顯示在相應(yīng)的位置或表單元素中。

          2.保存物資借出信息

          在物資借出頁(yè)面中錄入物資借出信息后,單擊【保存】按鈕,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL,這個(gè)URL是“loan.do?action=loanadd”。從該URL地址中可以知道保存物資借出信息涉及到的action的參數(shù)值為“loanadd”,也就是當(dāng)action=loanadd時(shí),會(huì)調(diào)用保存物資借出信息的方法loanadd(),具體代碼如下。

          例程18-101:光盤(pán)\mr\18\MaterialManage\src\com\action\Loan.java

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

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

          }

          在保存物資借出信息的方法loanadd()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類(lèi)型,然后調(diào)用OutStorageDAO類(lèi)中的getuseAdd()方法保存物資借出信息到相應(yīng)的數(shù)據(jù)表中,并將返回值保存到變量rtn中,如果返回值為1,表示信息保存成功,將頁(yè)面重定向到物資借出頁(yè)面,否則將錯(cuò)誤提示信息“物資借出信息添加失敗!”保存到HttpServletRequest的對(duì)象error中,然后將頁(yè)面重定向到錯(cuò)誤提示信息頁(yè)面。保存物資借出信息的方法loanadd()的關(guān)鍵代碼如下。

          例程18-102:光盤(pán)\mr\18\MaterialManage\src\com\action\Loan.java

          public ActionForward loanadd(ActionMapping mapping, ActionForm form,

                                         HttpServletRequest request,HttpServletResponse response) {

              LoanForm loanForm = (LoanForm) form;

              int rtn = outStorageDAO.loanAdd(loanForm);

              ……    //此處省略了根據(jù)返回值重定向頁(yè)面的代碼

          }

          3.編寫(xiě)保存物資借出信息的OutStorageDAO類(lèi)的方法

          從上面的代碼中可以知道保存物資借出信息時(shí)使用的OutStorageDAO類(lèi)的方法是loanAdd()。實(shí)現(xiàn)loanAdd()方法主要分為以下3個(gè)步驟。

          (1)將物資借出信息保存到物資借出信息表tb_loan中。

          (2)獲取物資借出信息表中最大的自動(dòng)編號(hào),與字符“LY”和系統(tǒng)日期組合成“JCYYYY-MM-DDnnnnn”格式的借出單號(hào),并插入到物資借出信息表中。

          (3)如果在執(zhí)行過(guò)程中不拋出異常,則將標(biāo)志變量賦值為1,否則將標(biāo)志變量賦值為0,最后返回該標(biāo)志變量。

          loanAdd()方法的具體代碼如下。

          例程18-103:光盤(pán)\mr\18\MaterialManage\src\com\dao\OutStorageDAO.java

          public int loanAdd(LoanForm loanForm) {

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

              Transaction tx = null;

              int rtn = 0;

              try {

                  //保存物資借出信息

                  tx = session.beginTransaction();

                  int goodsid = loanForm.getGoodsid();

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

                  loanForm.setGoods(goodsForm);

                  loanForm.setCreatetime(new Date());

                  session.save(loanForm);

                  NumberFormat formater = NumberFormat.getNumberInstance();

                  int id = loanForm.getId();

                  formater.setMinimumIntegerDigits(5);

                  java.util.Date createTime = loanForm.getCreatetime();

                  java.sql.Date date = new java.sql.Date(createTime.getTime());

                  String lNo = "JC" + date +formater.format(id).toString().replace(",", ""); //組合借出單號(hào)

                  LoanForm loanF = (LoanForm) session.get(

                          LoanForm.class, id);

                  loanF.setLno(lNo);

                  session.update(loanF);

                  tx.commit();

                  rtn = 1;

              } catch (Exception e) {

                  ……   //此處省略了事務(wù)回滾和輸出錯(cuò)誤信息的代碼

                  rtn = 0;

              } finally {

                  MySession.closeSession(session); //關(guān)閉Session

              }

              return rtn;

          }

          4.struts-config.xml文件配置

          在struts-config.xml文件中配置保存物資借出信息所涉及的<forward>元素,代碼如下:

          <forward name="loanAddok" path="/loanAddok_ok.jsp?para=1" />

          18.11.6  借出審核設(shè)計(jì)

          使用的數(shù)據(jù)表:tb_loan、tb_goods、tb_storage    主要技術(shù):通過(guò)Hibernate API操作數(shù)據(jù)庫(kù)

          用戶(hù)登錄后,選擇“物資出庫(kù)”→“借出審核”命令,進(jìn)入到借出審核頁(yè)面,在該頁(yè)面中將顯示全部未審核的借出單列表,單擊審核圖標(biāo),即可完成借出審核操作。借出審核頁(yè)面的運(yùn)行結(jié)果如圖18.24所示。

          圖18.24  借出審核頁(yè)面運(yùn)行結(jié)果

          在“借出審核”頁(yè)面中可以找到審核圖標(biāo)的超級(jí)鏈接代碼,如下所示:

          例程18-104:光盤(pán)\mr\18\MaterialManage\defaultroot\loanApproveQuery.jsp

          <a href="loan.do?action=approveloan&id=<%=id%>">

          <img src="images/enforce.gif" width="16" height="16" border="0"></a>

          從上面的URL地址中可以知道實(shí)現(xiàn)借出審核操作所涉及到的action的參數(shù)值為“approveloan”,當(dāng)action=approveloan時(shí),會(huì)調(diào)用實(shí)現(xiàn)借出審核操作的方法approveloan(),具體代碼如下。

          例程18-105:光盤(pán)\mr\18\MaterialManage\src\com\action\Loan.java

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

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

          }

          在實(shí)現(xiàn)借出審核操作的方法approveloan()中,首先需要判斷用戶(hù)是否登錄,如果沒(méi)登錄則跳轉(zhuǎn)到登錄頁(yè)面強(qiáng)制其登錄,這樣可以提高系統(tǒng)的安全性,然后獲取從頁(yè)面中傳遞的參數(shù)id,并將id的值賦給int型變量id,賦值后將該變量作為OutStorageDAO類(lèi)中approveloanAdd()方法的參數(shù),最后調(diào)用approveloanAdd()方法實(shí)現(xiàn)借出審核操作,并根據(jù)執(zhí)行結(jié)果轉(zhuǎn)到相應(yīng)的頁(yè)面。approveloan()方法的具體代碼如下。

          例程18-106:光盤(pán)\mr\18\MaterialManage\src\com\action\Instorage.java

          public ActionForward approveloan(ActionMapping mapping,ActionForm form,

                                          HttpServletRequest request,HttpServletResponse response){

              HttpSession httpsession = request.getSession();

              ……     //此處省略了判斷用戶(hù)是否登錄的代碼

              int id=Integer.valueOf(request.getParameter("id"));

              int rtn=outStorageDAO.approveloanAdd(id,request);

              if(rtn==1){

                  return mapping.findForward("loanApproveAddok");

              }else if(rtn==2){

                  request.setAttribute("error","庫(kù)存數(shù)量不足,不能完成借出審核!");

                  return mapping.findForward("error");

              }else{

                  request.setAttribute("error","借出審核操作失敗!");

                  return mapping.findForward("error");

               }

          }

          從上面代碼中可以知道實(shí)現(xiàn)借出審核操作使用的OutStorageDAO類(lèi)的方法是approveloanAdd()。在approveloanAdd()方法中首先將借出審核信息保存到物資借出信息表tb_loan中,然后修改相應(yīng)物資的庫(kù)存數(shù)量,當(dāng)庫(kù)存數(shù)量不足時(shí),不能完成借出審核操作。approveloanAdd()方法的具體代碼如下。

          例程18-107:光盤(pán)\mr\18\MaterialManage\src\com\dao\OutStorageDAO.java

          public int approveloanAdd(int id, HttpServletRequest request) {

              int rtn = 1;

              session = MySession.openSession();                                                                //打開(kāi)session

              Transaction tx = null;

              try {

                  tx = session.beginTransaction();

                  LoanForm loanForm = (LoanForm) session.get(LoanForm.class, id);

                  loanForm.setApprovetime(new Date());

                  HttpSession httpsession = request.getSession();

                  loanForm.setTaster((String) httpsession.getAttribute("username"));//設(shè)置審核員

                  loanForm.setState(new Short("1"));                                                //修改借出單狀態(tài)為已審核

                  session.update(loanForm);                                                         //保存借出審核信息

                  GoodsForm goodsF = loanForm.getGoods();

                  int goodsid = goodsF.getId();

                  int goodsnumber = loanForm.getNumber();

                  String hql_goods = "FROM StorageForm WHERE goodsid=" + goodsid + "";

                  List list_goods = session.createQuery(hql_goods).list();

                  if (list_goods.size() > 0) {

                      StorageForm storageF = (StorageForm) list_goods.get(0);

                      if (storageF.getNumber() - goodsnumber >= 0) {

                          String hql_up = "UPDATE StorageForm set number=number-" +

                                          goodsnumber + " WHERE goodsid=" + goodsid +"";

                          session.createQuery(hql_up).executeUpdate();

                      } else {

                          rtn = 2; //庫(kù)存不足

                      }

                  } else {

                      rtn = 0;

                  }

                  if (rtn == 1) {

                      tx.commit();

                  } else {

                      if (tx != null) {

                          tx.rollback();

                      }

                  }

              } catch (Exception e) {

                  ……   //此處省略了事務(wù)回滾和輸出錯(cuò)誤信息的代碼

                  rtn = 0;

              } finally {

                  MySession.closeSession(session); //關(guān)閉Session

              }

              return rtn;

          }

          在struts-config.xml文件中配置實(shí)現(xiàn)借出審核操作所涉及的<forward>元素,代碼如下:

          <forward name="loanApproveAddok" path="/loanAddok_ok.jsp?para=2" />

          posted on 2009-01-07 10:42 rogerfan 閱讀(178) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 【開(kāi)源技術(shù)】
          主站蜘蛛池模板: 咸阳市| 光山县| 余干县| 图木舒克市| 申扎县| 丹江口市| 江阴市| 景洪市| 禹州市| 松原市| 平舆县| 西昌市| 伊通| 邯郸市| 贵溪市| 三门县| 乡宁县| 利辛县| 万盛区| 永胜县| 湄潭县| 定南县| 枣强县| 康马县| 吉水县| 突泉县| 丽江市| 绥芬河市| 高邑县| 天门市| 大余县| 久治县| 洪江市| 吴忠市| 永丰县| 濮阳县| 汉源县| 河东区| 丹东市| 从化市| 西华县|