18.9 物資管理模塊
18.9.1 物資管理模塊總體架構(gòu)
1.模塊功能介紹
物資管理模塊主要包括以下功能。
● 查看物資列表:用于分類顯示未刪除的和已刪除的物資信息;
● 添加物資信息:用于添加物資信息;
● 修改物資信息:用于修改物資信息;
● 刪除/恢復(fù)物資信息:用于刪除或恢復(fù)物資信息。
2.文件架構(gòu)
物資管理模塊文件架構(gòu)如圖18.14所示。

圖18.14 物資管理模塊文件架構(gòu)
18.9.2 創(chuàng)建物資管理模塊的持久化類及映射文件
1.創(chuàng)建持久化類
物資管理模塊只涉及到物資信息表tb_goods,因此只需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的持久化類,將其命名為GoodsForm。由于持久化類的創(chuàng)建方法大致相同,都是包含一些屬性,以及與之對(duì)應(yīng)的getXXX()和setXXX()方法,這里就不詳細(xì)介紹了,具體實(shí)現(xiàn)方法請(qǐng)參見18.8.2節(jié)。
2.創(chuàng)建映射文件
創(chuàng)建一個(gè)名為GoodsForm.hbm.xml的文件,用于把GoodsForm類映射到tb_goods表,這個(gè)文件應(yīng)該與UserForm.class文件存放在同一個(gè)目錄下,關(guān)鍵代碼如下。
例程18-41:光盤\mr\18\MaterialManage\src\com\actionForm\GoodsForm.hbm.xml
<class name="com.actionForm.GoodsForm" table="tb_goods">
<id name="id" column="id" type="int">
<generator class="increment"/>
</id>
<property name="name" column="name" type="string" not-null="true"/>
<property name="spec" column="spec" type="string" not-null="true"/>
<property name="unit" column="unit" type="string" not-null="true"/>
<property name="price" column="price" type="float" not-null="true"/>
<property name="producer" column="producer" type="string"/>
<property name="ifdel" column="ifdel" type="byte"/>
</class>
3.修改Hibernate配置文件
在創(chuàng)建持久化類和映射文件后,還需要在Hibernate配置文件hibernate.cfg.xml中指定持久化類映射文件,關(guān)鍵代碼如下:
<mapping resource="com/actionForm/GoodsForm.hbm.xml"/>
18.9.3 創(chuàng)建物資管理的Action實(shí)現(xiàn)類
物資管理模塊的Action實(shí)現(xiàn)類繼承了Action類,在該類中首先需要在構(gòu)造方法中實(shí)例化物資管理模塊的GoodsDAO類(該類用于實(shí)現(xiàn)業(yè)務(wù)邏輯操作),然后通過Action實(shí)現(xiàn)類的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實(shí)現(xiàn)類的execute()方法會(huì)被自動(dòng)執(zhí)行,這個(gè)方法本身沒有具體的事務(wù),它是根據(jù)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。
物資管理模塊的Action實(shí)現(xiàn)類的關(guān)鍵代碼如下。
例程18-42:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public class Goods extends Action {
private GoodsDAO goodsDAO=null;
public Goods(){
goodsDAO=new GoodsDAO();
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String action=request.getParameter("action"); //獲取action參數(shù)值
if(action.equals("") || action==null){
request.setAttribute("error","您的操作有誤!");
return mapping.findForward("error");
}else if(action.equals("goodsRequest")){ //查詢物資信息
return goodsQuery(mapping,form,request,response);
}else if(action.equals("goodsadd")){ //添加物資信息
return goodsAdd(mapping,form,request,response);
}else if(action.equals("goodsMquery")){ //查詢單條物資信息
return goodsModiQuery(mapping,form,request,response);
}else if(action.equals("goodsmodify")){ //修改物資信息
return goodsModify(mapping,form,request,response);
}else if(action.equals("goodsdel")){ //刪除物資信息
return goodsdel(mapping,form,request,response);
}
request.setAttribute("error","您的操作有誤!");
return mapping.findForward("error");
}
…… //此處省略了該類中其他方法,這些方法將在后面的具體過程中給出
}
18.9.4 查看物資列表設(shè)計(jì)
用戶登錄后,選擇“基礎(chǔ)信息”→“物資管理”命令,進(jìn)入到查看物資列表頁面,在該頁面中將列出系統(tǒng)中的除超級(jí)用戶mr之外的用戶及其權(quán)限信息,同時(shí)提供添加物資信息、修改物資和刪除物資信息的超級(jí)鏈接。查看物資列表頁面的運(yùn)行結(jié)果如圖18.15所示。

圖18.15 查看物資列表頁面運(yùn)行結(jié)果
在實(shí)現(xiàn)系統(tǒng)導(dǎo)航菜單時(shí),引用了JavaScript文件menu.JS,該文件實(shí)現(xiàn)了半透明背景菜單的全部JavaScript代碼。打開該JS文件,可以找到如下所示的“物資管理”菜單項(xiàng)的超級(jí)鏈接代碼:
<a href=goods.do?action=goodsRequest>物資管理</a>
從上面的URL地址中可以知道查看物資列表模塊涉及到的action的參數(shù)值為“goodsRequest”,當(dāng)action=goodsRequest時(shí),會(huì)調(diào)用查看物資列表的方法goodsQuery(),具體代碼如下。
例程18-43:光盤\mr\18\MaterialManage\src\com\action\Goods.java
if(action.equals("goodsRequest")){
return goodsQuery(mapping,form,request,response);
}
在查看物資列表的方法goodsQuery()中,首先調(diào)用GoodsDAO類中的query()方法查詢出未刪除的和已刪除的物資信息,再將返回的查詢結(jié)果分別保存到HttpServltRequest的對(duì)象goodslist0和goodslist1中,查看物資列表的方法goodsQuery()的具體代碼如下。
例程18-44:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public ActionForward goodsQuery(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
String str=null;
int ifdel=0; //獲取未被刪除的物資信息
request.setAttribute("goodslist0",goodsDAO.query(str,ifdel));
ifdel=1; //獲取已被刪除的物資信息
request.setAttribute("goodslist1",goodsDAO.query(str,ifdel));
return mapping.findForward("goodsQuery");
}
從上面的代碼中可以知道查看物資列表使用的GoodsDAO類的方法是query(),該方法包括兩個(gè)參數(shù),一個(gè)是String型參數(shù)strif(用于指定查詢條件字符串),另一個(gè)是int型參數(shù)del(用于標(biāo)記是查詢未刪除的還是查詢已刪除的物資信息,0表示未刪除的,1表示已刪除的)。在query()方法中首先判斷參數(shù)strif的值是否為空并且是否為“all”,當(dāng)strif不為空并且不為“all”時(shí),將通過Hibernate的HQL根據(jù)指定的條件查詢物資信息,否則將通過Hibernate的HQL查詢未刪除或已刪除的物資信息。然后將查詢結(jié)果保存到List集合中并返回該List,query()方法的具體代碼如下。
例程18-45:光盤\mr\18\MaterialManage\src\com\dao\GoodsDAO.java
public List query(String strif, int del) {
session = MySession.openSession(); //打開Session
String hql = "";
if (strif != "all" && strif != null && strif != "") { //條件查詢
hql = "FROM GoodsForm goods WHERE " + strif + "";
} else { //查詢未刪除或已刪除的物資信息
hql = "FROM GoodsForm goods WHERE ifdel=" + del + " ORDER BY ifdel";
}
List list=null;
try {
Query query = session.createQuery(hql);
list = query.list();
} catch (Exception e) {
e.printStackTrace();
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
return list;
}
在struts-config.xml文件中配置查看物資列表所涉及的<forward>元素,代碼如下:
<forward name="goodsQuery" path="/goodsList.jsp" />
接下來的工作是將Action實(shí)現(xiàn)類中g(shù)oodsQuery()方法返回的查詢結(jié)果顯示在查看物資列表頁goodsList.jsp中。在goodsList.jsp中首先通過request.getAttribute()方法獲取查詢結(jié)果并將其保存在List集合中,再通過循環(huán)將物資信息以列表形式顯示在頁面中,由于該頁面涉及到兩個(gè)結(jié)果集,所以需要分別獲取并顯示。
說明:由于該頁面與18.8.5節(jié)中的顯示用戶信息列表頁類似,所以此處將不再贅述。
18.9.5 添加物資信息設(shè)計(jì)
用戶登錄后,選擇“基礎(chǔ)信息”→“物資管理”命令,進(jìn)入到查看物資列表頁面,在該頁面中單擊“添加物資信息”超級(jí)鏈接即可進(jìn)入添加物資信息頁面。添加物資信息頁面的運(yùn)行結(jié)果如圖18.16所示。

圖18.16 添加物資信息頁面的運(yùn)行結(jié)果
1.設(shè)計(jì)添加物資信息頁面
添加物資信息頁面主要用于收集輸入的物資信息及通過自定義的JavaScript函數(shù)驗(yàn)證輸入信息是否合法,該頁面中所涉及到的重要表單元素如表18.15所示。
表18.15 添加物資信息頁面所涉及的重要表單元素
名 稱
|
元 素 類 型
|
重 要 屬 性
|
含 義
|
form1
|
form
|
method="post"action="goods.do?action=goodsadd" onSubmit="return mycheck(form1)"
|
表單
|
name
|
text
|
|
物資名稱
|
ifdel
|
hidden
|
value="0"
|
是否刪除
|
Submit
|
submit
|
value="保存"
|
【保存】按鈕
|
Submit3
|
button
|
value="返回"
onClick="window.location.href='goods.do?action=goodsRequest'"
|
【返回】按鈕
|
2.修改物資管理的Action實(shí)現(xiàn)類
在添加物資信息頁面中輸入合法的物資信息后,單擊“保存”按鈕,網(wǎng)頁會(huì)訪問一個(gè)URL,這個(gè)URL是“goods.do?action=goodsadd”。從該URL地址中可以知道添加用戶模塊涉及到的action的參數(shù)值為“goodsadd”,也就是當(dāng)action=goodsadd時(shí),會(huì)調(diào)用添加用戶的方法goodsAdd(),具體代碼如下。
例程18-46:光盤\mr\18\MaterialManage\src\com\action\Goods.java
if(action.equals("goodsadd")){
return goodsAdd(mapping,form,request,response);
}
在添加物資信息的方法goodsAdd()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,然后調(diào)用GoodsDAO類中的insert()方法將添加的用戶信息保存到數(shù)據(jù)表中,并將返回值保存到變量rtn中,如果返回值為1,表示信息添加成功,將頁面重定向到添加信息成功頁面。如果返回值為2,表示該物資信息已經(jīng)添加,將錯(cuò)誤提示信息“該物資信息已經(jīng)存在!”保存到HttpServletRequest的對(duì)象error中,然后將頁面重定向到錯(cuò)誤提示信息頁面;否則將錯(cuò)誤提示信息“添加物資信息失敗!”保存到HttpServletRequest的對(duì)象error中,并將頁面重定向到錯(cuò)誤提示頁,添加物資信息的方法goodsAdd()的關(guān)鍵代碼如下。
例程18-47:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public ActionForward goodsAdd(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
GoodsForm goodsForm = (GoodsForm) form;
int rtn=goodsDAO.insert(goodsForm);
…… //此處省略了根據(jù)返回值重定向頁面的代碼
}
3.編寫添加物資的GoodsDAO類的方法
從上面的代碼中可以知道添加用戶使用的GoodsDAO類的方法是insert()。在insert()方法中首先調(diào)用GoodsDAO的query()方法從數(shù)據(jù)表tb_goods中查詢輸入的物資信息是否存在,如果存在,將標(biāo)志變量設(shè)置為2,否則將輸入的信息保存到物資信息表中,如果插入時(shí)拋出異常,將回滾事務(wù)并將標(biāo)志變量設(shè)置0,否則將標(biāo)志變量設(shè)置為1,最后返回標(biāo)志變量,insert()方法的具體代碼如下。
例程18-48:光盤\mr\18\MaterialManage\src\com\dao\GoodsDAO.java
public int insert(GoodsForm goodsForm) {
int ret = 0;
Transaction tx = null;
String str = "name='" + goodsForm.getName() + "' AND spec='" + goodsForm.getSpec() + "'";
List list = query(str, 0);
if (list.size() > 0) { //存在該信息
ret = 2;
} else {
session = MySession.openSession(); //打開Session
try {
tx = session.beginTransaction();
session.save(goodsForm);
tx.commit();
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
return ret = 0;
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置添加用戶所涉及的<forward>元素,代碼如下:
<forward name="goodsaddok" path="/goods_ok.jsp?para=1" />
18.9.6 修改物資設(shè)計(jì)
用戶登錄后,選擇“基礎(chǔ)信息”→“物資管理”命令,進(jìn)入到查看物資列表頁面,在該頁面中單擊想要修改的物資信息后面的“修改”超級(jí)鏈接即可進(jìn)入到“修改物資信息”頁面對(duì)物資信息進(jìn)行修改。修改物資信息頁面的運(yùn)行結(jié)果如圖18.17所示。

圖18.17 修改物資信息頁面的運(yùn)行結(jié)果
1.設(shè)計(jì)修改物資信息頁面
在“查看物資列表”頁面中可以找到打開“修改物資信息”頁面的超級(jí)鏈接代碼,如下所示。
例程18-49:光盤\mr\18\MaterialManage\defaultroot\goodsList.jsp
<a href="goods.do?action=goodsMquery&id=<%=id%>">修改</a>
從上面的URL地址中可以知道修改物資信息頁面所涉及到的action的參數(shù)值為“goodsMquery”,當(dāng)action=goodsMquery時(shí),會(huì)調(diào)用查詢指定物資信息的方法goodsModiQuery(),具體代碼如下。
例程18-50:光盤\mr\18\MaterialManage\src\com\action\Goods.java
if(action.equals("goodsMquery")){
return goodsModiQuery(mapping,form,request,response);
}
在查詢指定物資信息的方法goodsModiQuery()中,首先需要獲取從頁面中傳遞的參數(shù)id的值并賦值給int型變量id,然后調(diào)用GoodsDAO類中的query()方法,并將變量id作為該方法的參數(shù),查詢出指定物資信息,再將返回的查詢結(jié)果保存到HttpServletRequest的對(duì)象goodsForm中,查詢指定物資信息的方法goodsModiQuery()的具體代碼如下。
例程18-51:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public ActionForward goodsModiQuery(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
int id=Integer.parseInt(request.getParameter("id"));
request.setAttribute("goodsForm",goodsDAO.query(id));
return mapping.findForward("goodsModiQuery");
}
從上面的代碼中可以知道查詢指定物資信息使用的GoodsDAO類的方法是query(),該方法只有一個(gè)int型參數(shù)id(用于指定用戶id)。在query()方法中將利用Session的get()方法查詢出指定用戶,然后將查詢結(jié)果保存到GoodsForm中,并返回GoodsForm,query()方法的具體代碼如下。
例程18-52:光盤\mr\18\MaterialManage\src\com\dao\GoodsDAO.java
public GoodsForm query(int id) {
session = MySession.openSession(); //打開Session
GoodsForm goodsForm = null;
try {
goodsForm = (GoodsForm) session.get(GoodsForm.class, id);
} catch (Exception e) {
e.printStackTrace();
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
return goodsForm;
}
在struts-config.xml文件中配置查詢指定物資信息所涉及的<forward>元素,代碼如下。
<forward name="goodsModiQuery" path="/goodsModify.jsp" />
接下來的工作是將Action實(shí)現(xiàn)類中g(shù)oodsModiQuery()方法返回的查詢結(jié)果顯示在修改物資信息頁goodsModify.jsp中。在goodsModify.jsp中首先通過request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的表單元素中。
2.修改物資管理的Action實(shí)現(xiàn)類
在修改物資信息頁面中對(duì)物資信息進(jìn)行修改后,單擊“保存”按鈕,網(wǎng)頁會(huì)訪問一個(gè)URL,這個(gè)URL是“goods.do?action=goodsmodify”。從該URL地址中可以知道保存修改物資信息涉及到的action的參數(shù)值為“goodsmodify”,也就是當(dāng)action=goodsmodify時(shí),會(huì)調(diào)用保存修改物資信息的方法goodsModify(),具體代碼如下。
例程18-53:光盤\mr\18\MaterialManage\src\com\action\Goods.java
if(action.equals("goodsmodify")){
return goodsModify(mapping,form,request,response);
}
在保存修改物資信息的方法goodsModify()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,然后調(diào)用GoodsDAO類中的update()方法將修改的物資信息保存到物資信息表tb_goods,并將返回值保存到變量rtn中,如果返回值為1,表示信息修改成功,將頁面重定向到修改信息成功頁面,否則將錯(cuò)誤提示信息“物資信息修改失敗!”保存到HttpServletRequest的對(duì)象error中,然后將頁面重定向到錯(cuò)誤提示信息頁面,保存修改物資信息的方法goodsModify()的關(guān)鍵代碼如下。
例程18-54:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public ActionForward goodsModify(ActionMapping mapping,ActionForm form,HttpServletRequest
request,HttpServletResponse response){
GoodsForm goodsForm = (GoodsForm) form;
int rtn=goodsDAO.update(goodsForm);
…… //此處省略了根據(jù)返回值重定向頁面的代碼
}
3.編寫保存修改權(quán)限信息的GoodsDAO類的方法
從上面的代碼中可以知道修改物資信息時(shí)使用的GoodsDAO類的方法是update()。在update()方法中將修改的物資信息保存到物資信息表tb_goods中,并將返回值賦給標(biāo)志變量,最后返回該標(biāo)志變量,update()方法的具體代碼如下。
例程18-55:光盤\mr\18\MaterialManage\src\com\dao\GoodsDAO.java
public int update(GoodsForm goodsForm) {
session = MySession.openSession(); //打開Session
int ret = 0;
Transaction tx = null;
try {
tx = session.beginTransaction();
GoodsForm goodsF = (GoodsForm) session.get(GoodsForm.class,
goodsForm.getId());
goodsF.setSpec(goodsForm.getSpec());
goodsF.setUnit(goodsForm.getUnit());
goodsF.setPrice(goodsForm.getPrice());
goodsF.setProducer(goodsForm.getProducer());
session.update(goodsF);
tx.commit();
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
return ret = 0;
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置修改物資信息所涉及的<forward>元素,代碼如下:
<forward name="goodsmodifyok" path="/goods_ok.jsp?para=2" />
18.9.7 刪除/恢復(fù)物資信息設(shè)計(jì)
用戶登錄后,選擇“基礎(chǔ)信息”→“物資管理”命令,進(jìn)入到查看物資列表頁面,該頁面分為未刪除物資信息列表和已刪除物資信息列表,上面部分顯示的是未刪除的物資信息,下面部分顯示的是已刪除的物資信息。單擊未刪除物資信息后面的“刪除”超級(jí)鏈接可以將該物資刪除,此時(shí)該信息將顯示在已刪除物資信息列表中;單擊已刪除物資后面的“恢復(fù)”超級(jí)鏈接可以取消對(duì)該物資的刪除,此時(shí)該信息將顯示在未刪除物資信息列表中。
在“查看物資列表”頁面中可以找到刪除和恢復(fù)物資信息的超級(jí)鏈接代碼,如下所示。
例程18-56:光盤\mr\18\MaterialManage\defaultroot\goodsList.jsp
<a href="goods.do?action=goodsdel&id=<%=id%>&val=1">刪除</a>
<a href="goods.do?action=goodsdel&id=<%=id%>&val=0">恢復(fù)</a>
從上面的URL地址中可以知道刪除物資頁所涉及到的action的參數(shù)值為“goodsdel”,當(dāng)action= goodsdel時(shí),會(huì)調(diào)用刪除/恢復(fù)物資信息的方法goodsdel(),具體代碼如下。
例程18-57:光盤\mr\18\MaterialManage\src\com\action\Goods.java
if(action.equals("goodsdel")){
return goodsdel(mapping,form,request,response);
}
在刪除/恢復(fù)物資信息的方法goodsdel()中,首先需要獲取從頁面中傳遞的參數(shù)id和val,并將id的值賦給int型變量id,val的值賦給byte型變量val,賦值后將這兩個(gè)變量作為GoodsDAO類中del()方法的參數(shù),然后調(diào)用該del()方法刪除/恢復(fù)物資信息,并根據(jù)執(zhí)行結(jié)果轉(zhuǎn)到相應(yīng)的頁面,刪除/恢復(fù)物資信息的方法goodsdel()的具體代碼如下。
例程18-58:光盤\mr\18\MaterialManage\src\com\action\Goods.java
public ActionForward goodsdel(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
int id=Integer.parseInt(request.getParameter("id"));
byte val=Byte.parseByte(request.getParameter("val"));
int rtn=goodsDAO.del(id,val);
if(rtn==1){
return mapping.findForward("goodsdelok");
}else{
request.setAttribute("error", "物資信息刪除/恢復(fù)失敗!");
return mapping.findForward("error");
}
從上面代碼中可以知道刪除/恢復(fù)物資信息使用的GoodsDAO類的方法是del()。在del()方法中首先通過Session的get()方法查詢到要?jiǎng)h除/恢復(fù)的物資信息,并保存到GoodsForm中,然后再使用Session的update()方法刪除/恢復(fù)物資信息,最后返回執(zhí)行結(jié)果,del()方法的具體代碼如下。
例程18-59:光盤\mr\18\MaterialManage\src\com\dao\GoodsDAO.java
public int del(int id, byte val) {
session = MySession.openSession(); //打開Session
int ret = 0;
Transaction tx = null;
try {
tx = session.beginTransaction();
GoodsForm goodsF = (GoodsForm) session.get(GoodsForm.class, id);
goodsF.setIfdel(val);
session.update(goodsF);
tx.commit();
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
return ret = 0;
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
return ret;
}
在struts-config.xml文件中配置刪除物資信息所涉及的<forward>元素,代碼如下:
<forward name="goodsdelok" path="/goods_ok.jsp?para=3" />