摘 要 這篇文章研究了在校園網環境下合理利用原有異構數據庫建立相關的部門管理系統的方法,介紹了基於WebLogic應用服務器進行教材綜合管理系統的設計和實現的過程。
關鍵詞 數據庫;J2EE; EJB;WebLogic
引 言
隨著科學技術的不斷提高,計算機網絡的功能已為人們深刻認識,它已進入人類社會的各個領域並發揮著越來越重要的作用。同樣各類學校的校園網也運行了多個年頭,但還有不少學校的管理系統缺少統一規劃,單機運行的信息孤島還為數不少,所以有必要進一步研究在校園網環境下合理利用原有異構數據庫建立相關部門的管理系統的方法。
在某高校中教務和教材倉庫都已經有了各自獨立的數據庫管理系統,但教材選訂等工作都是人工進行,工作人員的勞動量,效率很低。校園網環境下利用現有的資源建立教材綜合管理系統之必要性是不言而喻的!本文介紹基於WebLogic應用服務器進行教材綜合管理系統的設計和實現的過程。
系統結構
系統包含教材選取、查詢、修改、訂購子系統,系統所需的教務信息和教材庫存信息來自網上原有數據庫,如圖1所示。其中,教研室通過B/S模式可以進行教材選取、查詢、修改等工作,教材管理在教材委員會通過C/S模式本地完成,主要是教材訂購及系統管理工作。
教材綜合管理系統的設計與實現
1、數據庫設計
其中數據庫系統中包含教務處數據庫(舊)、倉庫數據庫(舊)和教材委員會數據庫(新),充分利用了原有的資源達到共享數據的目的,用到的表有教務處的課程安排表、專業人數表,倉庫的庫存量表。
教務處專業人數表:
列名 數據類型 長度 允許為空 id Bigint 8 否 num int 4 是教務處課程安排表:
列名 數據類型 長度 允許為空 id Bigint 8 否 cid Int 4 否 cname Varchar 50 是 teachunit Varchar 50 是 sname Varchar 50 是倉庫庫存量表:
列名 數據類型 長度 允許為空 bid Int 4 否 bname Varchar 50 是 bnote Varchar 50 是 bauthor Varchar 50 是 bpublisher Varchar 50 是 bprice Float 8 是 bnum Int 4 是
教材委員會對教材的選定、訂購進行統一管理,它擁有一個本地數據庫即教材委員會數據庫,在這個新進的數據庫中有三張表,一張用於教材選定後的數據的存儲,一張用於訂單的內容的存儲,第三張是教研室登陸密碼的信息存儲。
選教材表:
列名 數據類型 長度 允許為空 cid Int 4 否 bid Int 4 是 cname Varchar 50 是 bname Varchar 50 是 teachunit Varchar 50 是訂單表:
列名 數據類型 長度 允許為空 id Bigint 8 否 bname Varchar 50 是 numneed Int 4 是密碼表:
列名 數據類型 長度 允許為空 teachunit Varchar 50 否 pw Char 10 是它們都是J2EE中的底層結構,WebLogic應用服務器層把底層數據庫連接起來需要配置數據池和數據源。
2、數據池和數據源配置
由於數據庫系統中有三個數據庫,所以進行WebLogic連接池配置時需要配置三個連接池,這裡進入WebLogic的控制台頁面,以配置的第一個連接池,教務數據庫連接池(如圖2)為例。其中最為關鍵的是在URL和Driver中運用對應數據庫類別的驅動,並填寫要訪問的數據庫名稱,數據庫服務器的地址和端口。
圖2 連接池配置
倉庫數據庫的URL為:“jdbc:oracle:CK:@localhost:1521”
Driver為:“oracle.jdbc.drive.OracleDriver”
教材委員會的URL為:“jdbc:weblogic:mssqlserver4:[email protected]:1057”
Driver為:“weblogic.jdbc.mssqlserver4.Driver”
然後配置數據源,根據數據池名,定義數據源的JNDI名。這樣就把分布在不同地域的三個數據庫在WebLogic中連接起來,並成功屏蔽了數據庫軟件的類別、版本、地域等差別,其中教務處數據源配置如圖3:
圖3 數據源配置
3、建立實體EJB
系統要對三個異地數據庫共六張表,進行操作,因此要逐個引進並建立相應的實體Bean,這裡將三個數據庫中本系統要用到的的表都引進到同一個EJB Module中。
在JBuilder中生成的實體Bean中會自動識別並生成對應表的名稱,數據段的名稱、屬性,根據程序員設置的本地或遠程的home接口文件,封裝了操作數據庫的基本動作,如通過主鍵查找記錄的功能,在查找到的記錄中得到和設置數據項的函數等,為了後面子系統的需要還要添加一些函數:
在課程安排表Entity Bean中添加兩個Finder:
一個finder名為findall,功能是得到教務數據庫課程安排表的所有信息。將要在往選教材表中寫入所有課程信息時使用。
另一個名為findbycid,功能是根據輸入的課程信息找到選了這些課程的專業。
在選教材表中添加兩個Finder:
一個名為findall,為了得到所有的選教材表的信息。
另一個名為findbybid,功能是得到輸入教材號所對應的專業好。
在Baobiao中添加一個Finder為 findall,得到所有訂單表裡的信息。
這樣就完成了本系統實體bean的建立。
4、建立會話EJB
使用會話bean 可對某一客戶的處理或控制對象建模,對工作流、任務和管理活動等建模,協調多個實體bean,控制實體bean之間的交互將業務應用邏輯從客戶端轉移到服務器端,本系統考慮到數據不是特別龐大。僅用了具有遠程接口的一個無狀態會話EJB(connectEJBs)完成所有與實體EJB打交道的任務。
為了系統功能的需要,在其中添加了6個私有變量,6個公有變量,初始化後用以訪問六張表對應的實體EJB。初始化代碼為:
try{
Context context=new InitialContext();
Object ref=context.lookup("java:/comp/env/Coursearrangement");
crthome=(CoursearrangementHome) ref;
ref=context.lookup("java:/comp/env/Xk");
xkhome=(XkHome) ref;
ref=context.lookup("java:/comp/env/Tp");
tphome=(TpHome) ref;
ref=context.lookup("java:/comp/env/Number");
numberhome=(NumberHome) ref;
ref=context.lookup("java:/comp/env/Ck");
ckhome=(CkHome) ref;
ref=context.lookup("java:/comp/env/Baobiao");
baobiaohome=(BaobiaoHome) ref;
}catch(Exception e){e.printStackTrace();}
這樣就能通過會話EJB的遠程接口訪問實體EJB裡自動生成的和自己添加的方法或函數了,前提是這個方法或函數包含在實體EJB的home接口裡。
還添加了一些本地公有函數和多個遠程公有函數,用來修改或訪問實體EJB並作初步的處理。增加的函數必須在JBuilder中先右擊代表會話Bean的圖形添加方法(add method),設置各項參數後方可右擊會話Bean選擇View Bean Sourse菜單,進入代碼區編輯方法主體,否則工程將產生編譯錯誤。這裡提供了整個系統所需的與數據庫打交道的函數,這些接口在後文中都有用到。
3個本地公有函數:為了解決不能連續在同一個函數裡多次寫入信息而獨立出來的函數
①public void writecidcname(Integer cid, String cname, String teachunit)
這是往選教材表寫課程信息。
②public void writebook(Integer bid, String bname)
這時保教材信息寫入訂單表。
③public void writealltp(String unit, String pw)
同理,為了往密碼表裡寫入密碼信息而編寫。
遠程公有函數:以下的函數是訂單子系統要用到的接口
⑴public java.util.Collection couinfo()
這個函數是負責從教務處得到開設課程的信息。返回值是Collection對象。
⑵public boolean writexk(java.util.Collection rst)
這個函數在運行訂單子系統自動調用。它負責在初始化系統時將從教務處得到的課程信息寫進選教材表中,保證既使新增了新的教研室也能實時地獲得。它的參數就是函數zhuanyi()的返回值,在程序主體調用了本地函數①。
⑶public java.util.Collection selectunit()
這個函數是為了從選教材表中得到所有開設了課程的教研室的名稱。既為了在B/S的登錄界面上得到教研室名下拉框的需要,又為了在密碼表中得到教研室名而編寫。注意這裡有重復信息,需要再調用它的函數中過濾掉。
⑷public boolean writetp(Collection rst, String pw)
這是為了建立教研室密碼表而編寫,在函數⑵後調用,當表中沒有教研室或是有了新的教研室的時候,它會自動加到密碼表中並分配原始密碼。是教員能登陸再現的教材錄入子系統。
⑸public boolean reflushbaobiao()
這是C/S界面用戶刷新訂單信息時,將選教材表中的已經選了的教材信息寫進訂單表中。它在獲得相應教材應定的數量之前調用。
●這以下是為了獲得訂單中所需要訂購的書的數目而寫的函數,因為不能在一個函數中操作多個數據庫,所以用了下面多個函數以實現。
得到訂單表裡所有的教材號:
public Collection readbaobiaoforgetnum()
從選教材表中得到已經選好的課本對應的課程號:
public Integer readxkforgetnum(Integer bid)
再從教務處課程安排表中得到開了這個課程號所代表的課程的專業,可能不止一個:
public Collection readcouforgetnum(Integer cid)
然後從教務處人數表中查到這些專業的人數:
public Integer readnumforgetnum(Long id)
再找出倉庫裡這本書的庫存量,如果所需數量大於庫存量,就要在訂單中顯示出定購量:
public Integer readckforgetnum(Integer bid, int numall)
○●○此以下的函數為教員在線教材選取和相關單位查詢要用到的函數。
⑴public String login(String unit)
這在用戶登陸時系統檢查密碼是否匹配時使用,就是根據用戶名查詢到相應的密碼並返回。在用戶修改密碼時驗證是否為登陸用戶也用到了它。
⑵public String login(String unit)
這個函數從名字得知,是用戶登陸時系統檢查密碼是否匹配時使用的,就是根據用戶名查詢到相應的密碼並返回。在用戶修改密碼時驗證是否為登陸用戶也用到了它。
⑶public boolean writein(Integer cid, Integer bid, String name)
這個函數是用戶填寫了課程信息後將這些信息寫入到相應的數據庫記錄中。
⑷public boolean setpw(String unit, String pw)
此函數在用戶修改密碼時使用的。
⑸public boolean isbooksame(Integer bid)
此函數是用戶填寫教材信息是否重復輸入,或是輸入了別的課程已經選取的教材時判斷用的,防止數據庫主鍵重復插入。
⑹public Object getbidname(Integer cid)
這是為了教研室查詢已選教材准備的接口,為選取教材提供參考。
5、訂單子系統
為了實現教材委員會對整個教材選取系統的控制,得到教材訂單報表,本系統在 C/S端達到上述目的。它是不發布的,是教材委員會的本地客戶端,其中的訂單界面如圖4。
圖4 訂單子系統中的訂單界面
系統啟動時,將自動從教務處數據庫取得將要開設的課程信息,添入教材委員會數據庫的選教材表中,空出與之對應的教材信息等待教研室教員理用B/S端加進去。核心代碼:
conhome= (connectEJBsHome) PortableRemoteObject.narrow(ref, connectEJBsHome.class);
try
{
con=conhome.create();
if(con.writexk(con.zhuanyi()))
{
System.err.print("你已成功轉移了數據!");
}
}catch(Exception ex)
{
ex.printStackTrace();
System.err.print("數據轉移失敗!");
}
它得到會話Bean的home接口,將會話Bean的方法couinfo()得到的課程信息再調用writexk()寫入到選教材表中,等待教研室選取教材,然後為教研室分配原始密碼888888。核心代碼:
try
{
con=conhome.create();
if(con.writetp(con.zhuanyi(),”888888”)
{
System.err.print("密碼分配成功!");
}
}catch(Exception ex)
{
ex.printStackTrace();
System.err.print("密碼分配失敗!");
}
當按下“刷新訂單”按鈕之後,下面的列表框將呈現需要訂購的教材的信息,包括書名和書的ISBN號和訂購數量。實現代碼為:
conhome= (connectEJBsHome) PortableRemoteObject.narrow(ref, connectEJBsHome.class);
try {
con=conhome.create();
if(con.writebaobiao())
{
System.err.print("得到報表數據!");
if(this.getnum())
{
System.err.print("取到了書的數目!");
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
System.err.print("生成報表失敗!");
}
其中writebaobiao()將用到會話EJB中的專門為得到訂購書本數目而寫的一系列函數,這裡不贅述。
6、教材選取系統
教材選取是一個在線系統。核心部分全部用JSP制作,借助Dreamweavre4開發JSP將會十分便利。本系統沒選擇applet做界面是考慮到安全性需要,applet需要將程序下再到客戶端執行,它實際上是一種可用網頁打開的C/S,破壞了三層結構瘦客戶端的優點,但在實現不涉及安全性的部分可以考慮使用。本系統的選取界面如圖5所示。
圖5教材選取系統的選取界面
這裡共有五張JSP頁面是在線教材選取系統的主要部分。一些jsp頁面直接使用同一個JavaBean,增強了代碼的復用性,如登陸頁面與密碼修改頁面同用pwbean的Javaean。為了使大多數邏輯在會話EJB中實現,JavaBean作為JSP的一部分要短小精干。login.jsp為登錄界面,可自動獲得教務處所有教研室名稱,通過教材委員會分配的密碼登陸select.jsp,選擇教材。到了select.jsp後,網頁自動獲得登陸教研室所負責的課程,這裡給了兩個文本框,讓教員輸入他認為合適的書本的統一編號和名稱,當然這裡是以編號為唯一標識的,成功後會出現成功頁面success.jsp。在這裡還有教研室可以修改密碼的導航按鈕, 轉換到修改密碼的界面pwchange.jsp,這裡需要輸入原來的登陸密碼,輸入兩次新密碼才能真正修改密碼。修改成功後會出現成功界面。密碼在教材委員會數據庫裡,在這裡完完全全體現了JSP的安全性。
至此,核心功能已實現,其他單位的查詢浏覽等功能略去。
利用JBuilder開發系統的好處是許多功能由系統自動完成。上述工作完成後,只需工程部分打包成EAR(Enterprise Archive)。在JBuilder中將Tools->Enterprise Deploy配置好服務器地址、端口,用戶名密碼,系統自動將web應用部署信息寫進部署描述文件web.xml中,要做的只是右擊工程發布即可。