spring3.0MVC注解(附實(shí)例)_第1頁
spring3.0MVC注解(附實(shí)例)_第2頁
spring3.0MVC注解(附實(shí)例)_第3頁
spring3.0MVC注解(附實(shí)例)_第4頁
spring3.0MVC注解(附實(shí)例)_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、0.提示1)Spri ng 發(fā)行版本附帶了 PetCIi nic示例,它是一個在簡單的表單處理的上下文中,利用了本節(jié)中說明的注解支持的Web應(yīng)用程序。可以在“samples/petclinic” 目錄中找到PetCIinic 應(yīng)用程序。2)另外一個建立在基于注解的Web MVC上的示例應(yīng)用程序,請見imagedb 。這個示例集中在無狀態(tài)的multi-acti on控制器,包括多段文件上傳的處理。可以在“samples/imagedb ” 目錄找到imagedb 應(yīng)用程序。1. 建立dispatcher 實(shí)現(xiàn)注解支持只有對應(yīng)的 HandlerMapping(為了實(shí)現(xiàn)類型級別的注解)和 /或Han

2、dlerAdapter(為了實(shí)現(xiàn)方法級別的注解) 出現(xiàn)在dispatcher 中時,RequestMapping 才會被處理。 這在DispatcherServlet和DispatcherPortlet中都是缺省的行為。然而,如果是在定義自己的HandlerMappings 或HandlerAdapters ,就需要確保一個對應(yīng)的自定義的 DefaultAnnotationHandlerMapping和 / 或 AnnotationMethodHandlerAdapter 同樣被定義假設(shè)想要使用RequestMapping。. (con troller bea n defi niti ons)

3、 .例 1:雁聯(lián) zfpt-servlet.xml配置 DefaultAnnotationHandlerMapping和 / 或 AnnotationMethodHandlerAdapter 1 vlist 例 2 : web.xmlv?xml versio n =1.0en codi ng=ISO-8859-1?Spring PetClinicSpring PetClinic sample application2.1 webAppRootKeywebAppRootKey petclinic.root2.3 log4jC on figLocatio nvparam-name log4jCon

4、figLocationvparam-value /WEB-INF/classes/perties2.4 con textC on figLocati onvparam-name contextConfigLocationvparam-value /WEB-INF/spri ng/applicatio nCon text-jdbc.xml/WEB-INF/applicatio nCon text-security.xml!-/WEB-INF/spr in g/applicati onCon text-hiber nate.xml/WEB-INF/spri ng/applicat

5、i onCon text-jpa.xml-2.5 spri ngSecurityFilterChai nvfilter vfilter-namespringSecurityFilterChainvfilter-classorg.spr in gframework.web.filter.Delegati ngFilterProxyvfilter-mapp ingvfilter- name spri ngSecurityFilterCha invurl-pattern/* 2.6 Log4jC on figListe nerorg.springframework.web.util.Log4jCon

6、figListener2.7 Con textLoaderListe nerorg.spri ngframework.web.c on text.Con textLoaderListe ner/ listener2.8 DispatcherServletpetclinicorg.spri ngframework.web.servlet. DispatcherServlet2load-on-startuppetclinicurl-patter n/ 2.9 excepti on .javajava.lang.Exception/WEB-INF/jsp/uncaughtException.jsp例

7、3 :雁聯(lián)web.xml如果你想要自定義映射策略,顯式的定義一個DefaultA nn otatio nHan dlerMappi ngAnn otatio nM ethodHa ndlerAdapterWebB indingln itializer也有實(shí)際意義。例如,指定一個自定義的PathMatcher 或者1. 一個簡單的基于注解的Controller使用過低版本 Spri ng MVC的讀者都知道:1. 當(dāng)創(chuàng)建一個Controller 時,我們需要直接或間接地實(shí)現(xiàn)org.springframework.web.servlet.mvc.Controller接口。一般情況下,我們是通過繼承

8、SimpleFormController 或 MultiActionController 來定義自己的Controller的。2. 在定義 Controller后,一個重要的事件是在Spring MVC 的配置文件中通過HandlerMapping 定義請求和控制器的映射關(guān)系,以便將兩者關(guān)聯(lián)起來。BbtForumController :3. 來看一下基于注解的Controller是如何定義做到這一點(diǎn)的,下面是使用注解的實(shí)現(xiàn)效果:啟動 Tomcat ,發(fā)送 http:/localhost/forum.doURL請求,BbtForumCo ntrollerlistAIIBoard()方法將響應(yīng)這個

9、請求,并轉(zhuǎn)向WEB-INF/jsp/listBoard.jsp的視圖頁面。清單 1. BbtForumC on troller.javapackage com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.a nn otatio n.Autowired; import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.bi nd.a n

10、n otatio n.ModelAttribute; import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing; import org.spri ngframework.web.b in d.a nno tati on .RequestMethod; import java.util.Collectio n;Co ntroller/ RequestMappi ng(/forum.do)public classBbtForumC on trollerAutowiredprivate BbtForumService

11、bbtForumService;RequestMappi ng / public Stri nglistAllBoard()bbtForumService.getAllBoard();System.out.pri ntl n( call listAIIBoard method.); return listBoard;在 處使用了兩個注解,分別是 Controller和 RequestMapping。在使用 Spring 2.5基于注解驅(qū)動的loC”這篇文章里,筆者曾經(jīng)指出過 Controller、Service以及 Repository和 Component注解的作用是等價的: 將一個類成為

12、Spring容器的 Bean。由于 Spring MVC 的Controller必須事先是一個Bean,所以 Controller注解是不可缺少的。真正讓BbtForumController具備 Spring MVC Controller 功能的是RequestMapping這個注解。RequestMapping可以標(biāo)注在類定義處,將Controller和特定請求關(guān)聯(lián)起來;還可以標(biāo)注在方法簽名處,以便進(jìn)一步對請求進(jìn)行分流。在處,我們讓 BbtForumController關(guān)聯(lián)/forum.do ”的請求,而處,我們具體地指定listAIIBoard()方法來處理請求。所以在類聲明處標(biāo)注的Req

13、uestMapping相當(dāng)于讓POJO實(shí)現(xiàn)了Controller接口,而在方法定義處的RequestMapping相當(dāng)于讓 POJO擴(kuò)展 Spring預(yù)定義的 Controller (如SimpleFormController 等)。清單2. web.xml :啟用Spri ng 容器和Spri ng MVC 框架為了讓基于注解的Spring MVC 真正工作起來,需要在Spring MVC 對應(yīng)的xxx-servlet.xml配置文件中做一些手腳。在此之前,還是先來看一下web.xml的配置吧Spri ng Anno tati on MVC Samplecon textC on figLoc

14、ati onclasspath:applicati onCon text.xmlorg.spri ngframework.web.c on text.Con textLoaderListe nervservlet-nameannomvc org.spri ngframework.web.servlet.DispatcherServlet2a nno mvc *.do清單 3. annom vc-servlet.xmlweb.xml中定義了一個名為 annomvc的 Spri ng MVC 模塊,按照 Spri ng MVC 的 契約,需要在 WEB-INF/a nno mvc-servlet.

15、xml 配置文件中定義 Spri ng MVC 模塊的具體配置。 annom vc-servlet.xml的配置內(nèi)容 如下所示:因?yàn)镾pring所有功能都在Bean的基礎(chǔ)上演化而來,所以必須事先將Controller變成Bean,這是通過在類中標(biāo)注Controller 并在annomvc-servlet.xml中啟用組件掃描機(jī)制來完成的,如所示。在處,配置了一個 AnnotationMethodHandlerAdapter,它負(fù)責(zé)根據(jù) Bean中的 Spring MVC 注解對Bean進(jìn)行加工處理,使這些Bean變成控制器并映射特定的 URL請求。而處的工作是定義模型視圖名稱的解析規(guī)則,這里我

16、們使用了 Spring 2.5的特殊命名空間,即p命名空間,它將原先需要通過 元素配置的內(nèi)容轉(zhuǎn)化為 屬性配置,在一定程度上簡化了 的配置。2. 讓一個Controller處理多個URL請求在低版本的 Spring MVC 中,我們可以通過繼承 MultiActionController 讓一個 Controller處理多個 URL請求。 使用 RequestMapping注解后,這個功能更加容易實(shí)現(xiàn)了。請看下面的代碼:清單3.每個請求處理參數(shù)對應(yīng)一個URLpackage com.baobaotao.web;import com.baobaotao.service.BbtForumService

17、;import org.spri ngframework.bea ns.factory.a nn otatio n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;Co ntrollerpublic classBbtForumC on trollerAutowiredprivate BbtForumService bbtForumService;RequestMappi ng(/l

18、istAIIBoard.do)/ public Stri ng listAllBoard() bbtForumService.getAllBoard();System.out.pri ntl n( call listAIIBoard method.);return listBoard;RequestMappi ng(/listBoardTopic.do)/ public String listBoardTopic(i nt topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTo

19、pic method.);return listTopic;在這里,我們分別在 和處為listAIIBoard() 和listBoardTopic()方法標(biāo)注了 RequestMapping注解,分別指定這兩個方法處理的URL 請求,這相當(dāng)于將BbtForumController 改造為 MultiActionController 。這樣/listAIIBoard.do 的 URL 請求將由 listAllBoard()負(fù)責(zé)處理,而 /listBoardTopic.do?topicld=1 的 URL 請求則由 listBoardTopic()方法處理。清單4. 一個Controller 對應(yīng)

20、一個URL,由請求參數(shù)決定請求處理方法對于處理多個URL請求的 Controller來說,我們傾向于通過一個URL參數(shù)指定 Controller處理方法的名稱(如 method=listAIIBoard ),而非直接通過不同的URL指定 Controller的處理方法。使用 RequestMapping注解很容易實(shí)現(xiàn)這個常用的需求。來看下面的代碼package com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.a nn otatio

21、n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;Co ntrollerRequestMapping(/bbtForum.do)/ 指定控制器對應(yīng) URL 請求public classBbtForumC on trollerAutowiredprivate BbtForumServicebbtForumService ;/ 如果URL請求中包括method=IistAIIBoar

22、d的參數(shù),由本方法進(jìn)行處理RequestMapp ing(params = method =IistAIIBoard)public Stri ng IistAIIBoard() bbtForumService.getAIIBoard();System.out.pri ntl n( call listAIIBoard method.);return listBoard;/ 如果URL請求中包括method=IistBoardTopic的參數(shù),由本方法進(jìn)行處理RequestMapp ing(params = method =IistBoardTopic)public String IistBoar

23、dTopic(i nt topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTopic method.);return listTopic;在類定義處標(biāo)注的RequestM appi ng讓 BbtForumC on troller處理所有包含 /bbtForum.do的URL請求,而BbtForumController中的請求處理方法對 URL請求的分流規(guī)則在 和處定義分流規(guī)則按照URL的method 請求參數(shù)確定。所以分別在類定義處和方法定義處使用RequestMapp in

24、g 注解,就可以很容易通過 URL參數(shù)指定Controller的處理方法了。清單5.讓請求處理方法處理特定的HTTP請求方法RequestMapping注解中除了 params屬性外,還有一個常用的屬性是method,它可以讓Controller方法處理特定 HTTP請求方式的請求,如讓一個方法處理HTTP GET請求,而另一個方法處理HTTP POST請求,如下所示:package com.baobaotao.web;import com.baobaotao.service.BbtForumService;import org.spri ngframework.bea ns.factory.

25、a nn otatio n.Autowired;import org.spri ngframework.stereotype.C on troller;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;import org.spri ngframework.web.b in d.a nno tati on .RequestMethod;Co ntrollerRequestMappi ng(/bbtForum.do)public classBbtForumC on trollerRequestMapp in

26、g( params = method=createTopic,method = RequestMethod.POST)public String createTopic()System.out.pri ntl n(call createTopic method.);return createTopic;這樣只有當(dāng) /bbtForum.do?method=createTopic請求以 HTTP POST 方式提交時,createTopic() 才會進(jìn)行處理。3. 處理 方法入?yún)?如何 綁定URL參數(shù)3.1按契約綁定Controller的方法標(biāo)注了 RequestMapping 注解后,它就能處理

27、特定的 URL請求。我們不禁要問:請求處理方法入?yún)⑹侨绾谓壎║RL參數(shù)的呢?在回答這個問題之前先來看下面的代碼清單5.按參數(shù)名匹配進(jìn)行綁定RequestMapp in g(params = method=listBoardTopic)/ topicId入?yún)⑹侨绾谓壎?URL請求參數(shù)的?public StringlistBoardTopic (int topicId) bbtForumService.getBoardTopics(topicld);System.out.pri ntln (call listBoardTopic method.);return listTopic;當(dāng)我們發(fā)送 ht

28、tp:/localhost/bbtForum.do?method=listBoardTopic&topicld=10的URL請求時,Spring不但讓listBoardTopic()方法處理這個請求,而且還將topicId請求參數(shù)在類型轉(zhuǎn)換后綁定到listBoardTopic()方法的topicId 入?yún)⑸稀6鴏istBoardTopic() 方法的返回類型是String,它將被解析為邏輯視圖的名稱。也就是說Spring在如何給處理方法入?yún)⒆詣淤x值以及如何將處理方法返回值轉(zhuǎn)化為ModelA ndView 中的過程中存在一套潛在的規(guī)則,不熟悉這個規(guī)則就不可能很好地開發(fā)基于注解的請求處理方 法,因

29、此了解這個潛在規(guī)則無疑成為理解Spring MVC框架基于注解功能的核心問題。我們不妨從最常見的開始說起:請求處理方法入?yún)⒌念愋涂梢允荍ava基本數(shù)據(jù)類型或 String類型,這時方法入?yún)磪?shù)名匹配的原則綁定到URL請求參數(shù),同時還自動完成String類型的URL請求參數(shù)到請求處理方法參數(shù)類型的轉(zhuǎn)換。下面給出幾個例子:listBoardTopic(int topicId):和 topicId URL 請求參數(shù)綁定;listBoardTopic(int topicId,String boardName):分別和 topicId、boardName URL 請求參數(shù)綁定;特別的,如果入?yún)⑹腔緮?shù)

30、據(jù)類型(如in t、Io ng、float等),URL請求參數(shù)中一定要有對應(yīng)的參數(shù),否則將拋出TypeMismatchException異常,提示無法將null轉(zhuǎn)換為基本數(shù)據(jù)類型。清單 6. User.java :一個 JavaBean另外,請求處理方法的入?yún)⒁部梢砸粋€JavaBean,如下面的 User對象就可以作為一個入?yún)ackage com.baobaotao.web;public class User private int userId;private String userName;/ 省略get/setter 方法public Stri ng toStri ng()return

31、 this.userName +,+this.userld;清單7.使用JavaBea n作為請求處理方法的入?yún)⑾旅媸菍?User作為listBoardTopic()請求處理方法的入?yún)ⅲ篟equestMapp in g(params = method=listBoardTopic)public StringlistBoardTopic (int topicId,Useruser ) bbtForumService.getBoardTopics(topicId);System.out.pri ntln (topicld:+topicld);System.out.pri ntl n(user:+u

32、ser);System.out.pri ntln (call listBoardTopic method.);return listTopic;這時,如果我們使用以下的 URL請求:http:/localhost/bbtForum.do?method=listBoardTopic&topicId=1&userld =10& userName =tomtopicId URL參數(shù)將綁定到 topicId入?yún)⑸?,而userId 和userName URL參數(shù)將綁定到 user 對象的userId 和userName 屬性中。和URL請求中不允許沒有 topicId參數(shù)不同,雖然User 的userI

33、d屬性的類型是基本數(shù)據(jù)類型,但如果URL中不存在userId 參數(shù),Spring也不會報錯,此時user.userId 值為0。如果 User 對象擁有一個dept.deptId的級聯(lián)屬性,那么它將和dept.deptId URL參數(shù)綁定。3.2通過注解指定綁定的URL參數(shù)如果我們想改變這種默認(rèn)的按名稱匹配的策略,比如讓listBoardTopic(i nt topicId,User user)中的topicId 綁定到id 這個URL參數(shù),那么可以通過對入?yún)⑹褂肦equestParam 注解來達(dá)到目的:清單8. 通過RequestParam注解指定這里,對listBoardTopic()請求

34、處理方法的topicId入?yún)?biāo)注了RequestParam(id)注解,所以它將和 id的URL參數(shù)綁定。package com.baobaotao.web;import org.spri ngframework.web.b in d.a nno tati on .RequestMapp ing;import org.spri ngframework.web.bi nd.a nn otatio n.RequestParam;Co ntrollerRequestMappi ng(/bbtForum.do)public classBbtForumC on trollerRequestMapp in g(params = method=listBoardTopic)public StringlistBoardTopic (RequestParam(id) int topicId,User user) bbtForumService.getBoardTopics(topicld);System.out.pri

溫馨提示

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

評論

0/150

提交評論