[轉]Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注...

  第一章

Spring更新到3.0以後,其MVC框架加入了一個很是不錯的東西——那就是REST。它的開放式特性,與Spring的無縫集成,以及Spring框架的優秀表現,使得如今不少公司將其做爲新的系統開發框架。大象根據實際的項目經驗,以以前SSH2例子爲基礎,對其進行一次大改造,詳細的爲你們講解如何實現SSM3全註解式的開發。 html

    此次大象將採起兩種構建方式,一是不少人喜歡用的MyEclipse,另外一個,則是用Eclipse+Maven。這一篇,將主要講解開發環境設置與Maven構建方式。 java

    1、開發環境 nginx

JDK1.6.0_18 程序員

Eclipse3.2.1 MyEclipse5.1.0 web

Eclipse-JEE-HELIOS-SR2 Maven3.0.1 m2eclipse0.12.1.20110112-1712 ajax

Tomcat6.0.10 maven-jetty-plugin6.1.26 spring

MySQL5.0.27 Navicat Lite for MySQL 8.1.20 數據庫

    每一個人的開發環境可能會有差別,但有一點我須要說明的是,JDK的版本不得低於1.5,由於用到了不少1.5版才支持的新特性。TomcatJettyMavenMySQL請不要低於我所用的版本,由於我沒在其它的版本上進行測試。Navicat則是MySQL數據庫的圖形化操做工具。接下來我將介紹如何在Eclipse3.6中,使用m2eclipse插件構建web應用及測試開發環境。 編程

    

2 瀏覽器

設置Maven

    Maven的安裝很簡單,只須要解壓便可,請設置PATH變量,這樣可使用命令行進行操做,而後就要在%MAVEN_HOME%\conf目錄下,對settings.xml做下修改

    

    這就是設置本地倉庫,目錄能夠根據本身的實際狀況更改,不過請使用"/"正斜槓,由於我在實際使用中,發現反斜槓有時候獲取不到資源。對於我的使用,設置好這個就OK了,至於Nexus配置不在本文討論範圍內,你們若有興趣能夠去看看juven xu的博客,他是目前公認的Maven專家。

    

3

安裝m2eclipse

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

    

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

    

    插件找到後,請勾選要安裝的內容,接下來就是通常的安裝流程了,此處省略500字。安裝完成請從新啓動Eclipse,而後再對這個插件進行一番設置。

    

4

設置m2eclipse

    進入Perferences,選擇Maven,去掉Download repository index updates on startup前的勾,默認狀況是會在每次啓動Eclipse的時候自動去Maven中央倉庫下載索引,這無疑是很是很差的,要知道Maven中央倉庫所包含的jar資源很是龐大,並且天天都會有不少新的項目上傳,弄很差Eclipse還沒開始用,就被這些東西搞掛掉了。

    

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

    

    設置好這個以後,再點擊User Settings,用本機mavensettings.xml替換默認的配置文件,由於默認的設置是會將本地倉庫放到系統盤符\Documents and Settings\用戶目錄\.m2\repository這個目錄下面。

    

    你們能夠看到,用maven中的配置文件替換後,下面的Local Repository自動變動爲settings.xml中的設置。

    

5

建立maven工程

    作完這些,咱們就能夠開始建立Maven工程了。選擇New->other...->Maven->Maven Project,而後選擇下一步

    

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

    

    這個列表顯示的就是maven支持的全部項目建立類型,咱們是開發web應用,因此請選擇maven-archetype-webapp

    

    最後一步輸入咱們要建立的項目,在Maven世界中,使用座標來惟一標識一個構件,能夠理解爲項目,資源等等。Group Id表示當前項目所屬的實際項目,Artifact Id定義實際項目中的一個Maven項目,根據名字就能夠看出來,Group Id是一個大範圍,而Artifact Id是一個小範圍。好比你們都很熟悉的spring,就分紅了spring-core.jarspring-beans.jarspring-context.jar等等。在maven裏面,它的Group Id就是org.springframework,而Artifact Id則爲spring-corespring-beansspring-context。怎麼樣?理解了沒有?

    

    到此,項目生成了,請展開src/main,在main目錄下新建一個java文件夾,打開ssm3的項目屬性,選擇Java Build Path->Source->Add Folder...->勾選java,這樣作的目的,就是將src/main/java這個路徑做爲源文件的文件夾,這和以往用MyEclipse作開發的目錄結構是不一樣的。而maven的規則也是這樣定義的,假如你不進行這個設置,就算你在main下面建立了java目錄,再添加包或類時,就會有問題,你們試試,看會出現什麼錯誤。

    

    

6

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

    

    打開Run Configurations,這有多種方式打開,能夠從菜單Run裏面選,也能夠從工具欄選擇,還能夠在項目點擊右鍵選擇。

    

    

    在彈出的窗口,Maven Build裏面設置運行參數,點擊Browse Workspace...會彈出下圖那個小窗口,設定Base directory,加入jetty:run,點擊Run,啓動jetty

    

    在瀏覽器中輸入http://localhost:8080/ssm3會顯示Hello World!,調用的是ssm3/main/webapp/index.jsp,大象加了點內容,結果就是這樣的

 到這裏,關於在Eclipse裏搭建maven環境,配置,建立,運行,測試就所有講完了,你們動手作作,熟悉一下這種開發方式,接下來就會在這個骨架上開發SSM3示例。恩,咱們下次繼續。

第二章

在上一篇文章中我詳細的介紹瞭如何搭建maven環境以及生成一個maven骨架的web項目,那麼這章中我將講述Spring MVC的流程結構,Spring MVCStruts2的區別,以及例子中的一些配置文件的分析。
    
1、Spring MVC 3.0介紹

    Spring MVC是一個典型的MVC框架,是Spring內置的Web框架,能夠做爲應用項目的展現層,繼Spring 2.0Spring MVC進行重大升級後,Spring 2.5又爲Spring MVC引入了註解驅動功能,再到3.0時代,全面支持REST的網絡服務和更容易的網絡編程。這一系列的變革,無疑吸引着咱們走進Spring MVC 3.0的世界。
    REST功能是Spring MVC 3.0新增的,它經過不帶擴展名的URL來訪問系統資源。REST是把訪問的全部資源當作靜態的,一個或一組,每一個不一樣的URL地址都是一個靜態資源。那麼Spring MVC 3.0是如何支持REST的呢?簡單的說,它是經過@RequestMapping@PathVariable註解提供的,在@RequestMapping中指定valuemethod,就能夠處理對應的請求。另外spring mvc框架還作了不少不少工做。

    2、Spring MVC流程

    大象根據官方文檔的介紹,以及本身的理解,畫了一個Spring MVC的流程結構圖,你們能夠參考下。

    

    1Spring MVC的核心是DispatcherServlet,當客戶端發送一個請求時,這個請求通過一系列過濾器處理。而後DispatcherServlet會接收到這個請求。

    2DispatcherServlet會從HandlerMapping對象中查找與請求匹配的Controller,並將結果返回給DispatcherServlet

    3DispatcherServlet將請求轉發給目標Controller,若是定義有攔截器,則會通過這些攔截器處理。

    4Controller處理完成業務邏輯後,會返回一個結果給DispatcherServlet

    5DispatcherServlet根據結果查詢ViewResolver,找到與之對應的視圖對象,一樣將結果返回給DispatcherServlet

    6DispatcherServlet根據指定的顯示結果,調用模板對象渲染view

    7、將view返回給客戶端。

    根據上面的說明,能夠很很明顯的看出,Spring MVC的核心是Servlet,而且建立的Controller其實也是一個Servlet

    3、Springstruts2比較

    另外一個很是有名的MVC框架是Struts2Spring MVC的核心是Servlet,而Struts2的核心則是Filter。下表列出Spring MVCStruts2的主要區別與比較結果。

    

    

    經過上面的綜合比較,Spring MVC 3.0的優點要比Struts2大得多,雖然它還有些不足的地方,但隨着後期版本的升級,必然會進行改進,會作的更好。因此採用Spring MVC 3.0做爲系統的展現層要比Struts2好。

    4、線程安全

    因爲Spring MVC默認是Singleton的,因此會產生一個潛在的安全隱患。根本核心是instance變量保持狀態的問題。

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

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

        b) 將控制器的做用域從單例改成原型

    這兩種作法有好有壞,第一種,須要開發人員擁有較高的編程水平與思想意識,在編碼過程當中力求避免出現這種BUG,而第二種則是容器自動的對每一個請求產生一個實例,由JVM進行垃圾回收,所以作到了線程安全。使用第一種方式的好處是實例對象只有一個,全部的請求都調用該實例對象,速度和性能上要優於第二種,很差的地方,就是須要程序員本身去控制實例變量的狀態保持問題。第二種因爲每次請求都建立一個實例,因此會消耗較多的內存空間。

    5、配置文件

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

    1pom.xml

    管理項目依賴,編譯,發佈,插件配置等等。全部的依賴包都由配置決定,另外所需依賴包的其它依賴,無需配置,maven會自動獲取並進行管理,這無疑幫咱們減小了不少工做量,不再用爲處處找jar包,或版本不一致而頭疼了。

    定義依賴版本屬性

    

    Spring依賴,本例是一個很基礎的例子,因此有這些就夠了,之後有擴展再增長。

    

    MyBatis依賴,iBatis3.0版以後就更名爲MyBatis。這個例子,大象沒有使用Hibernate,而是採用更輕量級的MyBatis來做爲持久層框架,使用很簡單,也很靈活。另外,本例還用到了一個mybatis-spring插件,這是由於spring 3.0.5僅支持ibatis 2.0,因此須要這個插件來處理底層數據源等工做。

    

    本例用到了AOP,因此須要這兩個依賴

    

    下面是其它一些必須的依賴,值得說明的就是,由於在本例中,大象對Service仍是用的類,沒有進行基於接口的實現方式,因此須要cglib這個依賴。另外,頁面使用html做爲展現層,使用freemarker標籤處理動態數據。
    
2web.xml

    ssh2web.xml主要的區別就是替換Struts2的啓動配置,改成Spring MVC的設置,配置以下:

    

    

    servlet-context.xml包含容器啓動時,所要執行的內容,而service-context.xml則是接下來由spring上下文監聽器對其進行掃描執行。這兩個配置文件能夠合併成一個,大象爲了便於管理,而且爲了使用spring上下文,寫成了兩個文件。若是咱們不指定init-param配置,默認的,在服務器啓動時,會在WEB-INF目錄下查找命名規則爲<servlet-name>-servlet.xml的文件,對應到這裏就是ssm3-servlet.xml文件,大象統一將全部文件都放在了classpath下面。
    
3servlet-context.xml

    Spring MVC啓動時的配置文件,包含組件掃描、url映射以及設置freemarker參數,讓spring不掃描帶有@Service 註解的類。爲何要這樣設置?由於servlet-context.xmlservice-context.xml不是同時加載,若是不進行這樣的設置,那麼,spring就會將全部帶@Service 註解的類都掃描到容器中,等到加載service-context.xml的時候,會由於容器已經存在Service類,使得cglib將不對Service進行代理,直接致使的結果就是在service-context中的事務配置不起做用,發生異常時,沒法對數據進行回滾。另外可以將REST URL解析爲請求映射的是DefaultAnnotationHandlerMapping這個類,它在啓動時,對Controller中全部標註了@RequestMapping註解的方法,都放到了一個HandlerMapping對象中,當有請求時,就在這個對象中進行查找是否有與之匹配路徑的處理方法,有則執行,沒有就會輸出一個Not Page Found警告信息。

    

    展現層使用freemarker模板引擎,爲了便於編輯,大象在這裏使用html做爲展現頁。Spring框架對freemarker進行了集成與封裝,配置起來很是簡單。主要是定義FreeMarker視圖解析器與屬性配置,網上有不少關於這些屬性含義的介紹,大象就不在這裏囉嗦了,後面講到Spring MVC的時候會結合代碼來進行說明。Spring MVC支持多種類型的視圖文件。如:jspfreemarkervelocitytilesjasperreports等。

    

    4service-context.xml

    ssh2裏面的application.xml區別不大,主要是將hibernate那部分改成mybatis,還要將MybatisDao基類配置進來,以便Service類能夠用註解的方式引入,而後就是掃描包路徑,不掃描帶有@Controller註解的類。由於這些類已經隨容器啓動時,在servlet-context中掃描過一遍了。

    

    

    

    5mybatis-config.xml

    mybatis的主配置,裏面包含了POJO的映射文件,這裏瞭解一下就行,後面的章節會對這些進行說明,熟悉ibatis的朋友就很簡單了,能夠直接跳過。

    

    到此,關於配置文件的說明就講完了,由於這個SSM3的例子採用maven來構建,與以前的SSH2不同,大象對配置文件進行了簡要的說明,使用maven的好處,你們應該看出來了,它對於開發構建來講顯得簡單一些,可使你不須要處處去找jar包,也不用你去擔憂版本不一致的問題,另外,對於依賴的jar包,它還能自動去查找它本身的依賴,這能夠減小咱們不少沒必要要的重複勞動。下一章,我將分析下本例的層次結構與MyBatis的簡單運用。

第三章

前兩章我爲你們詳細介紹瞭如何搭建Maven環境、Spring MVC的流程結構、Spring MVCStruts2的區別以及示例中的一些配置文件的分析。在這一章,我就對示例的層次結構進行說明,以及MyBatis的一些簡單介紹。

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

    1、工程結構圖
    

    上面這是典型的Maven項目結構形式,使用本地倉庫管理jar包的依賴,使用插件打包編譯發佈很是方便,讓咱們從傳統的開發方式中解放出來,你們都快來使用Maven構建項目吧!

    2、映射文件

    使用MyBatis進行持久化操做,須要設置一個映射文件,通常來講,每張表對應一個實體對象和一個mapper映射文件。而MyBatis裏面沒有像Hibernate那樣複雜的關聯關係,因此,它的每一個實體類其實就是一個很普通的POJO類。而映射文件中,都是SQL語句,下面就是示例中RoleMapper.xml的代碼片斷。

    

    那麼,MyBatis是如何將數據庫字段與POJO對象進行映射的呢?這是在它的內部,會將到得的結果或結構集,與咱們定義的POJO對象屬性進行映射,規則是,屬性首字母小寫,使用駝峯式命名方式,而字段則是單詞與單詞間,用下劃線鏈接。好比:數據庫有個USER_NAME字段,那麼與它對應的屬性就應該是userName。若是字段命名沒有使用下劃線,那麼屬性能夠直接定義成該單詞。好比,NAME字段,它的屬性就是name

    3、基於namespace接口與公用dao的區別
    MyBatis3.0開始,對mapper中的namespace屬性新增了一個特性:能夠指定具體的接口來做爲持久化操做類,在接口中定義與映射文件中id屬性值相同的方法,MyBatis會自動去綁定和執行對應的SQL語句。這種接口實現方式,須要爲每一個Mapper建立一個接口,若是系統作大了,維護這些類會比較麻煩,大象我的傾向於基礎服務式的Dao實現類,如例子中的MyBatisDao
    4、MyBatisDao
    持久化操做基類,SqlSessionDaoSupportmybatis-spring插件中封裝的,用於得到SQL Session鏈接,執行數據庫操做,我定義了幾個經常使用的方法。

    關於mybatis-spring插件我簡單介紹一下, Spring 3.x的發佈並無對MyBatis這一優秀的SQL框架提供支持,雖然在它的問題列表中已經有這樣的請求,但直到目前3.0.5版的發佈,都還沒將這個問題處理掉。不過這難不倒開源世界裏廣大的愛好者與貢獻者,mybatis-spring就是在這樣的狀況下誕生了。它是由MyBatis社區愛好者完成的一個開源項目,用來進行Spring 3.0MyBatis 3.0的配置整合。該插件須要運行在JDK 5.0或更高版本。

    
    5、Service

    ssm3這個示例中,你們有沒有發現,已經沒有爲每一個entity定義一個dao,而是統一的調用MyBatisDao做爲存儲服務接口。另外與使用Hibernate的主要區別,就是不能直接傳一個對象參數,還必須寫上key值,它是namespace加上ID值。
    
    6、entity
    MyBatis的實體類就是一個簡單的POJO對象,只是用來與表字段進行關聯映射,請注意,我這裏所說的映射不是像Hibernate那種綁定關係,只一種存放數據的對象而已。
    
    7、測試

    上面的步驟完成後,接下來就須要測試下咱們的業務接口是否正常,編寫一個測試類,爲了達到目的,簡便起見,大象是對RoleService進行測試,UserService同理相似。

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

    
    而後編寫測試類,運行測試,經過!

    

    到此,這一章的內容就講完了,若是有對註解不理解的地方,請看下我以前的SSH2系列之三,至於MyBatis,它的內容太多了,若是不清楚還請先看下使用指南。下一章我將會介紹web層,以及使用Spring MVC的註解來實現控制器功能。

第四章

 這一章大象將詳細分析web層代碼,以及使用Spring MVC的註解及其用法和其它相關知識來實現控制器功能。
    以前在使用Struts2實現MVC的註解時,是藉助struts2-convention這個插件,現在咱們使用Spring自帶的spring-webmvc組件來實現一樣的功能,並且比之之前更簡單。另外,還省掉了整合兩個框架帶來的不穩定因素。
    對於Spring MVC框架,我主要講一下它的經常使用註解,再結合一些示例進行說明,方便你們可以快速理解。
    1、Spring MVC經常使用註解說明
    @Controller
    在類上面定義,代表該類爲控制器,返回字符串與redirect:xxx
    @RequestMapping
    類或方法上面使用此註解,設置URL訪問地址。它有兩個屬性,value指定訪問路徑,method指定指定請求方式,請求方式在RequestMethod這個類中,所有以常量形式定義,它默認使用GET請求。
    @RequestParam
    指定Request請求參數,在方法參數中定義,至關於傳統的request.getParameter()
    @PathVariable
    獲取URL訪問路徑變量,這是Spring MVC 3.0框架才加入的特性,基於RESTful風格的URL訪問路徑。
    @ModelAttribute
全局式的方法,在一組URL訪問路徑中,每次都會執行,方法返回結果保存在module會話中。
    @Service
    在類上面定義,指定被註解的類是業務邏輯組件,若是不指定具體的Bean ID,則採用默認命名方式,即類名的首字母小寫。以前在SSH2中,大象曾對Dao組件使用@Repository,本例只有業務層,因此就只用@Service 註解。
    @Autowired
    IoC自動注入功能,替換之前的set寫法,在SSH2中就已經開始使用了。
    @Qualifier
    對同一接口類有不一樣實現指定具體的實現類。
    @ResponseBody
    一樣定義在方法上,Ajax調用聲明,指定方法返回結果爲Ajax回調函數結果。這是Spring MVC 3.0框架中增長的一個新特性。
    @InitBinder
    初始化數據綁定與類型轉換,將傳入的參數轉換爲自定義類型,或者對參數進行自定義處理。
    2、示例
    
    @RequestMapping在類名上面定義,至關於指定的URL是此控制器內的全部其它訪問路徑的父路徑。若是在某個方法上面定義@RequestMapping註解,則相對於父路徑來講,是其子路徑。若是不定義value值,那麼按父路徑訪問就會被默認執行。但請注意,默認的訪問方式只能有一個。
    對於UserControllerlist方法REST訪問URLhttp://localhost:8080/ssm3/user,並且它同時接收GETPOST兩種請求。另外,Spring MVC 3.0有一個很靈活的特性,能夠自定義方法參數。看看list方法,我設定了兩個參數,一個Model,一個User對象。Model是用來渲染數據,生成頁面用的。至關於request.setAttribute,你能夠這樣理解,但不能就這樣認爲,Model以及另外一個ModelMap,都是做爲視圖模型傳遞參數的,它們的做用域爲request。除此以外,你還能夠定義HttpServletRequestHttpServletResponse等等各類各樣的參數。
若是一個類還要定義其它資源訪問怎麼辦呢?請看下面的RoleController
    
    RoleController上定義了全局路徑/role,這樣一來,對於和角色相關的資源都會以/role開頭,好比建立角色/role/new;編輯角色/role/edit/{id}等等。
    上圖edit方法中的{id}寫法,就是RESTful URL風格,與@PathVariable搭配來一塊兒實現該功能。它表示所請求的URL中,能夠將變量值做爲參數進行動態的傳遞。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了能夠用數字,還能夠用字符串,還能夠多定義幾個變量:/role/edit/{id}/{type}等等。
    每一個方法的返回值,其實都對應着一個結果頁面,這一點和struts2-convention這個插件很相像。本例使用FreeMarker模板引擎做爲展現層,頁面的後綴爲.html,頁面中除了標準的HTML以外,其他的數據填充,條件判斷之類,都要用到FreeMarker指令。
    對於save方法返回值寫法表示的是重定向,至關於執行http://localhost:8080/ssm3/role,而這個URL對應的其實就是RoleController這個類裏面list方法。若是要帶上參數之類的,必定要符合所定義的REST資源路徑才能夠。
    

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

    對於擁有相同的一組訪問規則的URL,若是都須要得到相同的數據,則使用@ModelAttribute註解。以RoleController爲例,上面這個註解與方法的含義,至關因而在它裏面全部的訪問路徑方法中都調用這個寫法:module.addAttribute(「allRoles」,roleService.getRoles())。也即,無論是訪問create仍是edit,都會執行preperList,都會得到allRoles這個List
    
    註冊自定義類型編輯器,在Spring MVC中,對於時間類型,框架不會自動幫你轉換綁定,須要你本身來定義屬性編輯器。除此以外,還能夠對某些特殊字符進行轉義符處理,均可以放在@InitBinder註解的方法中進行。若是全部的Controller都須要註冊相同的屬性編輯器,則能夠實現WebBindingInitializer接口,定義一個全局的屬性編輯器。
    3、在web容器中部署
    想要讓Spring MVC框架幫助咱們完成工做,就須要在Web容器中配置好它
    
    DispatcherServletSpring MVC的核心,是處理一切請求轉發的核心控制器。大象曾在本系列的第二篇文章中就詳細描述了Spring MVC的流程結構,若是沒什麼印象的話請再去看看。
    Spring MVC有一個默認規則,Web容器啓動以後,會自動查找/WEB-INF/<servlet-name>.xml這個Spring類型的配置文件。若是想自定義配置文件路徑,就按上面的寫法,指定contextConfiglocation這個屬性,大象採用maven構建項目,因此servlet-context.xml這個配置文件放在resource目錄下。
    4、MVC配置
    Spring MVC 3.0對使用和配置做了較大的改進,除了提供註解來簡化控制器的開發以外,在配置文件上面也進行了簡化。
    
    基於Spring MVC註解的配置就是上面這兩行,還有一種更簡化的配置寫法是隻寫這一句:<mvc:annotation-driven />就能夠了,Spring啓動的時候會自動註冊上面這兩個bean。爲何大象要在這裏顯示的註冊兩個bean呢?由於,咱們在真正使用的時候,通常來講,使用默認的方式知足不了咱們的系統或業務要求。好比攔截器,好比數據驗證,好比返回消息格式轉換等等一些自定義設置。他們都須要配置在這兩個bean裏面。由於本例是用來做爲入門教程,因此這些東西都沒有加進來。
    DefaultAnnotationHandlerMapping這個類是將全部標註了@RequestMapping註解的Controller類,都放到了一個HandlerMapping對象中當有請求時,就在這個對象中進行查找是否有與之匹配的路徑,AnnotationMethodHandlerAdapter是管理全部@RequestMapping註解的方法。
    這部分的內容到這裏就講完了,下一篇將對本例使用的展現層FreeMarker進行一下簡單介紹。

第五章

這是本系列的最後一篇,主要講一下FreeMarker模板引擎的基本概念與經常使用指令的使用方式。
    1、FreemMarker基本概念
    FreemMarker是一個用Java語言編寫的模板引擎,它是一個基於模板來生成文本輸出的一個工具。是除了JSP以外被使用得最多的頁面模板技術之一,另外一個比較有名的模板則是Velocity
    用戶可使用FreeMarker來生成所須要的內容,一般由Java提供數據模型,FreeMarker經過模板引擎渲染數據模型,這樣最終獲得咱們想要的內容。使用FreeMarker做爲展現層,訪問速度會比較快,由於FreeMarker引擎渲染頁面的時候,只須要把數據填充進去就能夠了,其它的都是固定的模板內容。另外,使用FreeMarker可以很方便的動態生成靜態頁面,對於大訪問量的網站,配合nginx能夠很好的提升網站性能。
    ssm3這個例子中,就是使用的FreeMarker模板技術來實現的視圖層。本文主要是對ssm3例子中所使用到的FreeMarker知識點進行介紹,其它更詳細的內容還請你們參考官方文檔。
    在本文的最後有ssm3源碼,有須要的朋友能夠自行下載,例子是最基本的,方便入門的朋友學習與瞭解。
    2、FreemMarker配置說明
    
Spring 3.0框架中,已經集成好了FreeMarker,對它進行了適度的封裝,咱們使用起來很是方便。要使用FreemMarker模板的功能,只須要進行下面兩項配置。
    aFreemMarker視圖解析器
    
    當咱們發出REST請求訪問資源時,當Controller執行完畢,須要返回結果給咱們時,那些返回字符串指定的都是結果頁面,這時,就經過上面這個解析器,根據返回的那些字符串解析成咱們設計的頁面。另外,若是要使用Spring提供的FreeMarker宏,還須要加上exposeSpringMacroHelpers這個屬性,將它設爲true,你能夠將這些宏理解爲一種功能,或一個方法。
    bFreemMarker環境配置
    
    上面這段配置設置了FreeMarker環境屬性,templateLoaderPath指定模板文件存放的路徑,它至關因而定義了模板的前綴,全部顯示的頁面都遵循這個路徑規則。還指定了模板文件的編碼格式,若是不顯示配置,不然會採用系統默認編碼,這很容易出現亂碼的狀況,因此必定要將編碼統一設置,不要再使用gb2312gbk之類的編碼方式了,採用國際統一的Unicode UTF-8編碼是比較好的習慣。
    除了上面咱們看到的這些配置設置外,FreeMarkerConfigurer還有一個很重要的屬性是freemarkerVariables,它能夠用來設置咱們本身開發的自定義指令標籤,以知足不一樣的業務需求。
    3、FreemMarker指令標記
    
要想在最終結果頁面中填充數據,須要用到FreeMarker標記指令來達到這一目的。不過這些標記指令通常不會單獨出現,基本上是多個組合使用,爲了讓你們方便理解,大象就以ssm3中的一些頁面爲例子進行說明。
    FreeMarker有兩種類型:預約義指令和用戶自定義指令。預約義指令是以#號開頭,用戶自定義的指令則使用@開頭。而SpringFreeMarker宏也是以@開頭。
    
    指令assign表示定義一個變量,它的格式是<#assign name=value>,在這裏ctx是變量名namevalue能夠是一個值,也能夠是一個表達式。還記得FreeMarker解析器中咱們設置的requestContextAttribute屬性爲rc吧,咱們如今就是用它來得到咱們應用上下文,咱們的應用名爲ssm3,因此這裏就是取得這個值,將它賦給ctx,上面這些都寫在meta.html這個模板頁面中,這樣咱們就能夠在全部模板頁中引用這個變量。
    在表達式中,使用了一個!符號,它的做用是若是rc.getContextPath()null或不存在,就將字符串」/ssm3」做爲默認值賦給變量ctx。這樣,即便萬一由於某些緣由沒法取得上下文值,咱們的ctx變量也不會所以而出現空值或不正確的值,從而引發系統異常。
    在使用FreeMarker時,必定要注意一點,FreeMarker毫不容許引用不存在的變量(即變量爲null),除非明確地告訴它當變量不存在(null)時如何處理。
    上面這一點很是重要,每每不少時候Bug就出在空值未處理上面,請你們使用FreeMarker的時候必定要多加註意。
    
    指令include載入模板頁,可使用它在一個模板中插入另一個FreeMarker模板文件。
    
    <#if>條件判斷指令,list??是否爲空判斷,若是list不爲null纔會往下執行。??通常都與if指令一塊兒執行。
    <#list list as entity>開始循環遍歷,listmodel裏面定義的屬性名稱,aslist循環定義變量的語法,entitylist循環變量的名稱。${...}它和JSTL裏的同一個表達式含義相同。FreeMarker都是在輸出時,用實際值替換。

相關文章
相關標籤/搜索