隨筆-67  評(píng)論-522  文章-0  trackbacks-0
              在上一篇文章中我詳細(xì)的介紹了如何搭建maven環(huán)境以及生成一個(gè)maven骨架的web項(xiàng)目,那么這章中我將講述Spring MVC的流程結(jié)構(gòu),Spring MVCStruts2的區(qū)別,以及例子中的一些配置文件的分析。
              
          一、Spring MVC 3.0介紹
              Spring MVC是一個(gè)典型的MVC框架,是Spring內(nèi)置的Web框架,可以作為應(yīng)用項(xiàng)目的展示層,Spring 2.0對(duì)Spring MVC進(jìn)行重大升級(jí)后,Spring 2.5又為Spring MVC引入了注解驅(qū)動(dòng)功能,再到3.0時(shí)代,全面支持REST的網(wǎng)絡(luò)服務(wù)和更容易的網(wǎng)絡(luò)編程。這一系列的變革,無(wú)疑吸引著我們走進(jìn)Spring MVC 3.0的世界。
              REST功能是Spring MVC 3.0新增的,它通過不帶擴(kuò)展名的URL來(lái)訪問系統(tǒng)資源。REST是把訪問的所有資源看成靜態(tài)的,一個(gè)或一組,每個(gè)不同的URL地址都是一個(gè)靜態(tài)資源。
          那么Spring MVC 3.0是如何支持REST的呢?簡(jiǎn)單的說,它是通過@RequestMapping@PathVariable注解提供的,在@RequestMapping中指定valuemethod,就可以處理對(duì)應(yīng)的請(qǐng)求。另外spring mvc框架還做了很多很多工作。
              二、Spring MVC流程
              大象根據(jù)官方文檔的介紹,以及自己的理解,畫了一個(gè)Spring MVC的流程結(jié)構(gòu)圖,大家可以參考下。
              
              1Spring MVC的核心是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
              7view返回給客戶端。
              根據(jù)上面的說明,可以很很明顯的看出,Spring MVC的核心是Servlet,并且創(chuàng)建的Controller其實(shí)也是一個(gè)Servlet
              三、Springstruts2比較
              另一個(gè)非常有名的MVC框架是Struts2Spring MVC的核心是Servlet,而Struts2的核心則是Filter。下表列出Spring MVCStruts2的主要區(qū)別與比較結(jié)果。
              
              
              通過上面的綜合比較,Spring MVC 3.0的優(yōu)勢(shì)要比Struts2大得多,雖然它還有些不足的地方,但隨著后期版本的升級(jí),必然會(huì)進(jìn)行改進(jìn),會(huì)做的更好。所以采用Spring MVC 3.0作為系統(tǒng)的展示層要比Struts2好。
              四、線程安全
              由于Spring MVC默認(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)存空間。
              五、配置文件
              Spring MVCSpring的一個(gè)組成部分,所以配置文件就會(huì)變得簡(jiǎn)單許多。以下就是本例子中最重要的幾個(gè)配置文件。
              1pom.xml
              管理項(xiàng)目依賴,編譯,發(fā)布,插件配置等等。所有的依賴包都由配置決定,另外所需依賴包的其它依賴,無(wú)需配置,maven會(huì)自動(dòng)獲取并進(jìn)行管理,這無(wú)疑幫我們減少了很多工作量,再也不用為到處找jar包,或版本不一致而頭疼了。
              定義依賴版本屬性
              
              Spring依賴,本例是一個(gè)很基礎(chǔ)的例子,所以有這些就夠了,以后有擴(kuò)展再增加。
              
              MyBatis依賴,iBatis3.0版之后就改名為MyBatis。這個(gè)例子,大象沒有使用Hibernate,而是采用更輕量級(jí)的MyBatis來(lái)作為持久層框架,使用很簡(jiǎn)單,也很靈活。另外,本例還用到了一個(gè)mybatis-spring插件,這是因?yàn)?/span>spring 3.0.5僅支持ibatis 2.0,所以需要這個(gè)插件來(lái)處理底層數(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ù)。
              
          2web.xml
              ssh2web.xml主要的區(qū)別就是替換Struts2的啟動(dòng)配置,改為Spring MVC的設(shè)置,配置如下:
              
              
              servlet-context.xml包含容器啟動(dòng)時(shí),所要執(zhí)行的內(nèi)容,而service-context.xml則是接下來(lái)由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下面。
              
          3servlet-context.xml
              Spring MVC啟動(dòng)時(shí)的配置文件,包含組件掃描、url映射以及設(shè)置freemarker參數(shù),讓spring不掃描帶有@Service注解的類。為什么要這樣設(shè)置?因?yàn)?/span>servlet-context.xmlservice-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í),無(wú)法對(duì)數(shù)據(jù)進(jìn)行回滾。另外能夠?qū)?/span>REST URL解析為請(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è)Not Page Found警告信息。
              
              展示層使用freemarker模板引擎,為了便于編輯,大象在這里使用html作為展示頁(yè)。Spring框架對(duì)freemarker進(jìn)行了集成與封裝,配置起來(lái)非常簡(jiǎn)單。主要是定義FreeMarker視圖解析器與屬性配置,網(wǎng)上有很多關(guān)于這些屬性含義的介紹,大象就不在這里啰嗦了,后面講到Spring MVC的時(shí)候會(huì)結(jié)合代碼來(lái)進(jìn)行說明。Spring MVC支持多種類型的視圖文件。如:jspfreemarkervelocitytilesjasperreports等。
              
              4service-context.xml
              ssh2里面的application.xml區(qū)別不大,主要是將hibernate那部分改為mybatis,還要將MybatisDao基類配置進(jìn)來(lái),以便Service類可以用注解的方式引入,然后就是掃描包路徑,不掃描帶有@Controller注解的類。因?yàn)檫@些類已經(jīng)隨容器啟動(dòng)時(shí),在servlet-context中掃描過一遍了。
              
              
              
              5mybatis-config.xml
              mybatis的主配置,里面包含了POJO的映射文件,這里了解一下就行,后面的章節(jié)會(huì)對(duì)這些進(jìn)行說明,熟悉ibatis的朋友就很簡(jiǎn)單了,可以直接跳過。
              
              到此,關(guān)于配置文件的說明就講完了,因?yàn)檫@個(gè)SSM3的例子采用maven來(lái)構(gòu)建,與之前的SSH2不一樣,大象對(duì)配置文件進(jìn)行了簡(jiǎn)要的說明,使用maven的好處,大家應(yīng)該看出來(lái)了,它對(duì)于開發(fā)構(gòu)建來(lái)說顯得簡(jiǎn)單一些,可以使你不需要到處去找jar包,也不用你去擔(dān)心版本不一致的問題,另外,對(duì)于依賴的jar包,它還能自動(dòng)去查找它自己的依賴,這可以減少我們很多不必要的重復(fù)勞動(dòng)。下一章,我將分析下本例的層次結(jié)構(gòu)與MyBatis的簡(jiǎn)單運(yùn)用。
              本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請(qǐng)注明出處。http://bolo.blogjava.net/
          posted on 2011-06-01 19:27 菠蘿大象 閱讀(32454) 評(píng)論(5)  編輯  收藏 所屬分類: Spring3

          評(píng)論:
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二) 2011-06-09 09:50 | Phirothing
          很好,很強(qiáng)大。  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二) 2011-07-12 10:19 | keer
          菠蘿大哥,你的這個(gè)系列(springmvc + mybatis)好像好久好久都沒有續(xù)集了哦,在下可是天天翹首以待呢,呵呵  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二) 2011-07-13 08:57 | 菠蘿大象
          @keer
          本來(lái)以為可以閑下寫寫博客,可哪知道又TMD有很多事情要做,再加上其它一些亂七八糟的事情,所以。。。。第三篇我已經(jīng)寫完了,在做檢查與修改,這兩天就可以發(fā)了  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二) 2011-07-26 16:20 | kpc100
          能給個(gè)源碼嗎?我郵箱:ouosome@gmail.com,qq:9526749謝謝!  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(二) 2011-08-02 18:02 | taote
          三 什么時(shí)候出啊!!!已經(jīng)好久了。。。。。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 蒙山县| 平安县| 德钦县| SHOW| 通河县| 克东县| 孝昌县| 永宁县| 军事| 繁峙县| 五大连池市| 克东县| 南木林县| 伊宁市| 左贡县| 青海省| 绥江县| 旬邑县| 正阳县| 湖南省| 巴南区| 诸城市| 长泰县| 天津市| 澄城县| 福建省| 山西省| 府谷县| 北票市| 黄龙县| 依兰县| 柳江县| 红桥区| 赣榆县| 楚雄市| 巴里| 通道| 常山县| 江西省| 花垣县| 弥渡县|