18.14 系統初始化模塊
用戶登錄后,選擇“系統管理”→“系統初使化”菜單項,進入到系統初使化,在該頁面中將顯示提示信息,單擊【進行系統初使化】按鈕,將進行系統初使化操作。系統初始化頁面運行結果如圖18.31所示。
圖18.31 系統初始化頁面運行結果
18.14.1 創建系統初始化模塊的業務邏輯類
創建系統初始化模塊的業務邏輯類SysDAO,將其保存在com.dao包中,該類主要用于清空系統中的除用戶信息表以外的所有數據表和刪除用戶信息表中除超級用戶mr以外的全部用戶。值得注意的是:在刪除存在關聯關系的數據表時,需要先刪除子表信息,再刪除主表信息,否則將發生錯誤。
系統初始化模塊的業務邏輯類SysDAO的關鍵代碼如下。
例程18-136:光盤\mr\18\MaterialManage\src\com\action\SysDAO .java
public class SysDAO {
public SysDAO(){
}
private Session session = null;
public int sysinitialize(){
session = MySession.openSession(); //打開Session
Transaction tx = null;
int rtn = 0;
try {
tx=session.beginTransaction();
//刪除用戶信息
session.createQuery("DELETE UserForm where name<>'mr'").executeUpdate();
session.createQuery("DELETE GetUseForm").executeUpdate(); //清空部門領用信息表
session.createQuery("DELETE DamageForm").executeUpdate(); //清空部門報損信息表
session.createQuery("DELETE CheckForm").executeUpdate(); //清空審核信息表
session.createQuery("DELETE InStorageForm").executeUpdate(); //清空入庫信息表
session.createQuery("DELETE StockDetailForm").executeUpdate(); //清空采購明細表
session.createQuery("DELETE StockMainForm").executeUpdate(); //清空采購主表
session.createQuery("DELETE ProviderForm").executeUpdate(); //清空供應商信息表
session.createQuery("DELETE LoanForm").executeUpdate(); //清空物資借出信息表
session.createQuery("DELETE StorageForm").executeUpdate(); //清空庫存信息表
session.createQuery("DELETE BranchForm").executeUpdate(); //清空部門信息表
session.createQuery("DELETE GoodsForm").executeUpdate(); //清空商品信息表
rtn=1;
tx.commit();
}catch(Exception e){
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
System.out.println("系統初使化時的錯誤信息:"+e.getMessage());
rtn=0;
} finally {
MySession.closeSession(session);
}
return rtn;
}
}
18.14.2 系統初始化頁面設計
系統初使化模塊共包括兩個JSP頁面,一個是用于顯示提示信息的initialize.jsp,另一個是用于執行系統初使化操作的處理頁initialize_deal.jsp。由于initialize.jsp頁面比較簡單,此處不作介紹,下面介紹如何實現initialize_deal.jsp頁。
在執行系統初使化操作的處理頁initialize_deal.jsp中,首先使用<jsp:useBean>動作指令生成SysDAO類的一個實例對象sysDAO,然后通過該實例對象調用SysDAO類的sysinitialize()方法,最后根據返回結果顯示相應的提示信息,具體代碼如下。
例程18-137:光盤\mr\18\MaterialManage\defaultroot\initialize_deal.jsp
<%@ page contentType="text/html; charset=gb2312" language="java"%>
<jsp:useBean id="sysDAO" class="com.dao.SysDAO" scope="request"/>
<%
int rtn=sysDAO.sysinitialize();
if(rtn==0){
out.println("<script>alert('系統初使化失敗!');window.location.href='initialize.jsp';</script>");
}else{
out.println("<script>alert('系統初使化成功!\\r當前系統中只有mr一個用戶,請重新登錄!');window.
location.href='index.jsp'</script>");
}
%>
18.15 疑難問題分析與解決
18.15.1 在Struts中解決中文亂碼
通常情況下解決中文亂碼采用的是編寫一個將ISO-8859-1編碼轉換為gb2312編碼的方法,然后在出現亂碼的位置調用該方法即可達到解決中文亂碼的目的,但是這樣做很不方便。Struts提供了一個快速解決中文亂碼的方法,那就是通過配置和擴展RequestProcessor類實現。下面將詳細介紹在Struts中解決中文亂碼的方法。
(1)創建SelfRequestProcessor.java類文件,該類繼承了RequestProcessor類,并重寫processPreprocess()方法,在該方法中設置Request對象的請求編碼為gb2312編碼,具體代碼如下。
例程18-138:光盤\mr\18\MaterialManage\src\com\action\SelfRequestProcessor.java
package com.action;
import org.apache.struts.action.RequestProcessor;
import javax.servlet.http.*;
import java.io.*;
public class SelfRequestProcessor extends RequestProcessor {
public SelfRequestProcessor() {
}
protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response){
try {
request.setCharacterEncoding("gb2312");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return true;
}
}
(2)在struts-config.xml文件中利用<controller>元素配置自定義控制器組件SelfRequest Processor,用于對請求的參數進行轉碼,具體代碼如下:
<controller processorClass="com.action.SelfRequestProcessor" />
配置<controller>元素主要是為了能讓Struts識別開發者自定義的控制器組件。
18.15.2 部門匯總模塊SQL語句解析
在部門匯總模塊中需要將部門領用信息和部門報損信息按部門進行匯總并統計各部門正在使用物資的數量和金額,這可以通過以下SQL語句實現:
select g.name,g.spec,g.unit,g.price,t.branchname,t.lyamount,t.bsamount,
(t.lyamount-t.bsamount) zyamount from tb_goods g inner join ( select goodsid,branchname,
sum(bsamount) bsamount,sum(lyamount) lyamount from(select getuse.goodsid,0 as bsamount,
sum(getuse.number) as lyamount,branch.name as branchname from tb_getuse getuse inner join
tb_branch branch on getuse.branchid=branch.id group by branch.name,getuse.goodsid
union select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,
branch.name as branchname from tb_damage damage inner join
tb_branch branch on damage.branchid=branch.id group by branch.name,damage.goodsid ) as t
group by goodsid,branchname) as t on g.id=t.goodsid
下面將對上面的SQL語句進行詳細的分析。
(1)查詢部門信息的SQL語句如下:
select * from tb_getuse
執行結果如圖18.32所示。
圖18.32 部門信息
(2)查詢部門領用信息的SQL語句如下:
select * from tb_getuse
執行結果如圖18.33所示。
圖18.33 部門領用信息
(3)通過INNER JOIN子句將部門領用信息表和部門信息表進行關聯,具體SQL語句如下:
select * from tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id
執行結果如圖18.34所示。
圖18.34 與部門信息表關聯后的部門領用信息
(4)根據部門名稱和物資ID對關聯后的部門領用信息進行分組并統計部門領用各物資的數量,具體SQL語句如下:
select getuse.goodsid,sum(getuse.number) as lyamount,branch.name as branchname from tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id group by branch.name,getuse.goodsid
執行結果如圖18.35所示。
(5)在步驟(4)中的SQL語句的輸出結果中添加一個新的列bsamount,該列的值均為0,具體SQL語句如下:
select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname from
tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id
group by branch.name,getuse.goodsid
執行結果如圖18.36所示。
圖18.35 分組統計后的信息 圖18.36 添加bsamount列后的信息
(6)查詢部門報損信息的SQL語句如下:
select * from tb_damage
執行結果如圖18.37所示。
圖18.37 部門報損信息
(7)通過INNER JOIN子句將部門報損信息表和部門信息表進行關聯,具體SQL語句如下:
select * from tb_damage damage inner join tb_branch branch on damage.branchid=branch.id
執行結果如圖18.38所示。
圖18.38 與部門信息表關聯后的部門報損信息
(8)根據部門名稱和物資ID對關聯后的部門報損信息進行分組并統計部門報損各物資的數量,具體SQL語句如下:
select damage.goodsid,sum(damage.damagenum) as bsamount,branch.name as branchname from
tb_damage damage inner join tb_branch branch on damage.branchid=branch.id group by
branch.name,damage.goodsid
執行結果如圖18.39所示。
圖18.39 分組統計后的信息 圖18.40 添加lyamount列后的信息
(9)在步驟(8)中的SQL語句的輸出結果中添加一個新的列lyamount,該列的值均為0,具體SQL語句如下:
select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,
branch.name as branchname from tb_damage damage inner join
tb_branch branch on damage.branchid=branch.id group by branch.name,damage.goodsid
執行結果如圖18.40所示。
(10)通過UNION子句將步驟(5)和步驟(9)的結果合并,具體SQL語句如下:
select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname from
tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id group by
branch.name,getuse.goodsid
union
select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,
branch.name as branchname from tb_damage damage inner join
tb_branch branch on damage.branchid=branch.id group by branch.name,damage.goodsid
執行結果如圖18.41所示。
(11)對步驟(10)的合并結果進行分組統計,具體SQL語句如下:
select goodsid,branchname,sum(bsamount) bsamount,sum(lyamount) lyamount from(
select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname from
tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id group by
branch.name,getuse.goodsid
union
select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,branch.name as branchname
from tb_damage damage inner join tb_branch branch on damage.branchid=branch.id
group by branch.name,damage.goodsid
) as t group by goodsid,branchname
執行結果如圖18.42所示。
圖18.41 合并后的結果 圖18.42 分組統計后的結果
(12)將步驟(10)的分組統計結果與物資信息表tb_goods通過INNER JOIN子句進行關聯,具體SQL語句如下:
select g.name,g.spec,g.unit,g.price,t.branchname,t.lyamount,t.bsamount from tb_goods g inner join (
select goodsid,branchname,sum(bsamount) bsamount,sum(lyamount) lyamount from(
select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname from
tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id group by
branch.name,getuse.goodsid
union
select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,branch.name as branchname
from tb_damage damage inner join tb_branch branch on damage.branchid=branch.id
group by branch.name,damage.goodsid
) as t group by goodsid,branchname
) as t on g.id=t.goodsid
執行結果如圖18.43所示。
圖18.43 分組統計后的結果
(13)在步驟(12)的分組統計結果的基礎上添加一個新的輸出列zyamount,該列的值為領用數量減去報損數量,即正在使用數量,具體SQL語句如下:
select g.name,g.spec,g.unit,g.price,t.branchname,t.lyamount,t.bsamount,(t.lyamount-t.bsamount) zyamount
from tb_goods g inner join (
select goodsid,branchname,sum(bsamount) bsamount,sum(lyamount) lyamount from(
select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname from
tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id group by
branch.name,getuse.goodsid
union
select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,branch.name as branchname
from tb_damage damage inner join tb_branch branch on damage.branchid=branch.id
group by branch.name,damage.goodsid
) as t group by goodsid,branchname
) as t on g.id=t.goodsid
執行結果如圖18.44所示。
圖18.44 最后執行結果