《 《Java 程序設計》課程設計報告書
課題名稱 于 基于 Java 的教師檔案管理系統的設計
姓 姓
名
學 學
號
學 學
院
專 專
業
指導教師
2016 年 6 月 28 日
一、設計任務及要求:
1. 采用 B/S 模式進行開發,其優點是后臺與前臺處理層次分明,而且符合眾多已經習慣網頁方式的用戶。
2. 采用面向對象的開發與設計理念。運用面向對象技術的前提是對整體系統的高度和準確抽象,通過它可以保證系統良好的框架,進而帶來產品較強的穩定性和運行效率。
3. 采用模塊化設計。模塊化設計要求將整個系統劃分成基于小的模塊,有利于代碼的重載,簡化設計和實現過程。
4. 簡單方便的系統界面。設計簡單友好的系統界面,方便用戶較快的適應系統的操作。
5.速度優先原則。由于此工具最重要的評測標準就是速度,因此在設計過程中,具體過程盡量做到資源占用少,速度快。
6.設計既要突出重點,又要細致周到。要符合設計需求,在有可能改進的地方進行擴充,使系統更適應用戶的需要。
指導教師簽名:
年
月
日
二、指導教師評語:
指導教師簽名:
年
月
日
三、成績
驗收蓋章
年
月
日
于 基于 Java 的教師檔案管理系統系統 設計 譚維雋
1 1 設計目的
長久以來,教職工的管理工作大多數都采用的是傳統的手工方式來記錄相關信息,這種管理方式存在很多缺點,比如說,教職工信息、工資信息的錄入,查詢,更新,分析都要完全依賴管理人員的手工記錄和人工分析,人工記錄是相當麻煩的。為滿足需求,決定采用各種編程語言 JSP 開發了基于 B/S 架構的教師檔案管理系統,教師檔案管理系統是涉及信息科學、數據計算和計算機技術的復雜的人機交互系統。通過這些系統,可以對教職工和管理進行智能化管理,有效地記錄并查詢教職工的各項情況,為管理者提供了諸多方便。
2 2 設計的主要內容和要求
1 2.1 數據庫的邏輯結構設計
我們知道,數據庫概念模型獨立于任何特定的數據庫管理系統,因此,需要根據具體使用的數據庫管理系統的特點進行轉換。即轉化為按計算機觀點處理的邏輯關系模型,E-R 模型向關系數據庫模型轉換應遵循下列原則:
*每一個實體要轉換成一個關系 *所有的主鍵必須定義非空(NOT NULL)
*對于二元聯系應按照一對多、弱對實、一對一、多對多等聯系來定義外鍵。
根據 E-R 模型,教師檔案管理系統建立了以下邏輯數據結構,下面是各數據表的詳細說明。
?。?)教師信息表主要是記錄了教師的基本信息。表結構如表 2.1 所示。
表 2.1 教師信息表(t_jaoshi)
列名 數據類型 長度 允許空 是否主鍵 說明 id int 4 否 是
ID gonghao varchar 50 否 否
教師號 xingming varchar 50 否 否
姓名 xingbie varchar 50 否 否 性別 nianling varchar 20 否 否 年齡 shengri varchar 20 否 否 出生日期 gongzuo varchar 50 否 否 工作時間 zhuanye varchar 50 否 否 專業 zhaopian varchar 50 否 否 照片 beizhu varchar 50 否 否 備注信息 (2) 工資信息表主要是記錄了教職工工資的基本信息。表結構如表 2.2 所示。
表 2.2 工資信息表(t_gongzi) 列名 數據類型 長度 允許空 是否主鍵 說明 id int 4 否 是
ID jsid varchar 50 否 否
教師 ID riqi varchar 50 否 否
工資月份 gongzi varchar 50 否 否
工資數 jiangjin varchar 20 否 否
獎金 (3)管理員信息表主要記錄的管理員的賬號信息,包括用戶名和密碼,表結構如表 2.3 所示。
表 2.3 管理員信息表(t_admin) 列名 數據類型 長度 允許空 是否主鍵 說明 userId int 4 否 是 編號 userName varchar 50 否 否 用戶名 userPw varchar 50 否 否 密碼
2 2.2 數據庫的連接原理
采用 JDBC 連接數據庫的方式,只需在工程中導入對應數據庫的 jar 包,就可以方便的對數據庫進行連接,在程序中,用 Class.forName()方法來加載驅動程序,在用 DriverManager 的 getConnection()方法就可以創建一個數據庫連接。程序采用的是 DAO 模式來操作數據庫,DAO(Data Access Object,數據訪問對象),是Java 編程中的一種經典模式,已被廣泛應用,也是 J2EE 架構中持久層框架的基礎知識,基于分層次式的軟件架構來實現對數據庫的訪問操作。DAO 模式的主要思想就是從抽象數據源獲取與操縱數據的方法。抽象數據的含義就是編寫應用程序的程序員不必關心數據庫的物理位置,已經是何種數據庫,只需使用封裝數據庫中表示記錄的數據對象即可。其思想如圖 2.4 所示:
圖 2.4
DAO 模式類圖
圖中 BussinessObject 是業務對象,是使用 DAO 模式的客戶端;DataTransferObject 數據傳輸對象,在應用程序不同層次之間傳輸對象,在一個分布式應用程序中,通??梢蕴岣哒淼男阅?;DataObjectAcces 數據輸入/輸出對象封裝了對數據源的一些基本操作;DataSource 指的是數據源??梢詮膱D中看出,DAO 模式分離了業務邏輯和數據羅即將,是的編寫的軟件具有良好的層次式體系結構。本系統為了方便數據庫的操作,主要使用 DBContent 的對象來接一個數據庫(建立一個類 DBContent),代碼如代碼 1。
3 2.3 系統功能實現
在管理信息系統的生命周期中,僅過了需求分析、系統設計等階段之后,便開始了系統實施階段。在系統分析和設計階段,系統開發工作主要是集中在邏輯、BusinessObject DataAccessObject DataSource DataTransferObject 使用 封裝 創建/使用 獲取/修改
功能和技術設計上,系統實施階段要繼承此前面各個階段的工作成果,將技術設計轉化為物理實現,因此系統實施的成果是系統分析和設計階段的結晶。
1 2.3.1 系統登陸頁
1.描述:為了保證系統的安全性,要先使用本系統必須先登陸到系統中。
2.在登陸頁面輸入用戶名和密碼以,選擇登陸身份后,點擊提交按鈕,跳轉到登陸的 service 中,在該 service 中會對用戶名,密碼,驗證碼進行判斷,并根據相應的用戶角色進入對應的頁面,代碼如代碼 2。
2 2.3.2 系統主頁面
1.描述:管理員主頁面:左方頁面展示了管理員可操作的七大功能,進入相關的管理頁面可以鏈接到子菜單,并且高亮顯示,每個管理模塊下面都有相應的子菜單。
2.在每個 jsp 頁面將會對相關用戶進行攔截操作,這樣可以提高安全性,防止用戶不經過登陸頁面而進入任何子菜單頁面,如代碼 3:
3 2.3.3 教職工信息管理
?。?)教職工錄入 1.描述:管理員輸入教職工相關正確信息后點擊錄入按鈕,如果是沒有輸入完整的信息,都會給出相應的錯誤提示,不能錄入成功。輸入數據都通過 form表單中定義的方法 onsubmit="return checkForm()"來檢查,checkForm()函數中是各種的校驗輸入數據的方式。
2.流程圖如下圖 4 所示:
?。?)教職工管理 1.描述:管理員點擊左側的菜單“教職工管理”,頁面跳轉到做教職工界面,調用后臺的 servlet 類查詢所有教職工的信息。
2.教職工管理關鍵代碼如代碼 4:
4 2.3.4 工資信息管理
?。?)工資錄入 1.描述:在此頁面主要是輸入工資數、獎金等信息,然后選擇教職工,所有信息都不能夠為空,是否為空也是通過 form 表單中的 onsubmit="return
checkForm()來檢查。
?。?)工資信息管理 1.描述:管理員點擊左側的菜單“工資管理”,頁面跳轉到工資管理界面,調用后臺的 gongziServlet 類查詢出所有的工資信息,并把這些信息封轉到數據集合 List 中,綁定到 request 對象,然后頁面跳轉到相應的 jsp,顯示出來。
2.工資管理關鍵代碼代碼 5:
?。?)修改個人密碼 1.描述:輸入用戶名和用戶的原有密碼,輸入新密碼以后點擊修改按鈕即可修改密碼成功。
?。?)安全退出系統 1.描述:點此按鈕回到系統的主頁面。
2.關鍵代碼如代碼 6。
3 整體設計方案
4 流程圖設計
圖 4 教職工錄入流程圖
管理員錄入教職工信息 系統驗證教職工信息 錄入成功 結 束 通過 未通過 登陸系統
5 程序設計
代碼 1:
public DBContent(){
String CLASSFORNAME="com.SqlServer.jdbc.Driver";//連接數據庫的驅動
String url="jdbc:SqlServer://localhost:3306/jzggl";
String user="root";//連接數據庫的用戶名
String password="root";//連接數據庫的密碼
try{
Class.forName(CLASSFORNAME);
con= DriverManager.getConnection(url,user,password);//加載數據庫的驅動
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(Exception ex){
ex.printStackTrace();
}
}
代碼 2 public String login(String userName,String userPw,int userType) {
try
{
Thread.sleep(700);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
String result="no";
if(userType==0)//系統管理員登陸
{
String sql="from TAdmin where userName=? and userPw=?";
Object[] con={userName,userPw};
List adminList=adminDAO.getHibernateTemplate().find(sql,con);
if(adminList.size()==0)
{
result="no";
}
else
{
WebContext ctx = WebContextFactory.get();
HttpSession session=ctx.getSession();
TAdmin admin=(TAdmin)adminList.get(0);
session.setAttribute("userType", 0);
session.setAttribute("admin", admin);
result="yes";
}
}
if(userType==1)
{
}
if(userType==2)
{
}
return result;
}
代碼 3 if(session.getAttribute("user")==null) {
out.print("<script>alert(" 請 先 登 錄 !");window.open("../index.jsp","_self")</script>");
}
代碼 4 public void jihuayuanAdd(HttpServletRequest req,HttpServletResponse res) public void jiaoshiDel(HttpServletRequest req,HttpServletResponse res)
{
int id = Integer.parseInt(req.getParameter("id"));
String del = "yes";
String sql = "update t_jiaoshi set del=? where id=?";
Object[] params={del,id};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "教師信息刪除成功!");
req.setAttribute("path", "jiaoshi?type=jiaoshiMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void jiaoshiUpd(HttpServletRequest req,HttpServletResponse res)
{
int id = Integer.parseInt(req.getParameter("id"));
String gonghao = req.getParameter("gonghao");
String xingming = req.getParameter("xingming");
String xingbie = req.getParameter("xingbie");
String nianling = req.getParameter("nianling");
String shengri = req.getParameter("shengri");
String gongzuo = req.getParameter("gongzuo");
String zhuanye = req.getParameter("zhuanye");
String zhaopian = req.getParameter("zhaopian");
String beizhu = req.getParameter("beizhu");
String sql = "update t_jiaoshi set gonghao=?,xingming=?,xingbie=?,nianling=?,shengri=?,gongzuo=?,zhuanye=?,zhaopian=?,beizhu=? where id=?";
Object[] params={gonghao,xingming,xingbie,nianling,shengri,gongzuo,zhuanye,zhaopian,beizhu,id};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "教師信息修改成功!");
req.setAttribute("path", "jiaoshi?type=jiaoshiMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void jiaoshiAdd(HttpServletRequest req,HttpServletResponse res)
{
String gonghao = req.getParameter("gonghao");
String xingming = req.getParameter("xingming");
String xingbie = req.getParameter("xingbie");
String nianling = req.getParameter("nianling");
String shengri = req.getParameter("shengri");
String gongzuo = req.getParameter("gongzuo");
String zhuanye = req.getParameter("zhuanye");
String zhaopian = req.getParameter("zhaopian");
String beizhu = req.getParameter("beizhu");
String del = "no";
String sql = "insert into t_jiaoshi (gonghao,xingming,xingbie,nianling,shengri,gongzuo,zhuanye,zhaopian,b
eizhu,del)" +
" values (?,?,?,?,?,?,?,?,?,?)";
Object[] params={gonghao,xingming,xingbie,nianling,shengri,gongzuo,zhuanye,zhaopian,beizhu,del};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "教師信息添加成功!");
req.setAttribute("path", "jiaoshi?type=jiaoshiMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void jiaoshiMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List jiaoshiList=new ArrayList();
String sql="select * from t_jiaoshi where del="no"";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
TJiaoshi jiaoshi=new TJiaoshi();
jiaoshi.setId(rs.getInt("id"));
jiaoshi.setGonghao(rs.getString("gonghao"));
jiaoshi.setXingming(rs.getString("xingming"));
jiaoshi.setXingbie(rs.getString("xingbie"));
jiaoshi.setNianling(rs.getString("nianling"));
jiaoshi.setShengri(rs.getString("shengri"));
jiaoshi.setGongzuo(rs.getString("gongzuo"));
jiaoshi.setZhuanye(rs.getString("zhuanye"));
jiaoshi.setZhaopian(rs.getString("zhaopian"));
jiaoshi.setBeizhu(rs.getString("beizhu"));
jiaoshiList.add(jiaoshi);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("jiaoshiList", jiaoshiList);
req.getRequestDispatcher("admin/jiaoshi/jiaoshiMana.jsp").forward(req, res);
}
代碼 5 public void gongziAdd(HttpServletRequest req,HttpServletResponse res) {
int jsid = Integer.parseInt(req.getParameter("jsid"));
String riqi = req.getParameter("riqi");
String gongzi = req.getParameter("gongzi");
String jiangjin = req.getParameter("jiangjin");
String sql = "insert into t_gongzi (jsid,riqi,gongzi,jiangjin) values (?,?,?,?)";
Object[] params={jsid,riqi,gongzi,jiangjin};
DB mydb=new DB();
mydb.doPstm(sql, params);
mydb.closed();
req.setAttribute("message", "教師工資添加成功");
req.setAttribute("path", "gongzi?type=gongziMana");
String targetURL = "/common/success.jsp";
dispatch(targetURL, req, res);
}
public void jsList(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List jiaoshiList=new ArrayList();
String sql="select * from t_jiaoshi where del="no"";
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
TJiaoshi jiaoshi=new TJiaoshi();
jiaoshi.setId(rs.getInt("id"));
jiaoshi.setGonghao(rs.getString("gonghao"));
jiaoshi.setXingming(rs.getString("xingming"));
jiaoshi.setXingbie(rs.getString("xingbie"));
jiaoshi.setNianling(rs.getString("nianling"));
jiaoshi.setShengri(rs.getString("shengri"));
jiaoshi.setGongzuo(rs.getString("gongzuo"));
jiaoshi.setZhuanye(rs.getString("zhuanye"));
jiaoshi.setZhaopian(rs.getString("zhaopian"));
jiaoshi.setBeizhu(rs.getString("beizhu"));
jiaoshiList.add(jiaoshi);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("jiaoshiList", jiaoshiList);
req.getRequestDispatcher("admin/gongzi/jsList.jsp").forward(req, res);
}
public void toAddGz(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
TJiaoshi jiaoshi=new TJiaoshi();
int jsid = Integer.parseInt(req.getParameter("jsid"));
String sql="select * from t_jiaoshi where id = ?";
Object[] params={jsid};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
jiaoshi.setId(rs.getInt("id"));
jiaoshi.setGonghao(rs.getString("gonghao"));
jiaoshi.setXingming(rs.getString("xingming"));
jiaoshi.setXingbie(rs.getString("xingbie"));
jiaoshi.setNianling(rs.getString("nianling"));
jiaoshi.setShengri(rs.getString("shengri"));
jiaoshi.setGongzuo(rs.getString("gongzuo"));
jiaoshi.setZhuanye(rs.getString("zhuanye"));
jiaoshi.setZhaopian(rs.getString("zhaopian"));
jiaoshi.setBeizhu(rs.getString("beizhu"));
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
GregorianCalendar gc = new GregorianCalendar();
String strDate = DateUtils.formatDate2Str(gc.getTime(), "yyyy-MM");
req.setAttribute("strDate", strDate);
req.setAttribute("jiaoshi", jiaoshi);
req.getRequestDispatcher("admin/gongzi/gzAdd.jsp").forward(req, res);
}
public void gongziMana(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
List gongziList = new ArrayList();
String riqi = req.getParameter("riqi")==null?"":req.getParameter("riqi");
String sql = "select tb.xingming,ta.* from t_gongzi ta,t_jiaoshi tb where ta.jsid=tb.id";
if(!("".equals(riqi))){
sql += " and ta.riqi = ""+riqi+""";
}
Object[] params={};
DB mydb=new DB();
try
{
mydb.doPstm(sql, params);
ResultSet rs=mydb.getRs();
while(rs.next())
{
TGongzi gongzi=new TGongzi();
gongzi.setId(rs.getInt("id"));
gongzi.setJsxm(rs.getString("xingming"));
gongzi.setRiqi(rs.getString("riqi"));
gongzi.setGongzi(rs.getString("gongzi"));
gongzi.setJiangjin(rs.getString("jiangjin"));
gongziList.add(gongzi);
}
rs.close();
}
catch(Exception e)
{
e.printStackTrace();
}
mydb.closed();
req.setAttribute("riqi", riqi);
req.setAttribute("gongziList", gongziList);
req.getRequestDispatcher("admin/gongzi/gongziMana.jsp").forward(req, res);
}
代碼 6 主要是通過 javascript 語句來實現, item_word[8][4]="退出系統"; item_link[8][4]="javascript:window.open("../index.jsp","_self")";
代碼 7
6 系統測試
6.1 系統測試目的與意義 系統測試是管理信息系統開發周期中一個十分重要而漫長的的階段。其重要性體現在他是保證系統質量與可靠性的最后關口,是對整個系統開發過程包括系統分析、系統設計和系統實現的最終審查。
系統測試的任務是盡可能徹底的檢查出程序中的錯誤,提高軟件系統的可靠性,其目的是檢驗系統“做得怎樣”。這這階段又可以分為三個步驟:模塊測試,
測試每個模塊的程序是否正確;組裝測試,測試模塊之間的接口是否正確;確認測試,測試整個軟件系統是否滿足用戶功能和性能的要求。測試發現問題之后要經過調試找出錯誤原因和位置,然后進行改正。是基于系統整體需求說明書的黑盒測試,應覆蓋系統隨偶聯合的部件,系統測試是正對整個產品系統進行的測試,目的是驗證系統是否滿足了需求規格的定義,找出需求規格不符合或與之矛盾的地方。
6.2 主頁面的登錄模塊測試 測試流程:
1.打開系統首頁,輸入錯誤的登錄信息
2.登錄
3.輸入正確的登錄信息
4.登錄
5.測試結果
模塊名稱 測試用例 預期結果 實際結果 是否通過 登錄模塊 用 戶 名 :
null
密碼:null
彈出錯誤提示,請輸入用戶名 登陸失敗,提示請輸入用戶名 通過 登錄模塊
用戶名:m1
密碼:null
彈出錯誤提示,請輸入密碼 失敗,提示輸入密碼 通過
登錄模塊
用戶名:m1
密碼:1
彈出錯誤提示,用戶名或者密碼錯誤 登陸失敗,提示用戶名或者密碼錯誤 通過
7 設計總結
本次課程設計將我大學所學的軟件工程理論知識用到了具體的實踐中去,深化了理論知識,同時也鍛煉了動手實踐能力。在這段日子里,我查閱了許多有關教師檔案管理信息系統的資料,翻閱了許多 JSP 的書籍,結合自己的經驗,詳細調查了教職工管理的工作內容與細節,開發設計了這個教師檔案管理系統,雖然企業每個學期都會有相應課程的課程設計和實訓來作為動手練習訓練,不過在本次畢業設計具體的實踐的時候還是遇到了很多小問題,比如說在 jsp 頁面將輸入
框設為不可用是添加屬性 readonly=“true”,而我在實際編程中卻錯寫成disable=“true”,這樣直接導致了 request 對象取不到數據,調試了程序很久才發現 request 對象獲得的返回值一直是空,之前一直以為是代碼哪里出了問題,總是在查源程序的邏輯。這些雖然都是小問題,但是由于不細心在具體實踐中卻浪費了不少時間,看來平時還是要多多實踐才是。
在系統的開發過程中,我運用到了 B/S 三層結構技術和自己在平時學習中掌握的一些技術,通過這些技術的實現,整個系統的性能得到了大大的提高。這些技術都在論文中做了比較詳細的介紹。本系統還存在許多的缺陷和不足之處,比如很多細節上做的還不行,有些功能模塊還應再加強。希望在以后的時間里,我可以把這些缺陷都彌補過來,進一步完善系統。
通過本次畢業設計我鍛煉了自己的自學、研究能力,也從中學到不少在企業在課堂上學不到的東西.通過實踐我也深刻的體會到軟件開發的艱辛及問題解決后的喜悅心情,培養我的獨立思考問題的能力,同時也增強了我的理論聯系實際的能力,這為自己以后的工作奠定了良好的基礎。
本系統可以在很大程度上減輕我校教職工管理人員的工作負擔,但由于時間按和技術條件的限制,還存在一些不足之處,有些功能還需要改進,還應該做進一步的系統調查需求分析工作,更深入的完善系統??傊?,一個緊跟時代步伐的真正使用的軟件必需有一個不斷完善改進的過程
參考文獻 [1]白秋產,高愛華,沈顯來.基于 VFP 的做工師傅教職工管理信息系統[J].計算機與數字工程,2006,34(01):143-145 [2]舒攀,陳金剛.數字化校園建設中教師檔案管理系統的實現與設計[J].武漢工程大學學報,2008,30(04):108-111 [3]徐超毅.教師檔案管理系統的面向對象分析[J].安徽理工大學學報(自然科學版),2005,25(03):62-64 [4]艾靈仙. 高校系級網站構建平臺的設計與實現[J]. 科技信息-2008年16期 [5]張國玉,牟宗國.加強和完善教職工管理工作探討[J].四川教育學院學報,2007,23(SI):19-20
[6]嚴勇杰.淺談如何加強高職院校教職工管理工作[J].科技信息,2008,(29):592-593 [7]吳漢龍.實在的系統,實在的效用—淺析浙江樹人大學教師檔案管理系統開發與試用[J].高校后勤研究,2009,20(4):94-97
[8] 許義金,鄭初華.教職工管理中心管理信息系統開發[J].南昌航空工業學院學報,2006,20(4):94-97 [9]J.M.Hellerstein,M.Stonebraker.Architecture of a Database System[J].Foundations and Trends in Databases,2007,1(2):141-259 [10]壽秀香.基于 C/S 結構的教職工管理信息系統的設計與實現[J].黑龍江科技信息,2008,(31):55
[11]張立科.java 信息系統管理開發[M].北京:人民郵電出版社. [12]鄧子云.JSP 網絡編程從基礎到實踐[M].北京:電子工業出版社. [13]朱濤江.SqlServer 權威指南[M].中國電力出版社.2003. [14]郝玉龍.JavaEE 編程技術[M].北京:北京交通大學出版社. [15](美)Bruce Eckel 著,陳昊鵬譯,Java 編程思想(第三版)[M].北京:機械工業出版社,2007.6 [16]李建中,王珊.《數據庫系統原理(第 2 版)》電子工業出版社.2004.9 [17]張長富,黃中敏.JavaScript 動態網頁編程實例手冊[M].北京:海洋出版社,2005:196-239 [18]艾靈仙. 高校系級網站構建平臺的設計與實現.[J]. 科技信息-2008 年 16期