305Spring305MyBatis304全注解實例詳解_第1頁
305Spring305MyBatis304全注解實例詳解_第2頁
305Spring305MyBatis304全注解實例詳解_第3頁
305Spring305MyBatis304全注解實例詳解_第4頁
305Spring305MyBatis304全注解實例詳解_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實例詳解(一)2012-07-3115:35198人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

Spring更新到3.0之后,其MVC框架加入了一個非常不錯的東西——那就是REST。它的開放式特性,與Spring的無縫集成,以及Spring框架的優(yōu)秀表現(xiàn),使得現(xiàn)在很多公司將其作為新的系統(tǒng)開發(fā)框架。大象根據(jù)實際的項目經(jīng)驗,以之前SSH2例子為基礎,對其進行一次大改造,詳細的為大家講解如何實現(xiàn)SSM3全注解式的開發(fā)。

這次大象將采取兩種構(gòu)建方式,一是很多人喜歡用的MyEclipse,另一個,則是用Eclipse+Maven。這一篇,將主要講解開發(fā)環(huán)境設置與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

每個人的開發(fā)環(huán)境可能會有差異,但有一點我需要說明的是,JDK的版本不得低于1.5,因為用到了很多1.5版才支持的新特性。Tomcat、Jetty、Maven和MySQL請不要低于我所用的版本,因為我沒在其它的版本上進行測試。Navicat則是MySQL數(shù)據(jù)庫的圖形化操作工具。接下來我將介紹如何在Eclipse3.6中,使用m2eclipse插件構(gòu)建web應用及測試開發(fā)環(huán)境。

2、設置Maven

Maven的安裝很簡單,只需要解壓即可,請設置PATH變量,這樣可以使用命令行進行操作,然后就要在%MAVEN_HOME%\conf目錄下,對settings.xml作下修改

這就是設置本地倉庫,目錄可以根據(jù)自己的實際情況更改,不過請使用"/"正斜杠,因為我在實際使用中,發(fā)現(xiàn)反斜杠有時候獲取不到資源。對于個人使用,設置好這個就OK了,至于Nexus配置不在本文討論范圍內(nèi),大家如有興趣可以去看看juvenxu的博客,他是目前公認的Maven專家。

3、安裝m2eclipse

選擇Help->InstallNewSoftware...在彈出的窗口中,點擊Add...又會彈出一個小窗口,輸入m2eclipse的安裝地址,如下圖所示:

輸入完成后,點擊OK,這時Eclipse就開始查找這個插件了,請耐心等一會。

插件找到后,請勾選要安裝的內(nèi)容,接下來就是一般的安裝流程了,此處省略500字。安裝完成請重新啟動Eclipse,然后再對這個插件進行一番設置。

4、設置m2eclipse

進入Perferences,選擇Maven,去掉Downloadrepositoryindexupdatesonstartup前的勾,默認情況是會在每次啟動Eclipse的時候自動去Maven中央倉庫下載索引,這無疑是非常不好的,要知道Maven中央倉庫所包含的jar資源非常龐大,而且每天都會有很多新的項目上傳,弄不好Eclipse還沒開始用,就被這些東西搞掛掉了。

接下來選擇Installations將這個插件自帶的Maven換成之前安裝的Maven,這樣就保證了版本的一致性。

設置好這個之后,再點擊UserSettings,用本機maven的settings.xml替換默認的配置文件,因為默認的設置是會將本地倉庫放到系統(tǒng)盤符\DocumentsandSettings\用戶目錄\.m2\repository這個目錄下面。

大家可以看到,用maven中的配置文件替換后,下面的LocalRepository自動變更為settings.xml中的設置。

5、創(chuàng)建maven工程

做完這些,我們就可以開始創(chuàng)建Maven工程了。選擇New->other...->Maven->MavenProject,然后選擇下一步

請設置工作空間路徑,大象的默認工作空間放在eclipse的根目錄下面,這里的Location顯示的應該為空,為了進行說明,特將路徑顯示出來。確定沒問題后,Next>

這個列表顯示的就是maven支持的所有項目創(chuàng)建類型,我們是開發(fā)web應用,所以請選擇maven-archetype-webapp

最后一步輸入我們要創(chuàng)建的項目,在Maven世界中,使用坐標來唯一標識一個構(gòu)件,可以理解為項目,資源等等。GroupId表示當前項目所屬的實際項目,ArtifactId定義實際項目中的一個Maven項目,根據(jù)名字就可以看出來,GroupId是一個大范圍,而ArtifactId是一個小范圍。比如大家都很熟悉的spring,就分成了spring-core.jar、spring-beans.jar、spring-context.jar等等。在maven里面,它的GroupId就是org.springframework,而ArtifactId則為spring-core、spring-beans、spring-context。怎么樣?理解了沒有?

到此,項目生成了,請展開src/main,在main目錄下新建一個java文件夾,打開ssm3的項目屬性,選擇JavaBuildPath->Source->AddFolder...->勾選java,這樣做的目的,就是將src/main/java這個路徑作為源文件的文件夾,這和以往用MyEclipse做開發(fā)的目錄結(jié)構(gòu)是不同的。而maven的規(guī)則也是這樣定義的,假如你不進行這個設置,就算你在main下面創(chuàng)建了java目錄,再添加包或類時,就會有問題,大家試試,看會出現(xiàn)什么錯誤。

6、運行ssm3

接下來,在pom.xml里面加入maven-jetty-plugin插件,默認生成的配置都可以去掉,整個pom就只有下圖所示的配置。

打開RunConfigurations,這有多種方式打開,可以從菜單Run里面選,也可以從工具欄選擇,還可以在項目點擊右鍵選擇。

在彈出的窗口,MavenBuild里面設置運行參數(shù),點擊BrowseWorkspace...會彈出下圖那個小窗口,設定Basedirectory,加入jetty:run,點擊Run,啟動jetty

在瀏覽器中輸入http://localhost:8080/ssm3會顯示HelloWorld!,調(diào)用的是ssm3/main/webapp/index.jsp,大象加了點內(nèi)容,結(jié)果就是這樣的

到這里,關(guān)于在Eclipse里搭建maven環(huán)境,配置,創(chuàng)建,運行,測試就全部講完了,大家動手做做,熟悉一下這種開發(fā)方式,接下來就會在這個骨架上開發(fā)SSM3示例。恩,我們下次繼續(xù)。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實例詳解(二)2012-07-3115:37345人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

在上一篇文章中我詳細的介紹了如何搭建maven環(huán)境以及生成一個maven骨架的web項目,那么這章中我將講述SpringMVC的流程結(jié)構(gòu),SpringMVC與Struts2的區(qū)別,以及例子中的一些配置文件的分析。

一、SpringMVC3.0介紹

SpringMVC是一個典型的MVC框架,是Spring內(nèi)置的Web框架,可以作為應用項目的展示層,繼Spring2.0對SpringMVC進行重大升級后,Spring2.5又為SpringMVC引入了注解驅(qū)動功能,再到3.0時代,全面支持REST的網(wǎng)絡服務和更容易的網(wǎng)絡編程。這一系列的變革,無疑吸引著我們走進SpringMVC3.0的世界。

REST功能是SpringMVC3.0新增的,它通過不帶擴展名的URL來訪問系統(tǒng)資源。REST是把訪問的所有資源看成靜態(tài)的,一個或一組,每個不同的URL地址都是一個靜態(tài)資源。那么SpringMVC3.0是如何支持REST的呢?簡單的說,它是通過@RequestMapping及@PathVariable注解提供的,在@RequestMapping中指定value與method,就可以處理對應的請求。另外springmvc框架還做了很多很多工作。

二、SpringMVC流程

大象根據(jù)官方文檔的介紹,以及自己的理解,畫了一個SpringMVC的流程結(jié)構(gòu)圖,大家可以參考下。

1、SpringMVC的核心是DispatcherServlet,當客戶端發(fā)送一個請求時,這個請求經(jīng)過一系列過濾器處理。然后DispatcherServlet會接收到這個請求。

2、DispatcherServlet會從HandlerMapping對象中查找與請求匹配的Controller,并將結(jié)果返回給DispatcherServlet。

3、DispatcherServlet將請求轉(zhuǎn)發(fā)給目標Controller,如果定義有攔截器,則會經(jīng)過這些攔截器處理。

4、標Controller處理完成業(yè)務邏輯后,會返回一個結(jié)果給DispatcherServlet。

5、DispatcherServlet根據(jù)結(jié)果查詢ViewResolver,找到與之對應的視圖對象,同樣將結(jié)果返回給DispatcherServlet。

6、DispatcherServlet根據(jù)指定的顯示結(jié)果,調(diào)用模板對象渲染view。

7、將view返回給客戶端。

根據(jù)上面的說明,可以很很明顯的看出,SpringMVC的核心是Servlet,并且創(chuàng)建的Controller其實也是一個Servlet。

三、Spring與struts2比較

另一個非常有名的MVC框架是Struts2,SpringMVC的核心是Servlet,而Struts2的核心則是Filter。下表列出SpringMVC與Struts2的主要區(qū)別與比較結(jié)果。

通過上面的綜合比較,SpringMVC3.0的優(yōu)勢要比Struts2大得多,雖然它還有些不足的地方,但隨著后期版本的升級,必然會進行改進,會做的更好。所以采用SpringMVC3.0作為系統(tǒng)的展示層要比Struts2好。

四、線程安全

由于SpringMVC默認是Singleton的,所以會產(chǎn)生一個潛在的安全隱患。根本核心是instance變量保持狀態(tài)的問題。

這個問題有兩種解決辦法:

a)

在控制器中不使用實例變量

b)

將控制器的作用域從單例改為原型

這兩種做法有好有壞,第一種,需要開發(fā)人員擁有較高的編程水平與思想意識,在編碼過程中力求避免出現(xiàn)這種BUG,而第二種則是容器自動的對每個請求產(chǎn)生一個實例,由JVM進行垃圾回收,因此做到了線程安全。使用第一種方式的好處是實例對象只有一個,所有的請求都調(diào)用該實例對象,速度和性能上要優(yōu)于第二種,不好的地方,就是需要程序員自己去控制實例變量的狀態(tài)保持問題。第二種由于每次請求都創(chuàng)建一個實例,所以會消耗較多的內(nèi)存空間。

五、配置文件

SpringMVC是Spring的一個組成部分,所以配置文件就會變得簡單許多。以下就是本例子中最重要的幾個配置文件。

1、pom.xml

管理項目依賴,編譯,發(fā)布,插件配置等等。所有的依賴包都由配置決定,另外所需依賴包的其它依賴,無需配置,maven會自動獲取并進行管理,這無疑幫我們減少了很多工作量,再也不用為到處找jar包,或版本不一致而頭疼了。

定義依賴版本屬性

Spring依賴,本例是一個很基礎的例子,所以有這些就夠了,以后有擴展再增加。

MyBatis依賴,iBatis從3.0版之后就改名為MyBatis。這個例子,大象沒有使用Hibernate,而是采用更輕量級的MyBatis來作為持久層框架,使用很簡單,也很靈活。另外,本例還用到了一個mybatis-spring插件,這是因為spring3.0.5僅支持ibatis2.0,所以需要這個插件來處理底層數(shù)據(jù)源等工作。

本例用到了AOP,所以需要這兩個依賴

下面是其它一些必須的依賴,值得說明的就是,因為在本例中,大象對Service還是用的類,沒有進行基于接口的實現(xiàn)方式,所以需要cglib這個依賴。另外,頁面使用html作為展示層,使用freemarker標簽處理動態(tài)數(shù)據(jù)。

2、web.xml

與ssh2的web.xml主要的區(qū)別就是替換Struts2的啟動配置,改為SpringMVC的設置,配置如下:

servlet-context.xml包含容器啟動時,所要執(zhí)行的內(nèi)容,而service-context.xml則是接下來由spring上下文監(jiān)聽器對其進行掃描執(zhí)行。這兩個配置文件可以合并成一個,大象為了便于管理,并且為了使用spring上下文,寫成了兩個文件。如果我們不指定init-param配置,默認的,在服務器啟動時,會在WEB-INF目錄下查找命名規(guī)則為<servlet-name>-servlet.xml的文件,對應到這里就是ssm3-servlet.xml文件,大象統(tǒng)一將所有文件都放在了classpath下面。

3、servlet-context.xml

SpringMVC啟動時的配置文件,包含組件掃描、url映射以及設置freemarker參數(shù),讓spring不掃描帶有@Service注解的類。為什么要這樣設置?因為servlet-context.xml與service-context.xml不是同時加載,如果不進行這樣的設置,那么,spring就會將所有帶@Service注解的類都掃描到容器中,等到加載service-context.xml的時候,會因為容器已經(jīng)存在Service類,使得cglib將不對Service進行代理,直接導致的結(jié)果就是在service-context中的事務配置不起作用,發(fā)生異常時,無法對數(shù)據(jù)進行回滾。另外能夠?qū)ESTURL解析為請求映射的是DefaultAnnotationHandlerMapping這個類,它在啟動時,對Controller中所有標注了@RequestMapping注解的方法,都放到了一個HandlerMapping對象中,當有請求時,就在這個對象中進行查找是否有與之匹配路徑的處理方法,有則執(zhí)行,沒有就會輸出一個NotPageFound警告信息。

展示層使用freemarker模板引擎,為了便于編輯,大象在這里使用html作為展示頁。Spring框架對freemarker進行了集成與封裝,配置起來非常簡單。主要是定義FreeMarker視圖解析器與屬性配置,網(wǎng)上有很多關(guān)于這些屬性含義的介紹,大象就不在這里啰嗦了,后面講到SpringMVC的時候會結(jié)合代碼來進行說明。SpringMVC支持多種類型的視圖文件。如:jsp、freemarker、velocity、tiles、jasperreports等。

4、service-context.xml

與ssh2里面的application.xml區(qū)別不大,主要是將hibernate那部分改為mybatis,還要將MybatisDao基類配置進來,以便Service類可以用注解的方式引入,然后就是掃描包路徑,不掃描帶有@Controller注解的類。因為這些類已經(jīng)隨容器啟動時,在servlet-context中掃描過一遍了。

5、mybatis-config.xml

mybatis的主配置,里面包含了POJO的映射文件,這里了解一下就行,后面的章節(jié)會對這些進行說明,熟悉ibatis的朋友就很簡單了,可以直接跳過。

到此,關(guān)于配置文件的說明就講完了,因為這個SSM3的例子采用maven來構(gòu)建,與之前的SSH2不一樣,大象對配置文件進行了簡要的說明,使用maven的好處,大家應該看出來了,它對于開發(fā)構(gòu)建來說顯得簡單一些,可以使你不需要到處去找jar包,也不用你去擔心版本不一致的問題,另外,對于依賴的jar包,它還能自動去查找它自己的依賴,這可以減少我們很多不必要的重復勞動。下一章,我將分析下本例的層次結(jié)構(gòu)與MyBatis的簡單運用。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實例詳解(三)2012-07-3115:38789人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

前兩章我為大家詳細介紹了如何搭建Maven環(huán)境、SpringMVC的流程結(jié)構(gòu)、SpringMVC與Struts2的區(qū)別以及示例中的一些配置文件的分析。在這一章,我就對示例的層次結(jié)構(gòu)進行說明,以及MyBatis的一些簡單介紹。

本文不會對MyBatis作詳細說明,大象還是假定閱讀本文的朋友對MyBatis(ibatis)有最基本的了解,只有這樣才能較好的理解本文的內(nèi)容。關(guān)于MyBatis請查看它的官方文檔及其它參考資料,本文不作詳細討論。

一、工程結(jié)構(gòu)圖

上面這是典型的Maven項目結(jié)構(gòu)形式,使用本地倉庫管理jar包的依賴,使用插件打包編譯發(fā)布非常方便,讓我們從傳統(tǒng)的開發(fā)方式中解放出來,大家都快來使用Maven構(gòu)建項目吧!

二、映射文件

使用MyBatis進行持久化操作,需要設置一個映射文件,一般來說,每張表對應一個實體對象和一個mapper映射文件。而MyBatis里面沒有像Hibernate那樣復雜的關(guān)聯(lián)關(guān)系,所以,它的每個實體類其實就是一個很普通的POJO類。而映射文件中,都是SQL語句,下面就是示例中RoleMapper.xml的代碼片段。

那么,MyBatis是如何將數(shù)據(jù)庫字段與POJO對象進行映射的呢?這是在它的內(nèi)部,會將到得的結(jié)果或結(jié)構(gòu)集,與我們定義的POJO對象屬性進行映射,規(guī)則是,屬性首字母小寫,使用駝峰式命名方式,而字段則是單詞與單詞間,用下劃線連接。比如:數(shù)據(jù)庫有個USER_NAME字段,那么與它對應的屬性就應該是userName。如果字段命名沒有使用下劃線,那么屬性可以直接定義成該單詞。比如,NAME字段,它的屬性就是name。

三、基于namespace接口與公用dao的區(qū)別

從MyBatis3.0開始,對mapper中的namespace屬性新增了一個特性:可以指定具體的接口來作為持久化操作類,在接口中定義與映射文件中id屬性值相同的方法,MyBatis會自動去綁定和執(zhí)行對應的SQL語句。這種接口實現(xiàn)方式,需要為每個Mapper創(chuàng)建一個接口,如果系統(tǒng)做大了,維護這些類會比較麻煩,大象個人傾向于基礎服務式的Dao實現(xiàn)類,如例子中的MyBatisDao。

四、MyBatisDao

持久化操作基類,SqlSessionDaoSupport是mybatis-spring插件中封裝的,用于獲得SQLSession連接,執(zhí)行數(shù)據(jù)庫操作,我定義了幾個常用的方法。

關(guān)于mybatis-spring插件我簡單介紹一下,

Spring3.x的發(fā)布并沒有對MyBatis這一優(yōu)秀的SQL框架提供支持,雖然在它的問題列表中已經(jīng)有這樣的請求,但直到目前3.0.5版的發(fā)布,都還沒將這個問題處理掉。不過這難不倒開源世界里廣大的愛好者與貢獻者,mybatis-spring就是在這樣的情況下誕生了。它是由MyBatis社區(qū)愛好者完成的一個開源項目,用來進行Spring3.0與MyBatis3.0的配置整合。該插件需要運行在JDK5.0或更高版本。

五、Service

在ssm3這個示例中,大家有沒有發(fā)現(xiàn),已經(jīng)沒有為每個entity定義一個dao,而是統(tǒng)一的調(diào)用MyBatisDao作為存儲服務接口。另外與使用Hibernate的主要區(qū)別,就是不能直接傳一個對象參數(shù),還必須寫上key值,它是namespace加上ID值。

六、entity

MyBatis的實體類就是一個簡單的POJO對象,只是用來與表字段進行關(guān)聯(lián)映射,請注意,我這里所說的映射不是像Hibernate那種綁定關(guān)系,只一種存放數(shù)據(jù)的對象而已。

七、測試

上面的步驟完成后,接下來就需要測試下我們的業(yè)務接口是否正常,編寫一個測試類,為了達到目的,簡便起見,大象是對RoleService進行測試,UserService同理類似。

在寫測試用例前,需要在POM文件中加入一個Srping測試依賴,這是大象在前面兩章疏忽漏掉了,請大家諒解。

然后編寫測試類,運行測試,通過!

到此,這一章的內(nèi)容就講完了,如果有對注解不理解的地方,請看下我之前的SSH2系列之三,至于MyBatis,它的內(nèi)容太多了,如果不清楚還請先看下使用指南。下一章我將會介紹web層,以及使用SpringMVC的注解來實現(xiàn)控制器功能。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實例詳解(四)2012-07-3115:40607人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報

這一章大象將詳細分析web層代碼,以及使用SpringMVC的注解及其用法和其它相關(guān)知識來實現(xiàn)控制器功能。

之前在使用Struts2實現(xiàn)MVC的注解時,是借助struts2-convention這個插件,如今我們使用Spring自帶的spring-webmvc組件來實現(xiàn)同樣的功能,而且比之以前更簡單。另外,還省掉了整合兩個框架帶來的不穩(wěn)定因素。

對于SpringMVC框架,我主要講一下它的常用注解,再結(jié)合一些示例進行說明,方便大家能夠快速理解。

一、SpringMVC常用注解說明

@Controller

在類上面定義,表明該類為控制器,返回字符串與redirect:xxx

@RequestMapping

在類或方法上面使用此注解,設置URL訪問地址。它有兩個屬性,value指定訪問路徑,method指定指定請求方式,請求方式在RequestMethod這個類中,全部以常量形式定義,它默認使用GET請求。

@RequestParam

指定Request請求參數(shù),在方法參數(shù)中定義,相當于傳統(tǒng)的request.getParameter()。

@PathVariable

獲取URL訪問路徑變量,這是SpringMVC3.0框架才加入的特性,基于RESTful風格的URL訪問路徑。

@ModelAttribute

全局式的方法,在一組URL訪問路徑中,每次都會執(zhí)行,方法返回結(jié)果保存在module會話中。

@Service

在類上面定義,指定被注解的類是業(yè)務邏輯組件,如果不指定具體的BeanID,則采用默認命名方式,即類名的首字母小寫。之前在SSH2中,大象曾對Dao組件使用@Repository,本例只有業(yè)務層,所以就只用@Service注解。

@Autowired

IoC自動注入功能,替換以前的set寫法,在SSH2中就已經(jīng)開始使用了。

@Qualifier

對同一接口類有不同實現(xiàn)指定具體的實現(xiàn)類。

@ResponseBody

同樣定義在方法上,Ajax調(diào)用聲明,指定方法返回結(jié)果為Ajax回調(diào)函數(shù)結(jié)果。這是SpringMVC3.0框架中增加的一個新特性。

@InitBinder

初始化數(shù)據(jù)綁定與類型轉(zhuǎn)換,將傳入的參數(shù)轉(zhuǎn)換為自定義類型,或者對參數(shù)進行自定義處理。

二、示例

@RequestMapping在類名上面定義,相當于指定的URL是此控制器內(nèi)的所有其它訪問路徑的父路徑。如果在某個方法上面定義@RequestMapping注解,則相對于父路徑來說,是其子路徑。如果不定義value值,那么按父路徑訪問就會被默認執(zhí)行。但請注意,默認的訪問方式只能有一個。

對于UserController的list方法REST訪問URL為http://localhost:8080/ssm3/user,而且它同時接收GET和POST兩種請求。另外,SpringMVC3.0有一個很靈活的特性,可以自定義方法參數(shù)。看看list方法,我設定了兩個參數(shù),一個Model,一個User對象。Model是用來渲染數(shù)據(jù),生成頁面用的。相當于request.setAttribute,你可以這樣理解,但不能就這樣認為,Model以及另一個ModelMap,都是作為視圖模型傳遞參數(shù)的,它們的作用域為request。除此之外,你還可以定義HttpServletRequest、HttpServletResponse等等各種各樣的參數(shù)。

如果一個類還要定義其它資源訪問怎么辦呢?請看下面的RoleController

在RoleController上定義了全局路徑/role,這樣一來,對于和角色相關(guān)的資源都會以/role開頭,比如創(chuàng)建角色/role/new;編輯角色/role/edit/{id}等等。

上圖edit方法中的{id}寫法,就是RESTfulURL風格,與@PathVariable搭配來一起實現(xiàn)該功能。它表示所請求的URL中,可以將變量值作為參數(shù)進行動態(tài)的傳遞。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了可以用數(shù)字,還可以用字符串,還可以多定義幾個變量:/role/edit/{id}/{type}等等。

每個方法的返回值,其實都對應著一個結(jié)果頁面,這一點和struts2-convention這個插件很相像。本例使用FreeMarker模板引擎作為展示層,頁面的后綴為.html,頁面中除了標準的HTML之外,其余的數(shù)據(jù)填充,條件判斷之類,都要用到FreeMarker指令。

對于save方法返回值寫法表示的是重定向,相當于執(zhí)行http://localhost:8080/ssm3/role,而這個URL對應的其實就是RoleController這個類里面list方法。如果要帶上參數(shù)之類的,一定要符合所定義的REST資源路徑才可以。

@ResponseBody用來標識Ajax方法調(diào)用,在上面這個方法中,用到了@RequestParam注解,它的作用就和request.getParameter("name")一樣。SpringMVC框架支持好幾種返回格式,例如:String/JSON/XML等等。不過以這種格式的字符串值形式返回是最簡便的一種方式,而且利用JavaScript解析也十分方便。頁面調(diào)用的時候請用jQuery的$.ajax()這種原生方式來定義,這種寫法不會出問題,也很靈活,而且其它幾種方式最終也是調(diào)用它來完成請求。

對于擁有相同的一組訪問規(guī)則的URL,如果都需要獲得相同的數(shù)據(jù),則使用@ModelAttribute注解。以RoleController為例,上面這個注解與方法的含義,相當于是在它里面所有的訪問路徑方法中都調(diào)用這個寫法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是訪問create還是edit,都會執(zhí)行preperList,都會獲得allRoles這個List。

注冊自定義類型編輯器,在SpringMVC中,對于時間類型,框架不會自動幫你轉(zhuǎn)換綁定,需要你自己來定義屬性編輯器。除此之外,還可以對某些特殊字符進行轉(zhuǎn)義符處理,都可以放在@InitBinder注解的方法中進行。如果所有的Controller都需要注冊相同的屬性編輯器,則可以實現(xiàn)WebBindingInitializer接口,定義一個全局的屬性編輯器。

三、在web容器中部署

想要讓SpringMVC框架幫助我們完成工作,就需要在Web容器中配置好它。

DispatcherServlet是SpringMVC的核心,是處理一切請求轉(zhuǎn)發(fā)的核心控制器。大象曾在本系列的第二篇文章中就詳細描述了SpringMVC的流程結(jié)構(gòu),如果沒什么印象的話請再去看看。

SpringMVC有一個默認規(guī)則,Web容器啟動之后,會自動查找/WEB-INF/<servlet-name>.xml這個Spring類型的配置文件。如果想自定義配置文件路徑,就按上面的寫法,指定contextConfiglocation這個屬性,大象采用maven構(gòu)建項目,所以servlet-context.xml這個配置文件放在resource目錄下。

四、MVC配置

SpringMVC3.0對使用和配置作了較大的改進,除了提供注解來簡化控制器的開發(fā)之外,在配置文件上面也進行了簡化。

基于SpringMVC注解的配置就是上面這兩行,還有一種更簡化的配置寫法是只寫這一句:<mvc:annotation-driven

/>就可以了,Spring啟動的時候會自動注冊上面這兩個bean。為什么大象要在這里顯示的注冊兩個bean呢?因為,我們在真正使用的時候,一般來說,使用默認的方式滿足不了我們的系統(tǒng)或業(yè)務要求。比如攔截器,比如數(shù)據(jù)驗證,比如返回消息格式轉(zhuǎn)換等等一些自定義設置。他們都需要配置在這兩個bean里面。因為本例是用來作為入門教程,所以這些東西都沒有加進來。

DefaultAnnotationHandlerMapping這個類是將所有標注了@RequestMapping注解的Controller類,都放到了一個HandlerMapping對象中,當有請求時,就在這個對象中進行查找是否有與之匹配的路徑,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解實例詳解(五)2012-07-3115:40155人閱讀評論(0)\o"收藏"收藏\o"舉報"舉報這是本系列的最后一篇,主要講一下FreeMarker模板引擎的基本概念與常用指令的使用方式。

一、FreemMarker基本概念

FreemMarker是一個用Java語言編寫的模板引擎,它是一個基于模板來生成文本輸出的一個工具。是除了JSP之外被使用得最多的頁面模板技術(shù)之一,另一個比較有名的模板則是Velocity。

用戶可以使用FreeMarker來生成所需要的內(nèi)容,通常由Java提供數(shù)據(jù)模型,F(xiàn)reeMarker通過模板引擎渲染數(shù)據(jù)模型,這樣最終得到我們想要的內(nèi)容。使用FreeMarker作為展示層,訪問速度會比較快,因為FreeMarker引擎渲染頁面的時候,只需要把數(shù)據(jù)填充進去就可以了,其它的都是固定的模板內(nèi)容。另外,使用FreeMarker能夠很方便的動態(tài)生成靜態(tài)頁面,對于大訪問量的網(wǎng)站,配合nginx可以很好的提高網(wǎng)站性能。

在ssm3這個例子中,就是使用的FreeMarker模板技術(shù)來實現(xiàn)的視圖層。本文主要是對ssm3例子中所使用到的FreeMarker知識點進行介紹,其它更詳細的內(nèi)容還請大家參考官方文檔。

在本文的最后有ssm3源碼,有需要的朋友可以自行下載,例子是最基本的,方便入門的朋友學習與了解。

二、FreemMarker配置說明

在Spring3.0框架中,已經(jīng)集成好了FreeMarker,對它進行了適度的封裝,我們使用起來非常方便。要使用FreemMarker模板的功能,只需要進行下面兩項配置。

a、FreemMarker視圖解析器

當我們發(fā)出REST請求訪問資源時,當Controller執(zhí)行完畢,需要返回結(jié)果給我們時,那些返回字符串指定的都是結(jié)果頁面,這時,就通過上面這個解析器,根據(jù)返回的那些字符串解析成我們設計的頁面。另外,如果要使用Spring提供的FreeMarker宏,還需要加上exposeSpringMacroHelpers這個屬性,將它設為true,你可以將這些宏理解為一種功能,或一個方法。

b、FreemMarker環(huán)境配置

上面這段配置設置了FreeMarker環(huán)境屬性,templateLoaderPath指定模板文件存放的路徑,它相當于是定義了模板的前綴,所有顯示的頁面都遵循這個路徑規(guī)則。還指定了模板文件的編碼格式,如果不顯示配置,否則會采用系統(tǒng)默認編碼,這很容易出現(xiàn)亂碼的情況,所以一定要將編碼統(tǒng)一設置,不要再使用gb2312或gbk之類的編碼方式了,采用國際統(tǒng)一的UnicodeUTF-8編碼是比較好的習慣。

除了上面我們看到的這些配置設置外,F(xiàn)reeMarkerConfigurer還有一個很重要的屬性是freemarkerVariables,它可以用來設置我們自己開發(fā)的自定義指令標簽,以滿足不同的業(yè)務需求。

三、FreemMarker指令標記

要想在最終結(jié)果頁面中填充數(shù)據(jù),需要用到FreeMarker標記指令來達到這一目的。不過這些標記指令一般不會單獨出現(xiàn),基本上是多個組合使用,為了讓大家方便理解,大象就以ssm3中的一些頁面為例子進行說明。

FreeMarker有兩種類型:預定義指令和用戶自定義指令。預定義指令是以#號開頭,用戶自定義的指令則使用@開頭。而Spring的FreeMarker宏也是以@開頭。

指令assign表示定義一個變量,它的格式是<#assignname=value>,在這里ctx是變量名name,value可以是一個值,也可以是一個表達式。還記得FreeMarker解析器中我們設置的requestContextAttribute屬性為rc吧,我們現(xiàn)在就是用它來獲得我們應用上下文,我們的應用名為ssm3,所以這里就是取得這個值,將它賦給ctx,上面這些都寫在meta.html這個模板頁面中,這樣我們就可以在所有模板頁中引用這個變量。

在表達式中,使用了一個!符號,它的作用是如果rc.getContextPath()為null或不存在,就將字符串”/ssm3”作為默認值賦給變量ctx。這樣,即使萬一因為某些原因無法取得上下文值,我們的ctx變量也不會因此而出現(xiàn)空值或不正確的值,從而引起系統(tǒng)異常。

在使用FreeMarker時,一定要注意一點,F(xiàn)reeMarker絕不允許引用不存在的變量(即變量為null),除非明確地告訴它當變量不存在(null)時如何處理。

上面這一點非常重要,往往很多時候Bug就出在空值未處理上面,請大家使用FreeMarker的時候一定要多加注意。

溫馨提示

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

評論

0/150

提交評論