版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實(shí)例詳解(一)2012-07-3115:35198人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)
Spring更新到3.0之后,其MVC框架加入了一個(gè)非常不錯(cuò)的東西——那就是REST。它的開放式特性,與Spring的無縫集成,以及Spring框架的優(yōu)秀表現(xiàn),使得現(xiàn)在很多公司將其作為新的系統(tǒng)開發(fā)框架。大象根據(jù)實(shí)際的項(xiàng)目經(jīng)驗(yàn),以之前SSH2例子為基礎(chǔ),對(duì)其進(jìn)行一次大改造,詳細(xì)的為大家講解如何實(shí)現(xiàn)SSM3全注解式的開發(fā)。
這次大象將采取兩種構(gòu)建方式,一是很多人喜歡用的MyEclipse,另一個(gè),則是用Eclipse+Maven。這一篇,將主要講解開發(fā)環(huán)境設(shè)置與Maven構(gòu)建方式。
1、開發(fā)環(huán)境
JDK1.6.0_18
Eclipse3.2.1MyEclipse5.1.0
Eclipse-JEE-HELIOS-SR2Maven3.0.1m2
Tomcat6.0.10maven-jetty-plugin6.1.26
MySQL5.0.27NavicatLiteforMySQL8.1.20
每個(gè)人的開發(fā)環(huán)境可能會(huì)有差異,但有一點(diǎn)我需要說明的是,JDK的版本不得低于1.5,因?yàn)橛玫搅撕芏?.5版才支持的新特性。Tomcat、Jetty、Maven和MySQL請(qǐng)不要低于我所用的版本,因?yàn)槲覜]在其它的版本上進(jìn)行測(cè)試。Navicat則是MySQL數(shù)據(jù)庫(kù)的圖形化操作工具。接下來我將介紹如何在Eclipse3.6中,使用m2eclipse插件構(gòu)建web應(yīng)用及測(cè)試開發(fā)環(huán)境。
2、設(shè)置Maven
Maven的安裝很簡(jiǎn)單,只需要解壓即可,請(qǐng)?jiān)O(shè)置PATH變量,這樣可以使用命令行進(jìn)行操作,然后就要在%MAVEN_HOME%\conf目錄下,對(duì)settings.xml作下修改
這就是設(shè)置本地倉(cāng)庫(kù),目錄可以根據(jù)自己的實(shí)際情況更改,不過請(qǐng)使用"/"正斜杠,因?yàn)槲以趯?shí)際使用中,發(fā)現(xiàn)反斜杠有時(shí)候獲取不到資源。對(duì)于個(gè)人使用,設(shè)置好這個(gè)就OK了,至于Nexus配置不在本文討論范圍內(nèi),大家如有興趣可以去看看juvenxu的博客,他是目前公認(rèn)的Maven專家。
3、安裝m2eclipse
選擇Help->InstallNewSoftware...在彈出的窗口中,點(diǎn)擊Add...又會(huì)彈出一個(gè)小窗口,輸入m2eclipse的安裝地址,如下圖所示:
輸入完成后,點(diǎn)擊OK,這時(shí)Eclipse就開始查找這個(gè)插件了,請(qǐng)耐心等一會(huì)。
插件找到后,請(qǐng)勾選要安裝的內(nèi)容,接下來就是一般的安裝流程了,此處省略500字。安裝完成請(qǐng)重新啟動(dòng)Eclipse,然后再對(duì)這個(gè)插件進(jìn)行一番設(shè)置。
4、設(shè)置m2eclipse
進(jìn)入Perferences,選擇Maven,去掉Downloadrepositoryindexupdatesonstartup前的勾,默認(rèn)情況是會(huì)在每次啟動(dòng)Eclipse的時(shí)候自動(dòng)去Maven中央倉(cāng)庫(kù)下載索引,這無疑是非常不好的,要知道Maven中央倉(cāng)庫(kù)所包含的jar資源非常龐大,而且每天都會(huì)有很多新的項(xiàng)目上傳,弄不好Eclipse還沒開始用,就被這些東西搞掛掉了。
接下來選擇Installations將這個(gè)插件自帶的Maven換成之前安裝的Maven,這樣就保證了版本的一致性。
設(shè)置好這個(gè)之后,再點(diǎn)擊UserSettings,用本機(jī)maven的settings.xml替換默認(rèn)的配置文件,因?yàn)槟J(rèn)的設(shè)置是會(huì)將本地倉(cāng)庫(kù)放到系統(tǒng)盤符\DocumentsandSettings\用戶目錄\.m2\repository這個(gè)目錄下面。
大家可以看到,用maven中的配置文件替換后,下面的LocalRepository自動(dòng)變更為settings.xml中的設(shè)置。
5、創(chuàng)建maven工程
做完這些,我們就可以開始創(chuàng)建Maven工程了。選擇New->other...->Maven->MavenProject,然后選擇下一步
請(qǐng)?jiān)O(shè)置工作空間路徑,大象的默認(rèn)工作空間放在eclipse的根目錄下面,這里的Location顯示的應(yīng)該為空,為了進(jìn)行說明,特將路徑顯示出來。確定沒問題后,Next>
這個(gè)列表顯示的就是maven支持的所有項(xiàng)目創(chuàng)建類型,我們是開發(fā)web應(yīng)用,所以請(qǐng)選擇maven-archetype-webapp
最后一步輸入我們要?jiǎng)?chuàng)建的項(xiàng)目,在Maven世界中,使用坐標(biāo)來唯一標(biāo)識(shí)一個(gè)構(gòu)件,可以理解為項(xiàng)目,資源等等。GroupId表示當(dāng)前項(xiàng)目所屬的實(shí)際項(xiàng)目,ArtifactId定義實(shí)際項(xiàng)目中的一個(gè)Maven項(xiàng)目,根據(jù)名字就可以看出來,GroupId是一個(gè)大范圍,而ArtifactId是一個(gè)小范圍。比如大家都很熟悉的spring,就分成了spring-core.jar、spring-beans.jar、spring-context.jar等等。在maven里面,它的GroupId就是org.springframework,而ArtifactId則為spring-core、spring-beans、spring-context。怎么樣?理解了沒有?
到此,項(xiàng)目生成了,請(qǐng)展開src/main,在main目錄下新建一個(gè)java文件夾,打開ssm3的項(xiàng)目屬性,選擇JavaBuildPath->Source->AddFolder...->勾選java,這樣做的目的,就是將src/main/java這個(gè)路徑作為源文件的文件夾,這和以往用MyEclipse做開發(fā)的目錄結(jié)構(gòu)是不同的。而maven的規(guī)則也是這樣定義的,假如你不進(jìn)行這個(gè)設(shè)置,就算你在main下面創(chuàng)建了java目錄,再添加包或類時(shí),就會(huì)有問題,大家試試,看會(huì)出現(xiàn)什么錯(cuò)誤。
6、運(yùn)行ssm3
接下來,在pom.xml里面加入maven-jetty-plugin插件,默認(rèn)生成的配置都可以去掉,整個(gè)pom就只有下圖所示的配置。
打開RunConfigurations,這有多種方式打開,可以從菜單Run里面選,也可以從工具欄選擇,還可以在項(xiàng)目點(diǎn)擊右鍵選擇。
在彈出的窗口,MavenBuild里面設(shè)置運(yùn)行參數(shù),點(diǎn)擊BrowseWorkspace...會(huì)彈出下圖那個(gè)小窗口,設(shè)定Basedirectory,加入jetty:run,點(diǎn)擊Run,啟動(dòng)jetty
在瀏覽器中輸入http://localhost:8080/ssm3會(huì)顯示HelloWorld!,調(diào)用的是ssm3/main/webapp/index.jsp,大象加了點(diǎn)內(nèi)容,結(jié)果就是這樣的
到這里,關(guān)于在Eclipse里搭建maven環(huán)境,配置,創(chuàng)建,運(yùn)行,測(cè)試就全部講完了,大家動(dòng)手做做,熟悉一下這種開發(fā)方式,接下來就會(huì)在這個(gè)骨架上開發(fā)SSM3示例。恩,我們下次繼續(xù)。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二)2012-07-3115:37345人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)
在上一篇文章中我詳細(xì)的介紹了如何搭建maven環(huán)境以及生成一個(gè)maven骨架的web項(xiàng)目,那么這章中我將講述SpringMVC的流程結(jié)構(gòu),SpringMVC與Struts2的區(qū)別,以及例子中的一些配置文件的分析。
一、SpringMVC3.0介紹
SpringMVC是一個(gè)典型的MVC框架,是Spring內(nèi)置的Web框架,可以作為應(yīng)用項(xiàng)目的展示層,繼Spring2.0對(duì)SpringMVC進(jìn)行重大升級(jí)后,Spring2.5又為SpringMVC引入了注解驅(qū)動(dòng)功能,再到3.0時(shí)代,全面支持REST的網(wǎng)絡(luò)服務(wù)和更容易的網(wǎng)絡(luò)編程。這一系列的變革,無疑吸引著我們走進(jìn)SpringMVC3.0的世界。
REST功能是SpringMVC3.0新增的,它通過不帶擴(kuò)展名的URL來訪問系統(tǒng)資源。REST是把訪問的所有資源看成靜態(tài)的,一個(gè)或一組,每個(gè)不同的URL地址都是一個(gè)靜態(tài)資源。那么SpringMVC3.0是如何支持REST的呢?簡(jiǎn)單的說,它是通過@RequestMapping及@PathVariable注解提供的,在@RequestMapping中指定value與method,就可以處理對(duì)應(yīng)的請(qǐng)求。另外springmvc框架還做了很多很多工作。
二、SpringMVC流程
大象根據(jù)官方文檔的介紹,以及自己的理解,畫了一個(gè)SpringMVC的流程結(jié)構(gòu)圖,大家可以參考下。
1、SpringMVC的核心是DispatcherServlet,當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求時(shí),這個(gè)請(qǐng)求經(jīng)過一系列過濾器處理。然后DispatcherServlet會(huì)接收到這個(gè)請(qǐng)求。
2、DispatcherServlet會(huì)從HandlerMapping對(duì)象中查找與請(qǐng)求匹配的Controller,并將結(jié)果返回給DispatcherServlet。
3、DispatcherServlet將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)Controller,如果定義有攔截器,則會(huì)經(jīng)過這些攔截器處理。
4、標(biāo)Controller處理完成業(yè)務(wù)邏輯后,會(huì)返回一個(gè)結(jié)果給DispatcherServlet。
5、DispatcherServlet根據(jù)結(jié)果查詢ViewResolver,找到與之對(duì)應(yīng)的視圖對(duì)象,同樣將結(jié)果返回給DispatcherServlet。
6、DispatcherServlet根據(jù)指定的顯示結(jié)果,調(diào)用模板對(duì)象渲染view。
7、將view返回給客戶端。
根據(jù)上面的說明,可以很很明顯的看出,SpringMVC的核心是Servlet,并且創(chuàng)建的Controller其實(shí)也是一個(gè)Servlet。
三、Spring與struts2比較
另一個(gè)非常有名的MVC框架是Struts2,SpringMVC的核心是Servlet,而Struts2的核心則是Filter。下表列出SpringMVC與Struts2的主要區(qū)別與比較結(jié)果。
通過上面的綜合比較,SpringMVC3.0的優(yōu)勢(shì)要比Struts2大得多,雖然它還有些不足的地方,但隨著后期版本的升級(jí),必然會(huì)進(jìn)行改進(jìn),會(huì)做的更好。所以采用SpringMVC3.0作為系統(tǒng)的展示層要比Struts2好。
四、線程安全
由于SpringMVC默認(rèn)是Singleton的,所以會(huì)產(chǎn)生一個(gè)潛在的安全隱患。根本核心是instance變量保持狀態(tài)的問題。
這個(gè)問題有兩種解決辦法:
a)
在控制器中不使用實(shí)例變量
b)
將控制器的作用域從單例改為原型
這兩種做法有好有壞,第一種,需要開發(fā)人員擁有較高的編程水平與思想意識(shí),在編碼過程中力求避免出現(xiàn)這種BUG,而第二種則是容器自動(dòng)的對(duì)每個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,由JVM進(jìn)行垃圾回收,因此做到了線程安全。使用第一種方式的好處是實(shí)例對(duì)象只有一個(gè),所有的請(qǐng)求都調(diào)用該實(shí)例對(duì)象,速度和性能上要優(yōu)于第二種,不好的地方,就是需要程序員自己去控制實(shí)例變量的狀態(tài)保持問題。第二種由于每次請(qǐng)求都創(chuàng)建一個(gè)實(shí)例,所以會(huì)消耗較多的內(nèi)存空間。
五、配置文件
SpringMVC是Spring的一個(gè)組成部分,所以配置文件就會(huì)變得簡(jiǎn)單許多。以下就是本例子中最重要的幾個(gè)配置文件。
1、pom.xml
管理項(xiàng)目依賴,編譯,發(fā)布,插件配置等等。所有的依賴包都由配置決定,另外所需依賴包的其它依賴,無需配置,maven會(huì)自動(dòng)獲取并進(jìn)行管理,這無疑幫我們減少了很多工作量,再也不用為到處找jar包,或版本不一致而頭疼了。
定義依賴版本屬性
Spring依賴,本例是一個(gè)很基礎(chǔ)的例子,所以有這些就夠了,以后有擴(kuò)展再增加。
MyBatis依賴,iBatis從3.0版之后就改名為MyBatis。這個(gè)例子,大象沒有使用Hibernate,而是采用更輕量級(jí)的MyBatis來作為持久層框架,使用很簡(jiǎn)單,也很靈活。另外,本例還用到了一個(gè)mybatis-spring插件,這是因?yàn)閟pring3.0.5僅支持ibatis2.0,所以需要這個(gè)插件來處理底層數(shù)據(jù)源等工作。
本例用到了AOP,所以需要這兩個(gè)依賴
下面是其它一些必須的依賴,值得說明的就是,因?yàn)樵诒纠校笙髮?duì)Service還是用的類,沒有進(jìn)行基于接口的實(shí)現(xiàn)方式,所以需要cglib這個(gè)依賴。另外,頁(yè)面使用html作為展示層,使用freemarker標(biāo)簽處理動(dòng)態(tài)數(shù)據(jù)。
2、web.xml
與ssh2的web.xml主要的區(qū)別就是替換Struts2的啟動(dòng)配置,改為SpringMVC的設(shè)置,配置如下:
servlet-context.xml包含容器啟動(dòng)時(shí),所要執(zhí)行的內(nèi)容,而service-context.xml則是接下來由spring上下文監(jiān)聽器對(duì)其進(jìn)行掃描執(zhí)行。這兩個(gè)配置文件可以合并成一個(gè),大象為了便于管理,并且為了使用spring上下文,寫成了兩個(gè)文件。如果我們不指定init-param配置,默認(rèn)的,在服務(wù)器啟動(dòng)時(shí),會(huì)在WEB-INF目錄下查找命名規(guī)則為<servlet-name>-servlet.xml的文件,對(duì)應(yīng)到這里就是ssm3-servlet.xml文件,大象統(tǒng)一將所有文件都放在了classpath下面。
3、servlet-context.xml
SpringMVC啟動(dòng)時(shí)的配置文件,包含組件掃描、url映射以及設(shè)置freemarker參數(shù),讓spring不掃描帶有@Service注解的類。為什么要這樣設(shè)置?因?yàn)閟ervlet-context.xml與service-context.xml不是同時(shí)加載,如果不進(jìn)行這樣的設(shè)置,那么,spring就會(huì)將所有帶@Service注解的類都掃描到容器中,等到加載service-context.xml的時(shí)候,會(huì)因?yàn)槿萜饕呀?jīng)存在Service類,使得cglib將不對(duì)Service進(jìn)行代理,直接導(dǎo)致的結(jié)果就是在service-context中的事務(wù)配置不起作用,發(fā)生異常時(shí),無法對(duì)數(shù)據(jù)進(jìn)行回滾。另外能夠?qū)ESTURL解析為請(qǐng)求映射的是DefaultAnnotationHandlerMapping這個(gè)類,它在啟動(dòng)時(shí),對(duì)Controller中所有標(biāo)注了@RequestMapping注解的方法,都放到了一個(gè)HandlerMapping對(duì)象中,當(dāng)有請(qǐng)求時(shí),就在這個(gè)對(duì)象中進(jìn)行查找是否有與之匹配路徑的處理方法,有則執(zhí)行,沒有就會(huì)輸出一個(gè)NotPageFound警告信息。
展示層使用freemarker模板引擎,為了便于編輯,大象在這里使用html作為展示頁(yè)。Spring框架對(duì)freemarker進(jìn)行了集成與封裝,配置起來非常簡(jiǎn)單。主要是定義FreeMarker視圖解析器與屬性配置,網(wǎng)上有很多關(guān)于這些屬性含義的介紹,大象就不在這里啰嗦了,后面講到SpringMVC的時(shí)候會(huì)結(jié)合代碼來進(jìn)行說明。SpringMVC支持多種類型的視圖文件。如:jsp、freemarker、velocity、tiles、jasperreports等。
4、service-context.xml
與ssh2里面的application.xml區(qū)別不大,主要是將hibernate那部分改為mybatis,還要將MybatisDao基類配置進(jìn)來,以便Service類可以用注解的方式引入,然后就是掃描包路徑,不掃描帶有@Controller注解的類。因?yàn)檫@些類已經(jīng)隨容器啟動(dòng)時(shí),在servlet-context中掃描過一遍了。
5、mybatis-config.xml
mybatis的主配置,里面包含了POJO的映射文件,這里了解一下就行,后面的章節(jié)會(huì)對(duì)這些進(jìn)行說明,熟悉ibatis的朋友就很簡(jiǎn)單了,可以直接跳過。
到此,關(guān)于配置文件的說明就講完了,因?yàn)檫@個(gè)SSM3的例子采用maven來構(gòu)建,與之前的SSH2不一樣,大象對(duì)配置文件進(jìn)行了簡(jiǎn)要的說明,使用maven的好處,大家應(yīng)該看出來了,它對(duì)于開發(fā)構(gòu)建來說顯得簡(jiǎn)單一些,可以使你不需要到處去找jar包,也不用你去擔(dān)心版本不一致的問題,另外,對(duì)于依賴的jar包,它還能自動(dòng)去查找它自己的依賴,這可以減少我們很多不必要的重復(fù)勞動(dòng)。下一章,我將分析下本例的層次結(jié)構(gòu)與MyBatis的簡(jiǎn)單運(yùn)用。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實(shí)例詳解(三)2012-07-3115:38789人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)
前兩章我為大家詳細(xì)介紹了如何搭建Maven環(huán)境、SpringMVC的流程結(jié)構(gòu)、SpringMVC與Struts2的區(qū)別以及示例中的一些配置文件的分析。在這一章,我就對(duì)示例的層次結(jié)構(gòu)進(jìn)行說明,以及MyBatis的一些簡(jiǎn)單介紹。
本文不會(huì)對(duì)MyBatis作詳細(xì)說明,大象還是假定閱讀本文的朋友對(duì)MyBatis(ibatis)有最基本的了解,只有這樣才能較好的理解本文的內(nèi)容。關(guān)于MyBatis請(qǐng)查看它的官方文檔及其它參考資料,本文不作詳細(xì)討論。
一、工程結(jié)構(gòu)圖
上面這是典型的Maven項(xiàng)目結(jié)構(gòu)形式,使用本地倉(cāng)庫(kù)管理jar包的依賴,使用插件打包編譯發(fā)布非常方便,讓我們從傳統(tǒng)的開發(fā)方式中解放出來,大家都快來使用Maven構(gòu)建項(xiàng)目吧!
二、映射文件
使用MyBatis進(jìn)行持久化操作,需要設(shè)置一個(gè)映射文件,一般來說,每張表對(duì)應(yīng)一個(gè)實(shí)體對(duì)象和一個(gè)mapper映射文件。而MyBatis里面沒有像Hibernate那樣復(fù)雜的關(guān)聯(lián)關(guān)系,所以,它的每個(gè)實(shí)體類其實(shí)就是一個(gè)很普通的POJO類。而映射文件中,都是SQL語(yǔ)句,下面就是示例中RoleMapper.xml的代碼片段。
那么,MyBatis是如何將數(shù)據(jù)庫(kù)字段與POJO對(duì)象進(jìn)行映射的呢?這是在它的內(nèi)部,會(huì)將到得的結(jié)果或結(jié)構(gòu)集,與我們定義的POJO對(duì)象屬性進(jìn)行映射,規(guī)則是,屬性首字母小寫,使用駝峰式命名方式,而字段則是單詞與單詞間,用下劃線連接。比如:數(shù)據(jù)庫(kù)有個(gè)USER_NAME字段,那么與它對(duì)應(yīng)的屬性就應(yīng)該是userName。如果字段命名沒有使用下劃線,那么屬性可以直接定義成該單詞。比如,NAME字段,它的屬性就是name。
三、基于namespace接口與公用dao的區(qū)別
從MyBatis3.0開始,對(duì)mapper中的namespace屬性新增了一個(gè)特性:可以指定具體的接口來作為持久化操作類,在接口中定義與映射文件中id屬性值相同的方法,MyBatis會(huì)自動(dòng)去綁定和執(zhí)行對(duì)應(yīng)的SQL語(yǔ)句。這種接口實(shí)現(xiàn)方式,需要為每個(gè)Mapper創(chuàng)建一個(gè)接口,如果系統(tǒng)做大了,維護(hù)這些類會(huì)比較麻煩,大象個(gè)人傾向于基礎(chǔ)服務(wù)式的Dao實(shí)現(xiàn)類,如例子中的MyBatisDao。
四、MyBatisDao
持久化操作基類,SqlSessionDaoSupport是mybatis-spring插件中封裝的,用于獲得SQLSession連接,執(zhí)行數(shù)據(jù)庫(kù)操作,我定義了幾個(gè)常用的方法。
關(guān)于mybatis-spring插件我簡(jiǎn)單介紹一下,
Spring3.x的發(fā)布并沒有對(duì)MyBatis這一優(yōu)秀的SQL框架提供支持,雖然在它的問題列表中已經(jīng)有這樣的請(qǐng)求,但直到目前3.0.5版的發(fā)布,都還沒將這個(gè)問題處理掉。不過這難不倒開源世界里廣大的愛好者與貢獻(xiàn)者,mybatis-spring就是在這樣的情況下誕生了。它是由MyBatis社區(qū)愛好者完成的一個(gè)開源項(xiàng)目,用來進(jìn)行Spring3.0與MyBatis3.0的配置整合。該插件需要運(yùn)行在JDK5.0或更高版本。
五、Service
在ssm3這個(gè)示例中,大家有沒有發(fā)現(xiàn),已經(jīng)沒有為每個(gè)entity定義一個(gè)dao,而是統(tǒng)一的調(diào)用MyBatisDao作為存儲(chǔ)服務(wù)接口。另外與使用Hibernate的主要區(qū)別,就是不能直接傳一個(gè)對(duì)象參數(shù),還必須寫上key值,它是namespace加上ID值。
六、entity
MyBatis的實(shí)體類就是一個(gè)簡(jiǎn)單的POJO對(duì)象,只是用來與表字段進(jìn)行關(guān)聯(lián)映射,請(qǐng)注意,我這里所說的映射不是像Hibernate那種綁定關(guān)系,只一種存放數(shù)據(jù)的對(duì)象而已。
七、測(cè)試
上面的步驟完成后,接下來就需要測(cè)試下我們的業(yè)務(wù)接口是否正常,編寫一個(gè)測(cè)試類,為了達(dá)到目的,簡(jiǎn)便起見,大象是對(duì)RoleService進(jìn)行測(cè)試,UserService同理類似。
在寫測(cè)試用例前,需要在POM文件中加入一個(gè)Srping測(cè)試依賴,這是大象在前面兩章疏忽漏掉了,請(qǐng)大家諒解。
然后編寫測(cè)試類,運(yùn)行測(cè)試,通過!
到此,這一章的內(nèi)容就講完了,如果有對(duì)注解不理解的地方,請(qǐng)看下我之前的SSH2系列之三,至于MyBatis,它的內(nèi)容太多了,如果不清楚還請(qǐng)先看下使用指南。下一章我將會(huì)介紹web層,以及使用SpringMVC的注解來實(shí)現(xiàn)控制器功能。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實(shí)例詳解(四)2012-07-3115:40607人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)
這一章大象將詳細(xì)分析web層代碼,以及使用SpringMVC的注解及其用法和其它相關(guān)知識(shí)來實(shí)現(xiàn)控制器功能。
之前在使用Struts2實(shí)現(xiàn)MVC的注解時(shí),是借助struts2-convention這個(gè)插件,如今我們使用Spring自帶的spring-webmvc組件來實(shí)現(xiàn)同樣的功能,而且比之以前更簡(jiǎn)單。另外,還省掉了整合兩個(gè)框架帶來的不穩(wěn)定因素。
對(duì)于SpringMVC框架,我主要講一下它的常用注解,再結(jié)合一些示例進(jìn)行說明,方便大家能夠快速理解。
一、SpringMVC常用注解說明
@Controller
在類上面定義,表明該類為控制器,返回字符串與redirect:xxx
@RequestMapping
在類或方法上面使用此注解,設(shè)置URL訪問地址。它有兩個(gè)屬性,value指定訪問路徑,method指定指定請(qǐng)求方式,請(qǐng)求方式在RequestMethod這個(gè)類中,全部以常量形式定義,它默認(rèn)使用GET請(qǐng)求。
@RequestParam
指定Request請(qǐng)求參數(shù),在方法參數(shù)中定義,相當(dāng)于傳統(tǒng)的request.getParameter()。
@PathVariable
獲取URL訪問路徑變量,這是SpringMVC3.0框架才加入的特性,基于RESTful風(fēng)格的URL訪問路徑。
@ModelAttribute
全局式的方法,在一組URL訪問路徑中,每次都會(huì)執(zhí)行,方法返回結(jié)果保存在module會(huì)話中。
@Service
在類上面定義,指定被注解的類是業(yè)務(wù)邏輯組件,如果不指定具體的BeanID,則采用默認(rèn)命名方式,即類名的首字母小寫。之前在SSH2中,大象曾對(duì)Dao組件使用@Repository,本例只有業(yè)務(wù)層,所以就只用@Service注解。
@Autowired
IoC自動(dòng)注入功能,替換以前的set寫法,在SSH2中就已經(jīng)開始使用了。
@Qualifier
對(duì)同一接口類有不同實(shí)現(xiàn)指定具體的實(shí)現(xiàn)類。
@ResponseBody
同樣定義在方法上,Ajax調(diào)用聲明,指定方法返回結(jié)果為Ajax回調(diào)函數(shù)結(jié)果。這是SpringMVC3.0框架中增加的一個(gè)新特性。
@InitBinder
初始化數(shù)據(jù)綁定與類型轉(zhuǎn)換,將傳入的參數(shù)轉(zhuǎn)換為自定義類型,或者對(duì)參數(shù)進(jìn)行自定義處理。
二、示例
@RequestMapping在類名上面定義,相當(dāng)于指定的URL是此控制器內(nèi)的所有其它訪問路徑的父路徑。如果在某個(gè)方法上面定義@RequestMapping注解,則相對(duì)于父路徑來說,是其子路徑。如果不定義value值,那么按父路徑訪問就會(huì)被默認(rèn)執(zhí)行。但請(qǐng)注意,默認(rèn)的訪問方式只能有一個(gè)。
對(duì)于UserController的list方法REST訪問URL為http://localhost:8080/ssm3/user,而且它同時(shí)接收GET和POST兩種請(qǐng)求。另外,SpringMVC3.0有一個(gè)很靈活的特性,可以自定義方法參數(shù)??纯磍ist方法,我設(shè)定了兩個(gè)參數(shù),一個(gè)Model,一個(gè)User對(duì)象。Model是用來渲染數(shù)據(jù),生成頁(yè)面用的。相當(dāng)于request.setAttribute,你可以這樣理解,但不能就這樣認(rèn)為,Model以及另一個(gè)ModelMap,都是作為視圖模型傳遞參數(shù)的,它們的作用域?yàn)閞equest。除此之外,你還可以定義HttpServletRequest、HttpServletResponse等等各種各樣的參數(shù)。
如果一個(gè)類還要定義其它資源訪問怎么辦呢?請(qǐng)看下面的RoleController
在RoleController上定義了全局路徑/role,這樣一來,對(duì)于和角色相關(guān)的資源都會(huì)以/role開頭,比如創(chuàng)建角色/role/new;編輯角色/role/edit/{id}等等。
上圖edit方法中的{id}寫法,就是RESTfulURL風(fēng)格,與@PathVariable搭配來一起實(shí)現(xiàn)該功能。它表示所請(qǐng)求的URL中,可以將變量值作為參數(shù)進(jìn)行動(dòng)態(tài)的傳遞。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了可以用數(shù)字,還可以用字符串,還可以多定義幾個(gè)變量:/role/edit/{id}/{type}等等。
每個(gè)方法的返回值,其實(shí)都對(duì)應(yīng)著一個(gè)結(jié)果頁(yè)面,這一點(diǎn)和struts2-convention這個(gè)插件很相像。本例使用FreeMarker模板引擎作為展示層,頁(yè)面的后綴為.html,頁(yè)面中除了標(biāo)準(zhǔn)的HTML之外,其余的數(shù)據(jù)填充,條件判斷之類,都要用到FreeMarker指令。
對(duì)于save方法返回值寫法表示的是重定向,相當(dāng)于執(zhí)行http://localhost:8080/ssm3/role,而這個(gè)URL對(duì)應(yīng)的其實(shí)就是RoleController這個(gè)類里面list方法。如果要帶上參數(shù)之類的,一定要符合所定義的REST資源路徑才可以。
@ResponseBody用來標(biāo)識(shí)Ajax方法調(diào)用,在上面這個(gè)方法中,用到了@RequestParam注解,它的作用就和request.getParameter("name")一樣。SpringMVC框架支持好幾種返回格式,例如:String/JSON/XML等等。不過以這種格式的字符串值形式返回是最簡(jiǎn)便的一種方式,而且利用JavaScript解析也十分方便。頁(yè)面調(diào)用的時(shí)候請(qǐng)用jQuery的$.ajax()這種原生方式來定義,這種寫法不會(huì)出問題,也很靈活,而且其它幾種方式最終也是調(diào)用它來完成請(qǐng)求。
對(duì)于擁有相同的一組訪問規(guī)則的URL,如果都需要獲得相同的數(shù)據(jù),則使用@ModelAttribute注解。以RoleController為例,上面這個(gè)注解與方法的含義,相當(dāng)于是在它里面所有的訪問路徑方法中都調(diào)用這個(gè)寫法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是訪問create還是edit,都會(huì)執(zhí)行preperList,都會(huì)獲得allRoles這個(gè)List。
注冊(cè)自定義類型編輯器,在SpringMVC中,對(duì)于時(shí)間類型,框架不會(huì)自動(dòng)幫你轉(zhuǎn)換綁定,需要你自己來定義屬性編輯器。除此之外,還可以對(duì)某些特殊字符進(jìn)行轉(zhuǎn)義符處理,都可以放在@InitBinder注解的方法中進(jìn)行。如果所有的Controller都需要注冊(cè)相同的屬性編輯器,則可以實(shí)現(xiàn)WebBindingInitializer接口,定義一個(gè)全局的屬性編輯器。
三、在web容器中部署
想要讓SpringMVC框架幫助我們完成工作,就需要在Web容器中配置好它。
DispatcherServlet是SpringMVC的核心,是處理一切請(qǐng)求轉(zhuǎn)發(fā)的核心控制器。大象曾在本系列的第二篇文章中就詳細(xì)描述了SpringMVC的流程結(jié)構(gòu),如果沒什么印象的話請(qǐng)?jiān)偃タ纯础?/p>
SpringMVC有一個(gè)默認(rèn)規(guī)則,Web容器啟動(dòng)之后,會(huì)自動(dòng)查找/WEB-INF/<servlet-name>.xml這個(gè)Spring類型的配置文件。如果想自定義配置文件路徑,就按上面的寫法,指定contextConfiglocation這個(gè)屬性,大象采用maven構(gòu)建項(xiàng)目,所以servlet-context.xml這個(gè)配置文件放在resource目錄下。
四、MVC配置
SpringMVC3.0對(duì)使用和配置作了較大的改進(jìn),除了提供注解來簡(jiǎn)化控制器的開發(fā)之外,在配置文件上面也進(jìn)行了簡(jiǎn)化。
基于SpringMVC注解的配置就是上面這兩行,還有一種更簡(jiǎn)化的配置寫法是只寫這一句:<mvc:annotation-driven
/>就可以了,Spring啟動(dòng)的時(shí)候會(huì)自動(dòng)注冊(cè)上面這兩個(gè)bean。為什么大象要在這里顯示的注冊(cè)兩個(gè)bean呢?因?yàn)椋覀冊(cè)谡嬲褂玫臅r(shí)候,一般來說,使用默認(rèn)的方式滿足不了我們的系統(tǒng)或業(yè)務(wù)要求。比如攔截器,比如數(shù)據(jù)驗(yàn)證,比如返回消息格式轉(zhuǎn)換等等一些自定義設(shè)置。他們都需要配置在這兩個(gè)bean里面。因?yàn)楸纠怯脕碜鳛槿腴T教程,所以這些東西都沒有加進(jìn)來。
DefaultAnnotationHandlerMapping這個(gè)類是將所有標(biāo)注了@RequestMapping注解的Controller類,都放到了一個(gè)HandlerMapping對(duì)象中,當(dāng)有請(qǐng)求時(shí),就在這個(gè)對(duì)象中進(jìn)行查找是否有與之匹配的路徑,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五)2012-07-3115:40155人閱讀評(píng)論(0)\o"收藏"收藏\o"舉報(bào)"舉報(bào)這是本系列的最后一篇,主要講一下FreeMarker模板引擎的基本概念與常用指令的使用方式。
一、FreemMarker基本概念
FreemMarker是一個(gè)用Java語(yǔ)言編寫的模板引擎,它是一個(gè)基于模板來生成文本輸出的一個(gè)工具。是除了JSP之外被使用得最多的頁(yè)面模板技術(shù)之一,另一個(gè)比較有名的模板則是Velocity。
用戶可以使用FreeMarker來生成所需要的內(nèi)容,通常由Java提供數(shù)據(jù)模型,F(xiàn)reeMarker通過模板引擎渲染數(shù)據(jù)模型,這樣最終得到我們想要的內(nèi)容。使用FreeMarker作為展示層,訪問速度會(huì)比較快,因?yàn)镕reeMarker引擎渲染頁(yè)面的時(shí)候,只需要把數(shù)據(jù)填充進(jìn)去就可以了,其它的都是固定的模板內(nèi)容。另外,使用FreeMarker能夠很方便的動(dòng)態(tài)生成靜態(tài)頁(yè)面,對(duì)于大訪問量的網(wǎng)站,配合nginx可以很好的提高網(wǎng)站性能。
在ssm3這個(gè)例子中,就是使用的FreeMarker模板技術(shù)來實(shí)現(xiàn)的視圖層。本文主要是對(duì)ssm3例子中所使用到的FreeMarker知識(shí)點(diǎn)進(jìn)行介紹,其它更詳細(xì)的內(nèi)容還請(qǐng)大家參考官方文檔。
在本文的最后有ssm3源碼,有需要的朋友可以自行下載,例子是最基本的,方便入門的朋友學(xué)習(xí)與了解。
二、FreemMarker配置說明
在Spring3.0框架中,已經(jīng)集成好了FreeMarker,對(duì)它進(jìn)行了適度的封裝,我們使用起來非常方便。要使用FreemMarker模板的功能,只需要進(jìn)行下面兩項(xiàng)配置。
a、FreemMarker視圖解析器
當(dāng)我們發(fā)出REST請(qǐng)求訪問資源時(shí),當(dāng)Controller執(zhí)行完畢,需要返回結(jié)果給我們時(shí),那些返回字符串指定的都是結(jié)果頁(yè)面,這時(shí),就通過上面這個(gè)解析器,根據(jù)返回的那些字符串解析成我們?cè)O(shè)計(jì)的頁(yè)面。另外,如果要使用Spring提供的FreeMarker宏,還需要加上exposeSpringMacroHelpers這個(gè)屬性,將它設(shè)為true,你可以將這些宏理解為一種功能,或一個(gè)方法。
b、FreemMarker環(huán)境配置
上面這段配置設(shè)置了FreeMarker環(huán)境屬性,templateLoaderPath指定模板文件存放的路徑,它相當(dāng)于是定義了模板的前綴,所有顯示的頁(yè)面都遵循這個(gè)路徑規(guī)則。還指定了模板文件的編碼格式,如果不顯示配置,否則會(huì)采用系統(tǒng)默認(rèn)編碼,這很容易出現(xiàn)亂碼的情況,所以一定要將編碼統(tǒng)一設(shè)置,不要再使用gb2312或gbk之類的編碼方式了,采用國(guó)際統(tǒng)一的UnicodeUTF-8編碼是比較好的習(xí)慣。
除了上面我們看到的這些配置設(shè)置外,F(xiàn)reeMarkerConfigurer還有一個(gè)很重要的屬性是freemarkerVariables,它可以用來設(shè)置我們自己開發(fā)的自定義指令標(biāo)簽,以滿足不同的業(yè)務(wù)需求。
三、FreemMarker指令標(biāo)記
要想在最終結(jié)果頁(yè)面中填充數(shù)據(jù),需要用到FreeMarker標(biāo)記指令來達(dá)到這一目的。不過這些標(biāo)記指令一般不會(huì)單獨(dú)出現(xiàn),基本上是多個(gè)組合使用,為了讓大家方便理解,大象就以ssm3中的一些頁(yè)面為例子進(jìn)行說明。
FreeMarker有兩種類型:預(yù)定義指令和用戶自定義指令。預(yù)定義指令是以#號(hào)開頭,用戶自定義的指令則使用@開頭。而Spring的FreeMarker宏也是以@開頭。
指令assign表示定義一個(gè)變量,它的格式是<#assignname=value>,在這里ctx是變量名name,value可以是一個(gè)值,也可以是一個(gè)表達(dá)式。還記得FreeMarker解析器中我們?cè)O(shè)置的requestContextAttribute屬性為rc吧,我們現(xiàn)在就是用它來獲得我們應(yīng)用上下文,我們的應(yīng)用名為ssm3,所以這里就是取得這個(gè)值,將它賦給ctx,上面這些都寫在meta.html這個(gè)模板頁(yè)面中,這樣我們就可以在所有模板頁(yè)中引用這個(gè)變量。
在表達(dá)式中,使用了一個(gè)!符號(hào),它的作用是如果rc.getContextPath()為null或不存在,就將字符串”/ssm3”作為默認(rèn)值賦給變量ctx。這樣,即使萬一因?yàn)槟承┰驘o法取得上下文值,我們的ctx變量也不會(huì)因此而出現(xiàn)空值或不正確的值,從而引起系統(tǒng)異常。
在使用FreeMarker時(shí),一定要注意一點(diǎn),F(xiàn)reeMarker絕不允許引用不存在的變量(即變量為null),除非明確地告訴它當(dāng)變量不存在(null)時(shí)如何處理。
上面這一點(diǎn)非常重要,往往很多時(shí)候Bug就出在空值未處理上面,請(qǐng)大家使用FreeMarker的時(shí)候一定要多加注意。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度智慧農(nóng)業(yè)科技園招標(biāo)文件編制及論文創(chuàng)新研究合同4篇
- 2025年度石油設(shè)備買賣合同范本4篇
- 二零二五年度高性能地板磚研發(fā)、生產(chǎn)與銷售合作協(xié)議3篇
- 2025年水電站經(jīng)營(yíng)權(quán)整體轉(zhuǎn)讓協(xié)議3篇
- 二零二五年度電梯加裝工程驗(yàn)收與后期維保合同3篇
- 二零二五年度市政道路綠化帶維護(hù)合同4篇
- 2025年燃?xì)庠O(shè)備安裝與維修服務(wù)承包合同范本3篇
- 隧道襯砌施工技術(shù)方案
- 二零二五版智能辦公空間裝修與系統(tǒng)集成服務(wù)合同2篇
- 2025版鋁合金門窗智能鎖具研發(fā)與銷售合作協(xié)議4篇
- 施工現(xiàn)場(chǎng)水電費(fèi)協(xié)議
- SH/T 3046-2024 石油化工立式圓筒形鋼制焊接儲(chǔ)罐設(shè)計(jì)規(guī)范(正式版)
- 2024年海口市選調(diào)生考試(行政職業(yè)能力測(cè)驗(yàn))綜合能力測(cè)試題及答案1套
- 六年級(jí)數(shù)學(xué)質(zhì)量分析及改進(jìn)措施
- 一年級(jí)下冊(cè)數(shù)學(xué)口算題卡打印
- 真人cs基于信號(hào)發(fā)射的激光武器設(shè)計(jì)
- 【閱讀提升】部編版語(yǔ)文五年級(jí)下冊(cè)第三單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 四年級(jí)上冊(cè)遞等式計(jì)算練習(xí)200題及答案
- 法院后勤部門述職報(bào)告
- 2024年國(guó)信證券招聘筆試參考題庫(kù)附帶答案詳解
- 道醫(yī)館可行性報(bào)告
評(píng)論
0/150
提交評(píng)論