Java EE基礎(chǔ)實(shí)用教程(第3版)(含典型案例視頻分析)課件 第5、6章 MVC框架開(kāi)發(fā)基礎(chǔ)、Spring基礎(chǔ)及應(yīng)用_第1頁(yè)
Java EE基礎(chǔ)實(shí)用教程(第3版)(含典型案例視頻分析)課件 第5、6章 MVC框架開(kāi)發(fā)基礎(chǔ)、Spring基礎(chǔ)及應(yīng)用_第2頁(yè)
Java EE基礎(chǔ)實(shí)用教程(第3版)(含典型案例視頻分析)課件 第5、6章 MVC框架開(kāi)發(fā)基礎(chǔ)、Spring基礎(chǔ)及應(yīng)用_第3頁(yè)
Java EE基礎(chǔ)實(shí)用教程(第3版)(含典型案例視頻分析)課件 第5、6章 MVC框架開(kāi)發(fā)基礎(chǔ)、Spring基礎(chǔ)及應(yīng)用_第4頁(yè)
Java EE基礎(chǔ)實(shí)用教程(第3版)(含典型案例視頻分析)課件 第5、6章 MVC框架開(kāi)發(fā)基礎(chǔ)、Spring基礎(chǔ)及應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩140頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章

MVC框架開(kāi)發(fā)基礎(chǔ)——MVC基本思想MVC基本思想MVC是一種通用的Web軟件設(shè)計(jì)模式,它強(qiáng)制性地把應(yīng)用程序的數(shù)據(jù)處理、數(shù)據(jù)展示和流程控制分開(kāi)。MVC把應(yīng)用程序分成3大基本模塊:模型(Model,簡(jiǎn)稱M)、視圖(View,簡(jiǎn)稱V)和控制器(Controller,簡(jiǎn)稱C),它們(三者聯(lián)合即MVC)分別擔(dān)當(dāng)不同的任務(wù)。這幾個(gè)模塊各自的職能及相互關(guān)系,如圖5.1所示。MVC基本思想

模型:用于封裝與應(yīng)用程序業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法?!澳P汀庇袑?duì)數(shù)據(jù)直接訪問(wèn)的權(quán)力,它不依賴“視圖”和“控制器”,也就是說(shuō),模型并不關(guān)心它會(huì)被如何顯示或是被如何操作。

視圖:是用戶看到并與之交互的界面。對(duì)于老式的Web應(yīng)用程序來(lái)說(shuō),視圖就是由HTML元素和JSP組成的網(wǎng)頁(yè);在新式Web應(yīng)用中,HTML和JSP依舊扮演著重要的角色,但一些新的技術(shù)已層出不窮,包括MacromediaFlash和像HTML5、XML/XSL、WML等一些標(biāo)識(shí)語(yǔ)言和WebServices等。

控制器:控制器起到不同層面間的組織作用,用于控制應(yīng)用程序的流程。它處理事件并作出響應(yīng),“事件”包括用戶的行為和數(shù)據(jù)模型上的改變。第5章

MVC框架開(kāi)發(fā)基礎(chǔ)——MVC關(guān)鍵技術(shù)目錄DAO技

術(shù)011.DAO原理2.舉例1.DAO原理在數(shù)據(jù)庫(kù)編程的時(shí)候,經(jīng)常遇到這樣的情況:一個(gè)用戶的數(shù)據(jù)訪問(wèn)模塊,里面的操作方法有insert、delete、update、select等,對(duì)不同數(shù)據(jù)庫(kù)其實(shí)現(xiàn)的細(xì)節(jié)是不同的。因此,不太可能針對(duì)每種類型的數(shù)據(jù)庫(kù)做一個(gè)通用的對(duì)象來(lái)實(shí)現(xiàn)這些操作。這時(shí)候,就可以定義一個(gè)用戶數(shù)據(jù)訪問(wèn)對(duì)象的接口IUserDAO,提供insert、delete、update、select等抽象方法。不同類型數(shù)據(jù)庫(kù)的用戶訪問(wèn)對(duì)象只要實(shí)現(xiàn)這個(gè)接口就可以了,如圖5.2所示。2.舉例在【實(shí)例五】(4.1.2節(jié))中,利用Hibernate的ORM功能實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)表的對(duì)象化操作,然而,validate.jsp(登錄驗(yàn)證)的代碼中仍然存留有操作數(shù)據(jù)庫(kù)的語(yǔ)句,如:……//查詢userTable表中的記錄Stringhql="fromUserTableuwhereu.username=?andu.password=?";Queryquery=HibernateSessionFactory.getSession().createQuery(hql);query.setParameter(0,usr);query.setParameter(1,pwd);Listusers=query.list();……【實(shí)例六】采用JSP+DAO+Hibernate方式開(kāi)發(fā)一個(gè)Web登錄程序。要求:用DAO接口來(lái)操作Hibernate生成的UserTable對(duì)象。(1)創(chuàng)建JavaEE項(xiàng)目新建JavaEE項(xiàng)目,項(xiàng)目命名jsp_dao_hibernate。在項(xiàng)目src下創(chuàng)建兩個(gè)包:org.easybooks.test.factory和org.easybooks.test.model.vo。(2)添加Hibernate及生成POJO類操作方法與【實(shí)例五】(4.1.2節(jié))的第(2)、(3)步完全相同,不再贅述。2.舉例(3)定義并實(shí)現(xiàn)DAO在項(xiàng)目src下創(chuàng)建包org.easybooks.test.dao,右擊選擇菜單【New】→【Interface】,在如圖5.3所示的【NewJavaInterface】窗口的Name欄輸入IUserTableDAO,單擊【Finish】按鈕,創(chuàng)建一個(gè)DAO接口。2.舉例在IUserTableDAO.java中定義DAO接口,代碼如下:接口中定義了一個(gè)validateUser()方法,用于驗(yàn)證用戶,這個(gè)方法的具體實(shí)現(xiàn)在org.easybooks.test.dao.impl包下的UserTableDAO類中。在src下創(chuàng)建org.easybooks.test.dao.impl包,在包中創(chuàng)建類UserTableDAO,此類實(shí)現(xiàn)了接口中的validateUser()方法。packageorg.easybooks.test.dao;importorg.easybooks.test.model.vo.*;publicinterfaceIUserTableDAO{ publicUserTablevalidateUser(Stringusername,Stringpassword); //方法:驗(yàn)證用戶名密碼}2.舉例(4)創(chuàng)建JSP本例也有4個(gè)JSP文件,其中l(wèi)ogin.jsp、main.jsp和error.jsp這3個(gè)文件的源碼與【實(shí)例五】(4.1.2節(jié))程序的完全相同,但validate.jsp文件的代碼有了很大的改變。validate.jsp文件的代碼。目錄整合Hibernate與Struts2021.MVC的實(shí)現(xiàn)2.舉例1.MVC的實(shí)現(xiàn)在JavaEE開(kāi)發(fā)中實(shí)現(xiàn)MVC一般采用如下方案。①用Hibernate把數(shù)據(jù)庫(kù)表映射為POJO類,并用DAO技術(shù)將其封裝入接口,形成持久層數(shù)據(jù)模型(M)。②JSP文件單純地只作為網(wǎng)頁(yè)視圖(V),顯示應(yīng)用程序界面和數(shù)據(jù)。③Struts2擔(dān)任控制器(C)的角色,負(fù)責(zé)按程序流程調(diào)用數(shù)據(jù)模型和控制網(wǎng)頁(yè)跳轉(zhuǎn)。顯然,這需要同時(shí)整合Struts2和Hibernate兩個(gè)框架,參考第3章的圖3.3,得到如圖5.4所示JavaEE系統(tǒng)的MVC解決方案。2.舉例【實(shí)例七】采用JSP+Struts2+DAO+Hibernate方式開(kāi)發(fā)一個(gè)Web登錄程序。要求:將前面介紹過(guò)的Struts2和Hibernate兩大框架整合起來(lái)使用,參照?qǐng)D5.4所示的系統(tǒng)結(jié)構(gòu),嚴(yán)格貫徹MVC的思想開(kāi)發(fā)。其中,JSP作為視圖V顯示登錄、成功或失敗頁(yè);Struts2作為控制器C處理頁(yè)面跳轉(zhuǎn);Hibernate用作數(shù)據(jù)模型M,它與前臺(tái)程序的接口以DAO形式提供。(1)創(chuàng)建JavaEE項(xiàng)目新建JavaEE項(xiàng)目,項(xiàng)目命名jsp_struts2_dao_hibernate。在項(xiàng)目src下創(chuàng)建兩個(gè)包:org.easybooks.test.factory和org.easybooks.test.model.vo。(2)M層開(kāi)發(fā)——添加Hibernate、生成POJO類及編寫(xiě)DAO①添加Hibernate。操作方法同【實(shí)例五】(4.1.2節(jié))第(2)步,略。②生成POJO類。操作方法同【實(shí)例五】第(3)步,略。③在項(xiàng)目src下創(chuàng)建包org.easybooks.test.dao和org.easybooks.test.dao.impl,分別用于存放DAO接口IUserTableDAO及其實(shí)現(xiàn)類UserTableDAO。DAO接口和類的代碼與【實(shí)例六】的完全相同,在此省略。2.舉例(3)C層開(kāi)發(fā)——加載Struts2包、實(shí)現(xiàn)Action及控制器配置①加載、配置Struts2。步驟與【實(shí)例四】(3.1.2節(jié))第(2)、(3)步相同,稍有差別的是,這里僅需加載Struts2的8個(gè)jar包即可,因在剛剛添加Hibernate時(shí),數(shù)據(jù)庫(kù)的驅(qū)動(dòng)包已被自動(dòng)載入進(jìn)來(lái),無(wú)須重復(fù)加載。配置文件web.xml內(nèi)容與【實(shí)例四】完全相同,不再給出。②實(shí)現(xiàn)Action。在項(xiàng)目src文件夾下建立包org.easybooks.test.action,在包里創(chuàng)建MainAction類,代碼。③配置Action。在src下創(chuàng)建文件struts.xml,配置內(nèi)容與【實(shí)例四】完全一樣,在此省略。(4)V層開(kāi)發(fā)——編寫(xiě)JSP文件有了M、C這兩層的功能,V層開(kāi)發(fā)的任務(wù)就簡(jiǎn)單多了,只剩下編寫(xiě)3個(gè)JSP文件:login.jsp、main.jsp和error.jsp。它們的代碼與【實(shí)例四】的也完全一樣,略。部署運(yùn)行程序,效果如圖2.13所示。第5章

MVC框架開(kāi)發(fā)基礎(chǔ)——MVC綜合開(kāi)發(fā)實(shí)戰(zhàn)目錄MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)011.建立數(shù)據(jù)庫(kù)及表結(jié)構(gòu)2.創(chuàng)建JavaEE項(xiàng)目3.登錄選課系統(tǒng)4.查詢個(gè)人信息5.修改個(gè)人信息6.選課與退選課程MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)【綜合案例四】采用MVC(JSP+Struts2+DAO+Hibernate)方式開(kāi)發(fā)一個(gè)學(xué)生選課系統(tǒng)。學(xué)生登錄系統(tǒng)后,可以查看、修改個(gè)人信息;查看個(gè)人選課情況;選定課程及退選課程。要求:在【實(shí)例七】(5.2.2節(jié))基礎(chǔ)上修改擴(kuò)充而成,【實(shí)例七】已經(jīng)具備了一個(gè)完整的MVC項(xiàng)目的框架,但它只有最簡(jiǎn)單的Web登錄功能,本例就以它為“藍(lán)本”進(jìn)一步擴(kuò)充成一個(gè)實(shí)現(xiàn)多種應(yīng)用功能的“學(xué)生選課系統(tǒng)”。項(xiàng)目嚴(yán)格遵照MVC模式去開(kāi)發(fā),后臺(tái)數(shù)據(jù)庫(kù)用SQLServer2016。1.建立數(shù)據(jù)庫(kù)及表結(jié)構(gòu)該系統(tǒng)需要建立登錄表(DLB)、學(xué)生表(XSB)、專業(yè)表(ZYB)、課程表(KCB)以及學(xué)生課程表(XS_KCB)即連接表。其中學(xué)生表和專業(yè)表是多對(duì)一關(guān)系,學(xué)生表和課程表是多對(duì)多關(guān)系。具體表結(jié)構(gòu)見(jiàn)附錄A,完成后預(yù)先錄入樣本數(shù)據(jù)。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)2.創(chuàng)建JavaEE項(xiàng)目新建JavaEE項(xiàng)目,項(xiàng)目命名Struts_Hibernate。在項(xiàng)目src下創(chuàng)建兩個(gè)包:org.factory和org.model。3.登錄選課系統(tǒng)(1)M層開(kāi)發(fā)①添加Hibernate。操作方法同【實(shí)例五】(4.1節(jié))第(2)步,生成的HibernateSessionFactory.java文件置于org.factory包中。②生成POJO類及映射文件。操作方法同【實(shí)例五】第(3)步,不過(guò)這里要生成登錄表、課程表、學(xué)生表和專業(yè)表一共4個(gè)表的POJO類及其映射文件,并統(tǒng)一置于org.model包下。因各表間有對(duì)應(yīng)的關(guān)系,除了登錄表、專業(yè)表的對(duì)應(yīng)類及映射文件外,其它需要修改(如加黑語(yǔ)句)。Xsb.java代碼改為。對(duì)應(yīng)映射文件Xsb.hbm.xml代碼改為。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)Kcb.java代碼改為。對(duì)應(yīng)映射文件Kcb.hbm.xml代碼改為:…<hibernate-mapping><classname="org.model.Kcb"table="KCB"schema="dbo"catalog="XSCJ"> …<!--與學(xué)生表是多對(duì)多關(guān)系--><setname="xss"table="XS_KCB"lazy="true"inverse="true"> <keycolumn="KCH"></key> <many-to-manyclass="org.model.Xsb"column="XH"></many-to-many></set></class></hibernate-mapping>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)為了使程序能正確處理多對(duì)多關(guān)系和操作連接表,對(duì)自動(dòng)生成的hibernate.cfg.xml配置文件要進(jìn)行微小的改動(dòng),指明所連接到的數(shù)據(jù)庫(kù)名稱,如下:…<hibernate-configuration> <session-factory> <propertyname="dialect"> org.hibernate.dialect.SQLServerDialect </property> <propertyname="connection.url"> jdbc:sqlserver://HUAWEI:1433;databaseName=XSCJ </property> … </session-factory></hibernate-configuration>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)③DAO層組件實(shí)現(xiàn)。在項(xiàng)目src下創(chuàng)建包org.dao和org.dao.impl,分別用于存放DAO接口及其實(shí)現(xiàn)類。

登錄接口。登錄接口中封裝了validate方法,完成對(duì)用戶的驗(yàn)證功能,系統(tǒng)根據(jù)輸入的學(xué)號(hào)和口令進(jìn)行用戶合法性驗(yàn)證,驗(yàn)證通過(guò)才允許進(jìn)入系統(tǒng)主頁(yè)面。DlDao.java接口,定義如下:packageorg.dao;importorg.model.Dlb;publicinterfaceDlDao{ //方法:根據(jù)學(xué)號(hào)和口令查詢 publicDlbvalidate(Stringxh,Stringkl);}其對(duì)應(yīng)的實(shí)現(xiàn)類DlDaoImp.java,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

學(xué)生接口。學(xué)生接口中封裝了getOneXs和update兩個(gè)方法,分別用于獲取指定學(xué)號(hào)的學(xué)生個(gè)人信息和修改某個(gè)學(xué)生的信息。XsDao.java接口,定義如下:packageorg.dao;importorg.model.Xsb;publicinterfaceXsDao{ //方法:根據(jù)學(xué)號(hào)查詢學(xué)生信息 publicXsbgetOneXs(Stringxh); //方法:修改學(xué)生信息 publicvoidupdate(Xsbxs);}其對(duì)應(yīng)的實(shí)現(xiàn)類XsDaoImp.java,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

專業(yè)接口。專業(yè)接口中封裝了getOneZy和getAll兩個(gè)方法,分別用于查詢某個(gè)專業(yè)的信息以及獲取所有專業(yè)信息。ZyDao.java接口,定義如下:packageorg.dao;importjava.util.*;importorg.model.Zyb;publicinterfaceZyDao{ //方法:根據(jù)專業(yè)ID查詢專業(yè)信息 publicZybgetOneZy(IntegerzyId); //方法:查詢所有專業(yè)信息 publicListgetAll();}對(duì)應(yīng)的實(shí)現(xiàn)類ZyDaoImp.java,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

課程接口。課程接口中封裝了getOneKc和getAll兩個(gè)方法,分別用于查詢某門(mén)課程的信息以及獲取所有課程的信息。KcDao.java接口,定義如下:packageorg.dao;importjava.util.*;importorg.model.Kcb;publicinterfaceKcDao{ //方法:根據(jù)課程號(hào)查詢課程信息 publicKcbgetOneKc(Stringkch); //方法:查詢所有課程的信息 publicListgetAll();}對(duì)應(yīng)的實(shí)現(xiàn)類KcDaoImp.java,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(2)C層開(kāi)發(fā)①加載、配置Struts2。步驟與【實(shí)例四】(3.1.2節(jié))第(2)、(3)步相同,稍有差別的是,這里僅需加載Struts2的8個(gè)jar包即可,因在添加Hibernate時(shí),數(shù)據(jù)庫(kù)的驅(qū)動(dòng)包已被自動(dòng)載入,無(wú)須重復(fù)加載。配置文件web.xml內(nèi)容與【實(shí)例四】完全相同,不再給出。②實(shí)現(xiàn)Action。在項(xiàng)目src文件夾下建立包org.action,在包里創(chuàng)建LoginAction類,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)③配置Action。在src下創(chuàng)建文件struts.xml,配置如下:…<struts> <packagename="default"extends="struts-default"> <!--用戶登錄--> <actionname="login"class="org.action.LoginAction"> <resultname="success">main.jsp</result> <resultname="error">login.jsp</result> </action> //這里以后添加Action配置,后面配置的Action都要添加在這里 </package></struts>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(3)V層開(kāi)發(fā)①登錄界面。登錄界面由login.jsp實(shí)現(xiàn),代碼。②主頁(yè)面。選課系統(tǒng)的主頁(yè)面main.jsp由head.jsp、left.jsp及rigth.jsp組合而成,它們的代碼分別如下。

主頁(yè)。主頁(yè)main.jsp,代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head> <title>學(xué)生選課系統(tǒng)</title></head><framesetrows="30%,*"border="0"> <framesrc="head.jsp"> <framesetcols="15%,*"border="1"> <framesrc="left.jsp"> <framesrc="right.jsp"name="right"> </frameset></frameset></html>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

主頁(yè)頭。主頁(yè)頭部依然是前面的那個(gè)主題標(biāo)頭圖片,head.jsp內(nèi)容為:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA"> <imgsrc="/Struts_Hibernate/image/head.jpg"></body></html>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

功能導(dǎo)航。頁(yè)面左部是一系列功能導(dǎo)航的鏈接,單擊提交給不同功能的Action模塊去處理。left.jsp代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA"> <ahref="xsInfo.action"target="right">查詢個(gè)人信息</a><p> <ahref="updateXsInfo.action"target="right">修改個(gè)人信息</a><p> <ahref="getXsKcs.action"target="right">個(gè)人選課情況</a><p> <ahref="getAllKc.action"target="right">所有課程信息</a><p></body></html>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)

內(nèi)容區(qū)。頁(yè)面右部是加載網(wǎng)頁(yè)顯示內(nèi)容的區(qū)域,初始為空白。right.jsp是一個(gè)僅顯示背景色的空頁(yè),如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA"></body></html>到目前為止,學(xué)生選課系統(tǒng)的MVC框架及最基本的登錄功能已經(jīng)做好了,部署運(yùn)行一下查看效果。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)初始登錄頁(yè)如圖5.5所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)登錄成功后進(jìn)入主界面,如圖5.6所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)4.查詢個(gè)人信息主界面左側(cè)第一個(gè)導(dǎo)航功能是“查詢個(gè)人信息”,從left.jsp中可以發(fā)現(xiàn),其提交給xsInfo.action,對(duì)應(yīng)Action配置如下:<actionname="xsInfo"class="org.action.XsAction"> <resultname="success">xsInfo.jsp</result></action><actionname="getImage"class="org.action.XsAction"method="getImage"></action> 由于學(xué)生的個(gè)人信息中有照片,這里的處理思路是把要處理照片的信息提交給Action類來(lái)讀取,所以要加入名為getImage的Action。編寫(xiě)XsAction來(lái)實(shí)現(xiàn)學(xué)生信息的查詢。XsAction.java的代碼。成功后跳轉(zhuǎn)的頁(yè)面xsInfo.jsp,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)這樣查詢學(xué)生個(gè)人信息的功能就完成了,部署運(yùn)行程序,登錄,單擊“查詢個(gè)人信息”導(dǎo)航鏈接,可以查看當(dāng)前用戶的個(gè)人信息,如圖5.7所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)5.修改個(gè)人信息(1)呈現(xiàn)修改學(xué)生信息頁(yè)下面再來(lái)開(kāi)發(fā)修改學(xué)生信息的功能。單擊“修改個(gè)人信息”超鏈接,從left.jsp中可以看出提交給了updateXsInfo.action,該Action的配置為:<actionname="updateXsInfo"class="org.action.XsAction"method="updateXsInfo"> <resultname="success">updateXsInfo.jsp</result></action>程序首先要跳轉(zhuǎn)到修改學(xué)生信息的界面,頁(yè)面上呈現(xiàn)出原有的信息以供修改,但是學(xué)號(hào)是不能被修改的,專業(yè)必須是選擇,而不是自己填寫(xiě)。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)所以就要在XsAction類中加入下面的方法: //進(jìn)入修改學(xué)生信息頁(yè)面 publicStringupdateXsInfo()throwsException{ //獲取當(dāng)前用戶對(duì)象 Mapsession=(Map)ActionContext.getContext().getSession(); Dlbuser=(Dlb)session.get("user");

xsDao=newXsDaoImp(); ZyDaozyDao=newZyDaoImp(); //取出所有專業(yè)信息,因?yàn)樵谛薷膶W(xué)生信息時(shí),專業(yè)欄是下拉列表選擇專業(yè),而不是學(xué)生自己隨便填寫(xiě)

Listzys=zyDao.getAll();

Xsbxs=xsDao.getOneXs(user.getXh()); //得到當(dāng)前學(xué)生的信息 Maprequest=(Map)ActionContext.getContext().get("request"); request.put("zys",zys); request.put("xs",xs); returnSUCCESS;

}修改學(xué)生信息頁(yè)面updateXsInfo.jsp的代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(2)

修改操作的實(shí)現(xiàn)當(dāng)單擊【修改】按鈕后,就把學(xué)生自己填寫(xiě)的內(nèi)容提交給了updateXs.action,對(duì)應(yīng)Action的配置如下:<actionname="updateXs"class="org.action.XsAction"method="updateXs"> <resultname="success">updateXs_success.jsp</result></action>XsAction類中要加入下面的代碼來(lái)處理請(qǐng)求:修改成功后跳轉(zhuǎn)到updateXs_success.jsp頁(yè)面,代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA">

恭喜你,修改成功!</body></html>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)部署運(yùn)行程序,登錄、單擊主頁(yè)上的“修改個(gè)人信息”導(dǎo)航鏈接,程序以控件表單的方式呈現(xiàn)出該用戶原來(lái)的舊信息以供修改,如圖5.8所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)把用戶信息修改為如圖5.9所示狀態(tài):姓名“王林”改為“周何駿”;專業(yè)下拉改選為“通信工程”;出生時(shí)間改為“1995-09-25”(必須嚴(yán)格按此格式填寫(xiě));增加備注信息“輔修計(jì)算機(jī)”;總學(xué)分改為100;單擊【瀏覽…】按鈕,彈出對(duì)話框,選擇某個(gè)路徑下預(yù)先保存的照片。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)完成后單擊【修改】按鈕提交,系統(tǒng)會(huì)提示用戶修改成功。然后再單擊“查詢個(gè)人信息”超鏈接就會(huì)出現(xiàn)新的個(gè)人信息頁(yè),如圖5.10所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)6.選課與退選課程(1)查看個(gè)人選課情況left.jsp文件的第三個(gè)超鏈接是查詢學(xué)生的選課情況,這個(gè)功能很容易實(shí)現(xiàn)。只要查出該學(xué)生信息,由于級(jí)聯(lián)到第三張表的信息,所以只要取出該生信息的Set集合的內(nèi)容,遍歷出來(lái)就行了。下面是Action配置代碼:<actionname="getXsKcs"class="org.action.XsAction"method="getXsKcs"> <resultname="success">xsKcs.jsp</result></action>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)對(duì)應(yīng)的XsAction類中的處理方法,代碼如下://得到學(xué)生選修的課程 publicStringgetXsKcs()throwsException{ Mapsession=(Map)ActionContext.getContext().getSession(); Dlbuser=(Dlb)session.get("user"); Stringxh=user.getXh(); Xsbxsb=newXsDaoImp().getOneXs(xh); //得到當(dāng)前學(xué)生的信息 Setlist=xsb.getKcs(); //取出選修的課程Set Maprequest=(Map)ActionContext.getContext().get("request"); request.put("list",list); //保存 returnSUCCESS;

}查詢成功后的xsKcs.jsp頁(yè)面,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)部署運(yùn)行程序,登錄后單擊“個(gè)人選課情況”超鏈接,可以查看當(dāng)前用戶的個(gè)人選課情況,如圖5.11所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(2)查詢所有課程信息在left.jsp中還有一個(gè)鏈接就是查詢所有課程,其實(shí)查詢出所有課程就是為了方便讓學(xué)生選課,其Action配置如下:<actionname="getAllKc"class="org.action.KcAction"> <resultname="success">allKc.jsp</result></action>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)對(duì)應(yīng)Action實(shí)現(xiàn)類,可以發(fā)現(xiàn)一個(gè)新的Action類名為KcAction.java,代碼如下:packageorg.action;importjava.util.*;importorg.dao.*;importorg.dao.imp.*;importcom.opensymphony.xwork2.*;publicclassKcActionextendsActionSupport{ publicStringexecute()throwsException{ KcDaokcDao=newKcDaoImp(); Listlist=kcDao.getAll(); //獲取所有課程信息 Maprequest=(Map)ActionContext.getContext().get("request"); request.put("list",list); //保存到request returnSUCCESS; }}顯示所有課程信息列表的JSP頁(yè)allKc.jsp,代碼。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)部署運(yùn)行程序,登錄、在主頁(yè)上單擊“所有課程信息”超鏈接,可顯示所有課程的信息列表,如圖5.12所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(3)選修課程在圖5.12中,每個(gè)課程的后面都有個(gè)“選修”超鏈接,提交給selectKc.action,該Action的配置如下:<actionname="selectKc"class="org.action.XsAction"method="selectKc"> <resultname="success">selectKc_success.jsp</result> <resultname="error">selectKc_fail.jsp</result></action>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)對(duì)應(yīng)Action實(shí)現(xiàn)類的方法(由于是學(xué)生選課,所以該方法在XsAction中),代碼如下://選定課程 publicStringselectKc()throwsException{ Mapsession=(Map)ActionContext.getContext().getSession(); Stringxh=((Dlb)session.get("user")).getXh(); xsDao=newXsDaoImp(); Xsbxs3=xsDao.getOneXs(xh); Setlist=xs3.getKcs(); Iteratoriter=list.iterator(); //選修課程時(shí)先遍歷已經(jīng)選的課程,如果在已經(jīng)選修的課程中找到就返回ERROR while(iter.hasNext()){ Kcbkc3=(Kcb)iter.next(); if(kc3.getKch().equals(kcb.getKch())){ returnERROR; } } list.add(newKcDaoImp().getOneKc(kcb.getKch())); //如果沒(méi)找到,就添加到集合中 xs3.setKcs(list); xsDao.update(xs3); returnSUCCESS;

}MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)成功頁(yè)面selectKc_success.jsp,代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA">

你已經(jīng)成功選擇該課程!</body></html>失敗頁(yè)面selectKc_fail.jsp,代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA">

你已經(jīng)選擇該課程,請(qǐng)不要重復(fù)選??!</body></html>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)部署運(yùn)行程序,登錄、單擊“所有課程信息”,單擊課程信息表格(如圖5.12所示)中某門(mén)課右邊的“選修”鏈接,如圖5.13所示(這里以選302號(hào)“軟件工程”課為例演示),后臺(tái)就會(huì)判斷該用戶是否已經(jīng)選修了該門(mén)課,如果已經(jīng)選修就會(huì)提示用戶已選,不要重復(fù)選??;如果沒(méi)有選修,就會(huì)提示用戶選修成功。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)然后再查看個(gè)人選課情況,會(huì)多出剛剛選修的課程信息,如圖5.14所示,說(shuō)明選課成功!MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)(4)退選課程退選操作很簡(jiǎn)單,只要把該學(xué)生的這個(gè)課程從Set中remove就行了。對(duì)應(yīng)的Action配置如下:<actionname="deleteKc"class="org.action.XsAction"method="deleteKc"> <resultname="success">deleteKc_success.jsp</result></action>MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)對(duì)應(yīng)XsAction類中的處理方法,代碼如下: //退選課程 publicStringdeleteKc()throwsException{ Mapsession=(Map)ActionContext.getContext().getSession(); Stringxh=((Dlb)session.get("user")).getXh(); xsDao=newXsDaoImp(); Xsbxs2=xsDao.getOneXs(xh); Setlist=xs2.getKcs(); Iteratoriter=list.iterator(); while(iter.hasNext()){ //取出所有選擇的課程進(jìn)行迭代 Kcbkc2=(Kcb)iter.next(); if(kc2.getKch().equals(kcb.getKch())){ //如果遍歷到退選的課程的課程號(hào)就從list中刪除 iter.remove(); } } xs2.setKcs(list); //設(shè)置課程的Set xsDao.update(xs2); returnSUCCESS;

}MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于SQLServer)退選課程成功界面deleteKc_success.jsp,代碼如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><html><bodybgcolor="#D9DFAA">

退選成功!</body></html>部署運(yùn)行程序,登錄、在個(gè)人選課情況界面(見(jiàn)圖5.14)上,單擊表格中“軟件工程”課信息右邊的“退選”鏈接,即可退選該課,讀者可自行操作測(cè)試一下效果。目錄MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于MySQL)021.安裝配置MySQL2.建立數(shù)據(jù)庫(kù)及表3.創(chuàng)建數(shù)據(jù)庫(kù)連接4.切換后臺(tái)數(shù)據(jù)庫(kù)5.修改映射文件MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于MySQL)【綜合案例五】把【綜合案例四】剛剛開(kāi)發(fā)的選課系統(tǒng)后臺(tái)數(shù)據(jù)庫(kù)改為MySQL,系統(tǒng)功能及界面不變。要求:僅DBMS換用MySQL,數(shù)據(jù)庫(kù)、表及其中樣本數(shù)據(jù)均不變。1.安裝配置MySQL本書(shū)用的MySQL版本為5.6,其安裝包可從/downloads/上免費(fèi)下載,下載得到的安裝文件名:mysql-installer-community-.msi(本書(shū)隨源碼提供),雙擊該安裝文件,按照向?qū)У闹敢惭b和配置MySQL數(shù)據(jù)庫(kù)。詳細(xì)的操作讀者可參考MySQL相關(guān)的書(shū)籍,本書(shū)不展開(kāi)講述。2.建立數(shù)據(jù)庫(kù)及表同【綜合案例四】第1步建的數(shù)據(jù)庫(kù)及表,參見(jiàn)本書(shū)附錄A,錄入的樣本數(shù)據(jù)也不變。有關(guān)在MySQL中創(chuàng)建數(shù)據(jù)庫(kù)和表的具體操作,也請(qǐng)讀者參考MySQL相關(guān)的書(shū)籍,本書(shū)不展開(kāi)講述。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于MySQL)3.創(chuàng)建數(shù)據(jù)庫(kù)連接在MyEclipse2017中創(chuàng)建對(duì)MySQL5.6的數(shù)據(jù)源連接,其操作與本書(shū)第1章【實(shí)例一】(1.3.2節(jié))第(2)步類同,但所用的JDBC驅(qū)動(dòng)程序包為mysql-connector-java-5.1.22-bin.jar,創(chuàng)建的連接名為mysql,該連接的具體配置細(xì)節(jié)如圖5.15所示。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于MySQL)4.切換后臺(tái)數(shù)據(jù)庫(kù)雙擊原項(xiàng)目的hibernate.cfg.xml文件,在其配置頁(yè)將數(shù)據(jù)庫(kù)驅(qū)動(dòng)連接改為mysql,如圖5.16所示,保存。MVC綜合開(kāi)發(fā)實(shí)戰(zhàn):學(xué)生選課系統(tǒng)(基于MySQL)5.修改映射文件因MySQL不支持?jǐn)?shù)據(jù)庫(kù)及表名稱大寫(xiě),默認(rèn)顯示是小寫(xiě),故必須修改原項(xiàng)目的ORM映射文件,將其中的數(shù)據(jù)庫(kù)及表名統(tǒng)一改成小寫(xiě)的形式,并去掉其中對(duì)數(shù)據(jù)庫(kù)所有者dbo的屬性設(shè)定。例如,原項(xiàng)目映射文件Xsb.hbm.xml中的語(yǔ)句:<classname="org.model.Xsb"table="XSB"schema="dbo"catalog="XSCJ">

要改成:<classname="org.model.Xsb"table="xsb"catalog="xscj">項(xiàng)目中一共是4個(gè)映射文件,凡是涉及數(shù)據(jù)庫(kù)名、表名大小寫(xiě)的地方都要改,詳見(jiàn)本書(shū)提供的源碼。第6章

Spring基礎(chǔ)及應(yīng)用——使用Spring的動(dòng)機(jī)目錄工

式01工廠模式【例6.1】工廠模式的實(shí)現(xiàn)。創(chuàng)建一個(gè)JavaProject,命名為“FactoryExample”。在src文件夾下建立包face,在該包下建立接口Human,代碼如下:packageface;publicinterfaceHuman{ voideat(); voidwalk();}在src文件夾下建立包iface,在該包下建立Chinese類和American類,分別實(shí)現(xiàn)Human接口。Chinese.java代碼如下:packageiface;importface.Human;publicclassChineseimplementsHuman{ publicvoideat(){ System.out.println("中國(guó)人很會(huì)吃!"); } publicvoidwalk(){ System.out.println("中國(guó)人健步如飛!"); }}工廠模式American.java代碼如下:packageiface;importface.Human;publicclassAmericanimplementsHuman{ publicvoideat(){ System.out.println("美國(guó)人吃西餐!"); } publicvoidwalk(){ System.out.println("美國(guó)人經(jīng)常坐車(chē)!"); }}工廠模式在src文件夾下建包factory,在該包內(nèi)建立工廠類Factory,代碼如下:packagefactory;importiface.American;importiface.Chinese;importface.Human;publicclassFactory{ publicHumangetHuman(Stringname){ if(name.equals("Chinese")){ returnnewChinese(); }elseif(name.equals("American")){ returnnewAmerican(); }else{ thrownewIllegalArgumentException("參數(shù)不正確"); } }}工廠模式在src文件夾下建包test,在該包內(nèi)建立測(cè)試類Test,代碼如下:packagetest;importface.Human;importfactory.Factory;publicclassTest{ publicstaticvoidmain(String[]args){ Humanhuman=null; human=newFactory().getHuman("Chinese"); human.eat(); human.walk(); human=newFactory().getHuman("American"); human.eat(); human.walk(); }}該程序?yàn)镴ava應(yīng)用程序,直接運(yùn)行可得結(jié)果,如圖6.1所示。目錄Spring框架概述021.SpringCore2.SpringContext3.SpringAOP4.SpringDAO5.SpringORM6.SpringWeb7.SpringWebMVCSpring框架概述Spring是一個(gè)開(kāi)源框架,它的功能都是從實(shí)際開(kāi)發(fā)中抽取出來(lái)的,完成了大量JavaEE開(kāi)發(fā)中的通用步驟。Spring的主要優(yōu)勢(shì)之一是其分層架構(gòu),整個(gè)框架由7個(gè)定義良好的模塊(或組件)組成,它們都統(tǒng)一構(gòu)建在核心容器之上,如圖6.2所示,分層架構(gòu)允許用戶選擇使用任意一個(gè)組件。Spring框架概述1.SpringCore核心容器,提供Spring框架的基本功能,其主要組件BeanFactory也就是前述工廠模式的實(shí)現(xiàn)。它通過(guò)控制反轉(zhuǎn)機(jī)制,將應(yīng)用程序配置和依賴性規(guī)范與實(shí)際的程序代碼分離開(kāi)。2.SpringContext向Spring框架提供上下文信息,包括企業(yè)服務(wù),如JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度等。3.SpringAOP通過(guò)配置管理特性,可以很容易地使Spring框架管理的任何對(duì)象支持AOP。SpringAOP模塊直接將面向方面編程的功能集成到Spring框架中。它為基于Spring應(yīng)用程序的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)它,不用依賴EJB,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。4.SpringDAOJDBCDAO抽象層提供了有用的異常層次結(jié)構(gòu),用來(lái)管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫(xiě)的異常代碼數(shù)量(如打開(kāi)和關(guān)閉連接)。面向JDBC的異常符合通用的DAO異常層次結(jié)構(gòu)。Spring框架概述5.SpringORMSpring框架插入了若干ORM框架,提供ORM的對(duì)象關(guān)系工具,其中包括JDO、Hibernate和iBatisSQLMap,并且都遵從Spring的通用事務(wù)和DAO異常層次結(jié)構(gòu)。6.SpringWeb它為基于Web的應(yīng)用程序提供上下文。它建立在應(yīng)用程序上下文模塊之上,簡(jiǎn)化了處理多份請(qǐng)求及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ?。Spring框架支持與JakartaStruts的集成。7.SpringWebMVC它是一個(gè)全功能構(gòu)建Web應(yīng)用程序的MVC實(shí)現(xiàn)。通過(guò)策略接口實(shí)現(xiàn)高度可配置,MVC容納了大量視圖技術(shù),其中包括JSP、Velocity、Tiles、iText和POI。第6章

Spring基礎(chǔ)及應(yīng)用——Spring應(yīng)用基礎(chǔ)目錄依賴注入應(yīng)用011.為項(xiàng)目添加Spring開(kāi)發(fā)能力2.修改配置文件applicationContext.xml3.修改測(cè)試類4.運(yùn)行結(jié)果及分析依賴注入應(yīng)用【例6.2】Spring的簡(jiǎn)單應(yīng)用。1.為項(xiàng)目添加Spring開(kāi)發(fā)能力(1)右擊項(xiàng)目FactoryExample,選擇菜單【ConfigureFacets...】→【InstallSpringFacet】,在彈出對(duì)話框中單擊【Yes】按鈕,啟動(dòng)【InstallSpringFacet】向?qū)В凇癙rojectConfiguration”頁(yè)“Springversion”欄后的下拉列表中選擇要添加到項(xiàng)目中的Spring版本。為了最大限度地使用MyEclipse2017集成的Spring工具,這里選擇版本號(hào)為最高的Spring4.1,如圖6.3所示,單擊【Next】按鈕。依賴注入應(yīng)用(2)在“AddSpringCapabilities”頁(yè)中創(chuàng)建Spring的配置文件,如圖6.4所示,勾選“SpecifyneworexistingSpringbeanconfigurationfile?”復(fù)選框,在“Beanconfigurationtype”欄中選中“New”單選按鈕(表示新建一個(gè)Spring配置文件),“Folder”欄的內(nèi)容為“src”(表示配置文件位于項(xiàng)目src目錄下),“File”欄的內(nèi)容為“applicationContext.xml”(這是配置文件名),皆保持默認(rèn)狀態(tài)。單擊【Next】按鈕。依賴注入應(yīng)用(3)在“ConfigureProjectLibraries”頁(yè)中選擇要應(yīng)用的Spring類庫(kù)。在圖6.5的樹(shù)狀列表里選中Spring4.1的核心類庫(kù)Core,單擊【Finish】按鈕完成添加。依賴注入應(yīng)用此時(shí),在項(xiàng)目的src下會(huì)出現(xiàn)一個(gè)名為“applicationContext.xml”的文件(這個(gè)就是Spring的核心配置文件),同時(shí)出現(xiàn)名為“SpringBeans”和“Spring4.1.0Libraries”的兩個(gè)目錄,如圖6.6所示,說(shuō)明Spring已經(jīng)成功地添加到項(xiàng)目中了。依賴注入應(yīng)用2.修改配置文件applicationContext.xml以上操作完成后,項(xiàng)目的src文件夾下會(huì)出現(xiàn)名為applicationContext.xml的文件,如圖6.6所示,這就是Spring的核心配置文件。修改后,其代碼如下:<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p" xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.1.xsd"> <beanid="chinese"class="iface.Chinese"></bean> <beanid="american"class="iface.American"></bean></beans>依賴注入應(yīng)用3.修改測(cè)試類配置完成后,即可修改Test類,代碼如下:packagetest;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;importface.Human;publicclassTest{ publicstaticvoidmain(String[]args){ ApplicationContextctx=newFileSystemXmlApplicationContext("src/applicationContext.xml"); Humanhuman=null; human=(Human)ctx.getBean("chinese"); //依賴注入獲取"chinese" human.eat(); human.walk(); human=(Human)ctx.getBean("american"); //依賴注入獲取"american" human.eat(); human.walk(); }}依賴注入應(yīng)用4.運(yùn)行結(jié)果及分析運(yùn)行該測(cè)試類,結(jié)果同圖6.1所示。從這個(gè)程序可以看到,對(duì)象ctx就相當(dāng)于原來(lái)的Factory工廠,而原來(lái)的Factory可以刪除了。再回頭看applicationContext.xml文件配置:<beanid="chinese"class="iface.Chinese"></bean><beanid="american"class="iface.American"></bean>id是ctx.getBean的參數(shù)值(一個(gè)字符串),class是一個(gè)類(包名+類名)。然后在Test類里獲得Chinese對(duì)象和American對(duì)象:human=(Human)ctx.getBean("chinese");human=(Human)ctx.getBean("american");目錄注入的兩種方式021.設(shè)置注入2.構(gòu)造注入1.設(shè)置注入【例6.3】設(shè)置注入示例。創(chuàng)建一個(gè)JavaProject,命名為“FactoryExample1”。在項(xiàng)目的src文件夾下建立下面的源文件。Human的接口Human.java,代碼如下:publicinterfaceHuman{ voidspeak();}Language接口Language.java,代碼如下:publicinterfaceLanguage{ publicStringkind();}1.設(shè)置注入下面是Human實(shí)現(xiàn)類Chinese.java代碼:publicclassChineseimplementsHuman{ privateLanguagelan; publicvoidspeak(){ System.out.println(lan.kind()); } publicvoidsetLan(Languagelan){ this.lan=lan; }}下面是Language實(shí)現(xiàn)類English.java代碼:publicclassEnglishimplementsLanguage{ publicStringkind(){ return"中國(guó)人也會(huì)說(shuō)英語(yǔ)!"; }}1.設(shè)置注入可以看出,在Human的實(shí)現(xiàn)類中,要用到Language的對(duì)象。當(dāng)然,Language是一個(gè)接口,要用它的實(shí)現(xiàn)類為其創(chuàng)建對(duì)象,而這里只是為其寫(xiě)了一個(gè)set方法,下面通過(guò)Spring的配置文件來(lái)完成其對(duì)象的注入。代碼如下:<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p" xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.1.xsd"> <!--定義第一個(gè)Bean,注入Chinese類對(duì)象--> <beanid="chinese"class="Chinese"> <!--property元素用來(lái)指定需要容器注入的屬性,lan屬性需要容器注入 ref就指向lan注入的id--> <propertyname="lan"ref="english"></property> </bean> <!--注入English--> <beanid="english"class="English"></bean></beans>1.設(shè)置注入Spring會(huì)自動(dòng)接管每個(gè)Bean定義里的property元素定義。Spring會(huì)在執(zhí)行無(wú)參數(shù)的構(gòu)造器并創(chuàng)建默認(rèn)的Bean實(shí)例后,調(diào)用對(duì)應(yīng)的set方法為程序注入屬性值。每個(gè)Bean的id屬性是該Bean的唯一標(biāo)識(shí),程序通過(guò)id屬性訪問(wèn)Bean,而且各個(gè)Bean之間的依賴關(guān)系也通過(guò)id屬性關(guān)聯(lián)。測(cè)試代碼如下:importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassTest{publicstaticvoidmain(String[]args){ ApplicationContextctx=newFileSystemXmlApplicationContext("src/applicationContext.xml"); Humanhuman=null; human=(Human)ctx.getBean("chinese"); human.speak();}}1.設(shè)置注入程序運(yùn)行結(jié)果如圖6.7所示。2.構(gòu)造注入例如,只要對(duì)前面的Chinese類進(jìn)行簡(jiǎn)單的修改:publicclassChineseimplementsHuman{ privateLanguagelan; publicChinese(){}; //構(gòu)造注入所需要的帶參數(shù)的構(gòu)造函數(shù) publicChinese(Languagelan){ this.lan=lan; } publicvoidspeak(){ System.out.println(lan.kind()); }}此時(shí),Chinese類無(wú)須lan屬性的set方法,在構(gòu)造Human實(shí)例的時(shí)候,Spring為Human實(shí)例注入所依賴的Language實(shí)例。2.構(gòu)造注入配置文件也需要進(jìn)行簡(jiǎn)單的修改:<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="/schema/p" xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-4.1.xsd"> <!--定義第一個(gè)Bean,注入Chinese類對(duì)象--> <beanid="chinese"class="Chinese"> <!--使用構(gòu)造注入,為Chinese實(shí)例注入Language實(shí)例--> <constructor-argref="english"></constructor-arg> </bean> <!--注入English--> <beanid="english"class="English"></bean></beans>第6章

Spring基礎(chǔ)及應(yīng)用——Spring核心接口及配置目錄Spring核心接口011.BeanFactory2.ApplicationContext1.BeanFactory在Spring中有幾種BeanFactory的實(shí)現(xiàn),其中最常使用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根據(jù)XML文件中的定義裝載Bean。要?jiǎng)?chuàng)建XmlBeanFactory,需要傳遞一個(gè)java.io.InputStream對(duì)象給構(gòu)造函數(shù)。InputStream對(duì)象提供XML文件給工廠。例如,下面的代碼片段使用一個(gè)java.io.FileInputStream對(duì)象把BeanXML定義文件給XmlBeanFactory:BeanFactoryfactory=newXmlBeanFactory(newFileInputStream("applicationContext.xml"));這行簡(jiǎn)單的代碼告訴BeanFactory從XML文件中讀取Bean的定義信息,但是現(xiàn)在BeanFactory沒(méi)有實(shí)例化Bean,Bean被延遲載入到BeanFactory中,即BeanFactory會(huì)立即把Bean定義信息載入進(jìn)來(lái),但是Bean只有在需要的時(shí)候才被實(shí)例化。為了從BeanFactory得到Bean,只要簡(jiǎn)單地調(diào)用getBean()方法,把需要的Bean的名字當(dāng)作參數(shù)傳遞進(jìn)去即可。由于得到的是Object類型,所以要進(jìn)行強(qiáng)制類型轉(zhuǎn)化。MyBeanmyBean=(MyBean)factory.getBean("myBean");2.ApplicationContext表面上,ApplicationContext和BeanFactory差不多,兩者都是載入Bean定義信息,裝配Bean,根據(jù)需要分發(fā)Bean,但是ApplicationContext提供了更多功能。①應(yīng)用上下文提供了文本信息解析工具,包括對(duì)國(guó)際化的支持。②應(yīng)用上下文提供了載入文本資源的通用方法,如載入圖片。③應(yīng)用上下文可以向注冊(cè)為監(jiān)聽(tīng)器的Bean發(fā)送事件。由于它提供的附加功能,幾乎所有的應(yīng)用系統(tǒng)都選擇ApplicationContext,而不是BeanFactory。在ApplicationContext的諸多實(shí)現(xiàn)中,有如下三個(gè)常用的實(shí)現(xiàn)。

ClassPathXmlApplicationContext:從類路徑中的XML文件載入上下文定義信息,把上下文定義文件當(dāng)成類路徑資源。

FileSystemXmlApplicationContext:從文件系統(tǒng)中的XML文件載入上下文定義信息。

XmlWebApplicationContext:從Web系統(tǒng)中的XML文件載入上下文定義信息。例如:ApplicationContextcontext=newFileSystemXmlApplicationContext("c:/foo.xml");ApplicationContextcontext=newClassPathXmlApplicationContext("foo.xml");ApplicationContextcontext= WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());目錄Spring基本配置021.使用XML裝配2.添加一個(gè)Bean1.使用XML裝配理論上,Bean裝配可以從任何配置資源獲得。但實(shí)際上,XML是最常見(jiàn)的Spring應(yīng)用系統(tǒng)配置源。如下的XML文件展示了一個(gè)簡(jiǎn)單的Spring上下文定義文件:<?xmlversion="1.0"encoding="UTF-8"?>…<beans…> //根元素 <beanid="foo"class="com.spring.Foo"/> //Bean實(shí)例 <beanid="bar"class="com.spring.Bar"/> //Bean實(shí)例</beans>在XML文件定義Bean,上下文定義文件的根元素<beans>。<beans>有多個(gè)<bean>子元素。每個(gè)<bean>元素定義了一個(gè)Bean(任何一個(gè)Java對(duì)象)如何被裝配到Spring容器中。2.添加一個(gè)Bean在Spring中對(duì)一個(gè)Bean的最基本配置包括Bean

溫馨提示

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

評(píng)論

0/150

提交評(píng)論