Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全註解實例詳解(二)

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

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會接收到這個請求。
二、DispatcherServlet會從HandlerMapping對象中查找與請求匹配的Controller,並將結果返回給DispatcherServlet
三、DispatcherServlet將請求轉發給目標Controller,若是定義有攔截器,則會通過這些攔截器處理。
4Controller處理完成業務邏輯後,會返回一個結果給DispatcherServlet
五、DispatcherServlet根據結果查詢ViewResolver,找到與之對應的視圖對象,一樣將結果返回給DispatcherServlet
六、DispatcherServlet根據指定的顯示結果,調用模板對象渲染view
7view返回給客戶端。
根據上面的說明,能夠很很明顯的看出,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的簡單運用。
相關文章
相關標籤/搜索