第5章MVC框架開發(fā)基礎(chǔ)_第1頁
第5章MVC框架開發(fā)基礎(chǔ)_第2頁
第5章MVC框架開發(fā)基礎(chǔ)_第3頁
第5章MVC框架開發(fā)基礎(chǔ)_第4頁
第5章MVC框架開發(fā)基礎(chǔ)_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、5.1MVC基本思想基本思想5.25.3MVC關(guān)鍵技術(shù)關(guān)鍵技術(shù)MVC綜合開發(fā)實戰(zhàn)綜合開發(fā)實戰(zhàn)MVC把應(yīng)用程序分成3大基本模塊:模型(Model,簡稱M)、視圖(View,簡稱V)和控制器(Controller,簡稱C),它們(三者聯(lián)合即MVC)分別擔(dān)當(dāng)不同的任務(wù)。這幾個模塊各自的職能及相互關(guān)系,如圖5.1所示。5.2.1 DAO技術(shù)技術(shù)1DAO原理原理DAO(Data Access Object,數(shù)據(jù)訪問對象)是程序員定義的一種接口,它介于數(shù)據(jù)庫資源和業(yè)務(wù)邏輯之間,其意圖是將底層數(shù)據(jù)訪問操作與高層業(yè)務(wù)邏輯完全分開。在數(shù)據(jù)庫編程的時候,經(jīng)常遇到這樣的情況:一個用戶的數(shù)據(jù)訪問模塊,里面的操作方法有

2、insert、delete、update、select等,對不同數(shù)據(jù)庫其實現(xiàn)的細節(jié)是不同的。因此,不太可能針對每種類型的數(shù)據(jù)庫做一個通用的對象來實現(xiàn)這些操作。這時候,就可以定義一個用戶數(shù)據(jù)訪問對象的接口IUserDAO,提供insert、delete、update、select等抽象方法。不同類型數(shù)據(jù)庫的用戶訪問對象只要實現(xiàn)這個接口就可以了,如圖5.2所示。2舉例舉例在【實例五】(4.1.2節(jié))中,利用Hibernate的ORM功能實現(xiàn)了對數(shù)據(jù)庫表的對象化操作,然而,validate.jsp(登錄驗證)的代碼中仍然存留有操作數(shù)據(jù)庫的語句,如:/查詢userTable表中的記錄String hq

3、l=from UserTable u where u.username=? and u.password=?;Query query=HibernateSessionFactory.getSession().createQuery(hql);query.setParameter(0, usr);query.setParameter(1, pwd);List users=query.list();【實例六】采用JSP+DAO+Hibernate方式開發(fā)一個Web登錄程序。要求:用DAO接口來操作Hibernate生成的UserTable對象。(1)創(chuàng)建)創(chuàng)建Java EE項目項目新建Java E

4、E項目,項目命名jsp_dao_hibernate。在項目src下創(chuàng)建兩個包:org.easybooks.test.factory和org.easybooks.test.model.vo。(2)添加)添加Hibernate及生成及生成POJO類類操作方法與【實例五】(4.1.2節(jié))的第(2)、(3)步完全相同,不再贅述。(3)定義并實現(xiàn))定義并實現(xiàn)DAO在項目src下創(chuàng)建包org.easybooks.test.dao,右擊選擇菜單【New】【Interface】,在如圖5.3所示的【New Java Interface】窗口的Name欄輸入IUserTableDAO,單擊【Finish】按鈕,

5、創(chuàng)建一個DAO接口。在IUserTableDAO.java中定義DAO接口,代碼如下:package org.easybooks.test.dao;import org.easybooks.test.model.vo.*;public interface IUserTableDAO public UserTable validateUser(String username, String password);/方法:驗證用戶名密碼接口中定義了一個validateUser()方法,用于驗證用戶,這個方法的具體實現(xiàn)在org.easybooks. test.dao.impl包下的UserTableD

6、AO類中。在src下創(chuàng)建org.easybooks.test.dao.impl包,在包中創(chuàng)建類UserTableDAO,此類實現(xiàn)了接口中的validateUser()方法。(4)創(chuàng)建)創(chuàng)建JSP本例也有4個JSP文件,其中l(wèi)ogin.jsp、main.jsp和error.jsp這3個文件的源碼與【實例五】(4.1.2節(jié))程序的完全相同,但validate.jsp文件的代碼有了很大的改變。validate.jsp文件的代碼。1MVC的實現(xiàn)的實現(xiàn) 用Hibernate把數(shù)據(jù)庫表映射為POJO類,并用DAO技術(shù)將其封裝入接口,形成持久層數(shù)據(jù)模型(M)。 JSP文件單純地只作為網(wǎng)頁視圖(V),顯示應(yīng)用

7、程序界面和數(shù)據(jù)。 Struts 2擔(dān)任控制器(C)的角色,負責(zé)按程序流程調(diào)用數(shù)據(jù)模型和控制網(wǎng)頁跳轉(zhuǎn)。顯然,這需要同時整合Struts 2和Hibernate兩個框架,參考圖3.3,得到如圖5.4所示Java EE系統(tǒng)的MVC解決方案。2舉例舉例【實例七】采用JSP+Struts 2+DAO+Hibernate方式開發(fā)一個Web登錄程序。要求:將前面介紹過的Struts 2和Hibernate兩大框架整合起來使用,參照圖5.4所示的系統(tǒng)結(jié)構(gòu),嚴格貫徹MVC的思想開發(fā)。其中,JSP作為視圖V顯示登錄、成功或失敗頁;Struts 2作為控制器C處理頁面跳轉(zhuǎn);Hibernate用作數(shù)據(jù)模型M,它與前臺

8、程序的接口以DAO形式提供。(1)創(chuàng)建)創(chuàng)建Java EE項目項目新建Java EE項目,項目命名jsp_struts2_dao_hibernate。在項目src下創(chuàng)建兩個包:org.easybooks.test. factory和org.easybooks.test.model.vo。(2)M層開發(fā)層開發(fā)添加添加Hibernate、生成、生成POJO類及編寫類及編寫DAO 添加Hibernate。操作方法同【實例五】(4.1.2節(jié))第(2)步,略。 生成POJO類。操作方法同【實例五】第(3)步,略。 在項目src下創(chuàng)建包org.easybooks.test.dao和org.easybook

9、s.test.dao.impl,分別用于存放DAO接口IUserTableDAO及其實現(xiàn)類UserTableDAO。DAO接口和類的代碼與【實例六】的完全相同,在此省略。(3)C層開發(fā)層開發(fā)加載加載Struts 2包、實現(xiàn)包、實現(xiàn)Action及控制器配置及控制器配置 加載、配置Struts 2。步驟與【實例四】(3.1.2節(jié))第(2)、(3)步相同,稍有差別的是,這里僅需加載Struts 2的9個jar包即可,因在剛剛添加Hibernate時,數(shù)據(jù)庫的驅(qū)動包已被自動載入進來,無須重復(fù)加載。配置文件web.xml內(nèi)容與【實例四】完全相同,不再給出。 實現(xiàn)Action。在項目src文件夾下建立包o

10、rg.easybooks.test.action,在包里創(chuàng)建MainAction類,代碼所示。將上段代碼與【實例四】第(6)步的MainAction類的代碼比較一下,就會發(fā)現(xiàn),其中已沒有操作數(shù)據(jù)庫的代碼了!由此可見使用DAO封裝所帶來的好處。 配置Action。在src下創(chuàng)建文件struts.xml,配置內(nèi)容與【實例四】完全一樣,在此省略。(4)V層開發(fā)層開發(fā)編寫編寫JSP文件文件有了M、C這兩層的功能,V層開發(fā)的任務(wù)就簡單多了,只剩下編寫3個JSP文件:login.jsp、main.jsp和error.jsp。它們的代碼與【實例四】的也完全一樣,略。部署運行程序,效果如圖2.13所示。5.3

11、.1 MVC綜合開發(fā)實戰(zhàn):學(xué)生選課系統(tǒng)(基于綜合開發(fā)實戰(zhàn):學(xué)生選課系統(tǒng)(基于SQL Server)【綜合案例四】采用MVC(JSP+Struts 2+DAO+Hibernate)方式開發(fā)一個學(xué)生選課系統(tǒng)。學(xué)生登錄系統(tǒng)后,可以查看、修改個人信息;查看個人選課情況;選定課程及退選課程。要求:在【實例七】(5.2.2節(jié))基礎(chǔ)上修改擴充而成,【實例七】已經(jīng)具備了一個完整的MVC項目的框架,但它只有最簡單的Web登錄功能,本例就以它為“藍本”進一步擴充成一個實現(xiàn)多種應(yīng)用功能的“學(xué)生選課系統(tǒng)”。項目嚴格遵照MVC模式去開發(fā),后臺數(shù)據(jù)庫用SQL Server 2008/2012。1建立數(shù)據(jù)庫及表結(jié)構(gòu)建立數(shù)據(jù)

12、庫及表結(jié)構(gòu)該系統(tǒng)需要建立登錄表(DLB)、學(xué)生表(XSB)、專業(yè)表(ZYB)、課程表(KCB)以及學(xué)生課程表(XS_KCB)即連接表。其中學(xué)生表和專業(yè)表是多對一關(guān)系,學(xué)生表和課程表是多對多關(guān)系。具體表結(jié)構(gòu)見附錄A,完成后預(yù)先錄入樣本數(shù)據(jù)。2創(chuàng)建創(chuàng)建Java EE項目項目新建Java EE項目,項目命名Struts_Hibernate。在項目src下創(chuàng)建兩個包:org.factory和org.model。3登錄選課系統(tǒng)登錄選課系統(tǒng)(1)M層開發(fā)層開發(fā) 添加Hibernate。操作方法同【實例五】(4.1節(jié))第(2)步,生成的HibernateSessionFactory.java文件置于org.

13、factory包中。 生成POJO類及映射文件。操作方法同【實例五】第(3)步,不過這里要生成登錄表、課程表、學(xué)生表和專業(yè)表一共4個表的POJO類及其映射文件,統(tǒng)一置于org.model包下。因各表間有對應(yīng)的關(guān)系,除了登錄表、專業(yè)表的對應(yīng)類及映射文件外,其它需要修改(加黑語句)。Xsb.java代碼改為。對應(yīng)映射文件Xsb.hbm.xml代碼改為。Kcb.java代碼改為。對應(yīng)映射文件Kcb.hbm.xml代碼改為: 為了使程序能正確處理多對多關(guān)系和操作連接表,對自動生成的hibernate.cfg.xml配置文件要進行微小的改動,指明所連接到的數(shù)據(jù)庫名稱,如下:org.hibernate.d

14、ialect.SQLServerDialectjdbc:sqlserver:/localhost:1433;databaseName=XSCJ DAO層組件實現(xiàn)。在項目src下創(chuàng)建包org.dao和org.dao.impl,分別用于存放DAO接口及其實現(xiàn)類。 登錄接口。登錄接口中封裝了validate方法,完成對用戶的驗證功能,系統(tǒng)根據(jù)輸入的學(xué)號和口令進行用戶合法性驗證,驗證通過才允許進入系統(tǒng)主頁面。DlDao.java接口,定義如下:package org.dao;import org.model.Dlb;public interface DlDao /方法:根據(jù)學(xué)號和口令查詢public

15、Dlb validate(String xh, String kl);其對應(yīng)的實現(xiàn)類DlDaoImp.java,代碼為。 學(xué)生接口。學(xué)生接口中封裝了getOneXs和update兩個方法,分別用于獲取指定學(xué)號的學(xué)生個人信息和修改某個學(xué)生的信息。XsDao.java接口,定義如下:package org.dao;import org.model.Xsb;public interface XsDao /方法:根據(jù)學(xué)號查詢學(xué)生信息public Xsb getOneXs(String xh);/方法:修改學(xué)生信息public void update(Xsb xs);其對應(yīng)的實現(xiàn)類XsDaoImp.ja

16、va,代碼為。 專業(yè)接口。專業(yè)接口中封裝了getOneZy和getAll兩個方法,分別用于查詢某個專業(yè)的信息以及獲取所有專業(yè)信息。ZyDao.java接口,定義如下:package org.dao;import java.util.*;import org.model.Zyb;public interface ZyDao /方法:根據(jù)專業(yè) ID 查詢專業(yè)信息public Zyb getOneZy(Integer zyId);/方法:查詢所有專業(yè)信息public List getAll();對應(yīng)的實現(xiàn)類ZyDaoImp.java,代碼為。 課程接口。課程接口中封裝了getOneKc和getAll

17、兩個方法,分別用于查詢某門課程的信息以及獲取所有課程的信息。KcDao.java接口,定義如下:package org.dao;import java.util.*;import org.model.Kcb;public interface KcDao /方法:根據(jù)課程號查詢課程信息public Kcb getOneKc(String kch);/方法:查詢所有課程的信息public List getAll();對應(yīng)的實現(xiàn)類KcDaoImp.java,代碼為。(2)C層開發(fā)層開發(fā) 加載、配置Struts 2。步驟與【實例四】(3.1.2節(jié))第(2)、(3)步相同,稍有差別的是,這里僅需加載St

18、ruts 2的9個jar包即可,因在添加Hibernate時,數(shù)據(jù)庫的驅(qū)動包已被自動載入,無須重復(fù)加載。配置文件web.xml內(nèi)容與【實例四】完全相同,不再給出。 實現(xiàn)Action。在項目src文件夾下建立包org.action,在包里創(chuàng)建LoginAction類,代碼所示。 配置Action。在src下創(chuàng)建文件struts.xml,配置如下:/main.jsp/login.jsp/這里以后添加Action配置,后面配置的Action都要添加在這里(3)V層開發(fā)層開發(fā) 登錄界面。登錄界面由login.jsp實現(xiàn),代碼為。 主頁面。選課系統(tǒng)的主頁面main.jsp由head.jsp、left.j

19、sp及rigth.jsp組合而成。 主頁。主頁main.jsp,代碼如下:學(xué)生選課系統(tǒng) 主頁頭。主頁頭部依然是前面的那個主題標頭圖片,head.jsp內(nèi)容為: 功能導(dǎo)航。頁面左部是一系列功能導(dǎo)航的鏈接,單擊提交給不同功能的Action模塊去處理。left.jsp代碼如下:查詢個人信息修改個人信息個人選課情況所有課程信息 內(nèi)容區(qū)。頁面右部是加載網(wǎng)頁顯示內(nèi)容的區(qū)域,初始為空白。right.jsp是一個僅顯示背景色的空頁,如下:到目前為止,學(xué)生選課系統(tǒng)的MVC框架及最基本的登錄功能已經(jīng)做好了,部署運行一下查看效果。初始登錄頁如圖5.5所示。登錄成功后進入主界面,如圖5.6所示。4查詢個人信息查詢個人

20、信息主界面左側(cè)第一個導(dǎo)航功能是“查詢個人信息”,從left.jsp中可以發(fā)現(xiàn),其提交給xsInfo.action,對應(yīng)Action配置如下:/xsInfo.jsp由于學(xué)生的個人信息中有照片,這里的處理思路是把要處理照片的信息提交給Action類來讀取,所以要加入名為getImage的Action。編寫XsAction來實現(xiàn)學(xué)生信息的查詢。XsAction.java的代碼所示。成功后跳轉(zhuǎn)的頁面xsInfo.jsp,代碼為。這樣查詢學(xué)生個人信息的功能就完成了,部署運行程序,登錄,單擊“查詢個人信息”導(dǎo)航鏈接,可以查看當(dāng)前用戶的個人信息,如圖5.7所示。5修改個人信息修改個人信息(1)呈現(xiàn)修改學(xué)生信

21、息頁)呈現(xiàn)修改學(xué)生信息頁下面再來開發(fā)修改學(xué)生信息的功能。單擊“修改個人信息”超鏈接,從left.jsp中可以看出提交給了updateXsInfo.action,該Action的配置為:/updateXsInfo.jsp所以就要在XsAction類中加入下面的方法:/進入修改學(xué)生信息頁面public String updateXsInfo() throws Exception/獲取當(dāng)前用戶對象Map session=(Map)ActionContext.getContext().getSession();Dlb user=(Dlb)session.get(user);xsDao=new XsDa

22、oImp();ZyDao zyDao=new ZyDaoImp();/取出所有專業(yè)信息,因為在修改學(xué)生信息時,專業(yè)欄是下拉列表選擇專業(yè),而不是學(xué)生自己隨便填寫List zys=zyDao.getAll();Xsb xs=xsDao.getOneXs(user.getXh();/得到當(dāng)前學(xué)生的信息Map request=(Map)ActionContext.getContext().get(request);request.put(zys, zys);request.put(xs, xs);return SUCCESS;修改學(xué)生信息頁面updateXsInfo.jsp的代碼所示。(2)修改操作的

23、實現(xiàn))修改操作的實現(xiàn)當(dāng)單擊【修改】按鈕后,就把學(xué)生自己填寫的內(nèi)容提交給了updateXs.action,對應(yīng)Action的配置如下:/updateXs_success.jspXsAction類中要加入下面的代碼來處理請求。修改成功后跳轉(zhuǎn)到updateXs_success.jsp頁面,代碼如下:恭喜你,修改成功!部署運行程序,登錄、單擊主頁上的“修改個人信息”導(dǎo)航鏈接,程序以控件表單的方式呈現(xiàn)出該用戶原來的舊信息以供修改,如圖5.8所示。把用戶信息修改為如圖5.9所示狀態(tài):姓名“王林”改為“周何駿”;專業(yè)下拉改選為“通信工程”;出生時間改為“1995-09-25”(必須嚴格按此格式填寫);增加備

24、注信息“輔修計算機”;總學(xué)分改為100;單擊【瀏覽】按鈕,彈出對話框,選擇某個路徑下預(yù)先保存的照片。完成后單擊【修改】按鈕提交,系統(tǒng)會提示用戶修改成功。然后再單擊“查詢個人信息”超鏈接就會出現(xiàn)新的個人信息頁,如圖5.10所示。6選課與退選課程選課與退選課程(1)查看個人選課情況)查看個人選課情況left.jsp文件的第三個超鏈接是查詢學(xué)生的選課情況,這個功能很容易實現(xiàn)。只要查出該學(xué)生信息,由于級聯(lián)到第三張表的信息,所以只要取出該生信息的Set集合的內(nèi)容,遍歷出來就行了。下面是Action配置代碼:/xsKcs.jsp對應(yīng)的XsAction類中的處理方法,代碼如下:/得到學(xué)生選修的課程publi

25、c String getXsKcs() throws ExceptionMap session=(Map)ActionContext.getContext().getSession();Dlb user=(Dlb)session.get(user);String xh=user.getXh();Xsb xsb=new XsDaoImp().getOneXs(xh);/得到當(dāng)前學(xué)生的信息Set list=xsb.getKcs();/取出選修的課程 SetMap request=(Map)ActionContext.getContext().get(request);request.put(lis

26、t,list);/保存return SUCCESS;查詢成功后的xsKcs.jsp頁面,代碼所示。部署運行程序,登錄后單擊“個人選課情況”超鏈接,可以查看當(dāng)前用戶的個人選課情況,如圖5.11所示。(2)查詢所有課程信息)查詢所有課程信息在left.jsp中還有一個鏈接就是查詢所有課程,其實查詢出所有課程就是為了方便讓學(xué)生選課,其Action配置如下:/allKc.jsp對應(yīng)Action實現(xiàn)類,可以發(fā)現(xiàn)一個新的Action類名為KcAction.java,代碼如下:package org.action;import java.util.*;import org.dao.*;import org.

27、dao.imp.*;import com.opensymphony.xwork2.*;public class KcAction extends ActionSupportpublic String execute()throws ExceptionKcDao kcDao=new KcDaoImp();List list=kcDao.getAll();/獲取所有課程信息Map request=(Map)ActionContext.getContext().get(request);request.put(list, list);/保存到requestreturn SUCCESS;顯示所有課程信

28、息列表的JSP頁allKc.jsp,代碼為。部署運行程序,登錄、在主頁上單擊“所有課程信息”超鏈接,可顯示所有課程的信息列表,如圖5.12所示。(3)選修課程)選修課程在圖5.12中,每個課程的后面都有個“選修”超鏈接,提交給selectKc.action,該Action的配置如下:/selectKc_success.jsp/selectKc_fail.jsp對應(yīng)Action實現(xiàn)類的方法(由于是學(xué)生選課,所以該方法在XsAction中),代碼如下:/選定課程public String selectKc() throws ExceptionMap session=(Map)ActionConte

29、xt.getContext().getSession();String xh=(Dlb)session.get(user).getXh();xsDao=new XsDaoImp();Xsb xs3=xsDao.getOneXs(xh);Set list=xs3.getKcs();Iterator iter=list.iterator();/選修課程時先遍歷已經(jīng)選的課程,如果在已經(jīng)選修的課程中找到就返回 ERRORwhile(iter.hasNext()Kcb kc3=(Kcb)iter.next();if(kc3.getKch().equals(kcb.getKch()return ERROR

30、;list.add(new KcDaoImp().getOneKc(kcb.getKch(); /如果沒找到,就添加到集合中xs3.setKcs(list);xsDao.update(xs3);return SUCCESS;成功頁面selectKc_success.jsp,代碼如下:你已經(jīng)成功選擇該課程!失敗頁面selectKc_fail.jsp,代碼如下:你已經(jīng)選擇該課程,請不要重復(fù)選??!部署運行程序,登錄、單擊“所有課程信息”,單擊課程信息表格(如圖5.12所示)中某門課右邊的“選修”鏈接,如圖5.13所示(這里以選302號“軟件工程”課為例演示),后臺就會判斷該用戶是否已經(jīng)選修了該門課,如果已經(jīng)選修就會提示用戶已選,不要重復(fù)選??;如果沒有選修,就會提示用戶選修成功。然后再查看個人選課情況,會多出剛剛選修的課程信息,如圖5.14所示。(4)退選課程)退選課程退選操作很簡單,只要把該學(xué)生的這個課程從Set中remove就行了。對應(yīng)的Action配置如下:/deleteKc_success.jsp對應(yīng)XsAction類中的處理方法,代碼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論