亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于注解的SpringMVC簡單介紹

2019-11-14 23:39:52
字體:
來源:轉載
供稿:網友
基于注解的SPRingMVC簡單介紹

SpringMVC是一個基于DispatcherServlet的MVC框架,每一個請求最先訪問的都是 DispatcherServlet,DispatcherServlet負責轉發每一個Request請求給相應的Handler,Handler處理 以后再返回相應的視圖(View)和模型(Model),返回的視圖和模型都可以不指定,即可以只返回Model或只返回View或都不返回。在使用注解 的SpringMVC中,處理器Handler是基于@Controller和@RequestMapping這兩個注解的,@Controller聲明 一個處理器類,@RequestMapping聲明對應請求的映射關系,這樣就可以提供一個非常靈活的匹配和處理方式。

DispatcherServlet是繼承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么 我們先來配置一下DispatcherServlet,好讓它能夠管理我們希望它管理的內容。HttpServlet是在web.xml文件中聲明的。

Xml代碼 收藏代碼
  1. <servlet>
  2. <servlet-name>blog</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>blog</servlet-name>
  8. <url-pattern>*.do</url-pattern>
  9. </servlet-mapping>

上面聲明了一個名為blog的DispatcherServlet,該Servlet將處理所有以“.do”結尾的請求。在初始化 DispatcherServlet的時候,SpringMVC默認會到/WEB-INF目錄下尋找一個叫[servlet-name]- servlet.xml的配置文件,來初始化里面的bean對象,該文件中對應的bean對象會覆蓋spring配置文件中聲明的同名的bean對象。如 上面的就會在/WEB-INF目錄下尋找一個叫blog-servlet.xml的文件;當然也可以在Servlet中聲明配置文件的位置,那就是通過 Servlet的初始化參數來設置contextConfigLocation參數的值。

Xml代碼 收藏代碼
  1. <servlet>
  2. <servlet-name>blog</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>/WEB-INF/blog-servlet.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>blog</servlet-name>
  12. <url-pattern>*.do</url-pattern>
  13. </servlet-mapping>

DispatcherServlet會利用一些特殊的bean來處理Request請求和生成相應的視圖返回。

關于視圖的返回,Controller只負責傳回來一個值,然后到底返回的是什么視圖,是由視圖解析器控制的,在jsp中常用的視圖解析器是InternalResourceViewResovler,它會要求一個前綴和一個后綴

Xml代碼 收藏代碼
  1. <bean
  2. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <propertyname="prefix"value="/WEB-INF/"/>
  4. <propertyname="suffix"value=".jsp"/>
  5. </bean>

在上述視圖解析器中,如果Controller返回的是blog/index,那么通過視圖解析器解析之后的視圖就是/WEB-INF/blog/index.jsp。

要使用注解的SpringMVC需要在SpringMVC的配置文件中進行聲明,具體方式為先引入mvc命名空間,然后利用<mvc:annotation-driven />進行聲明。

Xml代碼 收藏代碼
  1. <beansxmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
  3. <spanstyle="background-color:#00ff00;"><spanstyle="color:#ff0000;">xmlns:mvc="http://www.springframework.org/schema/mvc"</span>
  4. </span>
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  9. <spanstyle="background-color:#00ff00;color:#ff0000;">http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"</span>
  11. >
  12. <mvc:annotation-driven/>
  13. </beans>

主要是說說Controller.

在SpringMVC中Controller不需要繼承什么類,也不需要實現什么接口,一切使用了@Controller進行標記的類都是Controller

java代碼 收藏代碼
  1. @Controller
  2. publicclassBlogController{
  3. }

有了Controller之后,那么到底是怎樣請求一個Controller具體的方法的呢,那是通過@RequestMapping來標記 的,@RequestMapping可以標記在類上面,也可以標記在方法上,當方法上和類上都標記了@RequestMapping的時候,那么對應的方 法對應的Url就是類上的加方法上的,如下面的index方法,其對應的URL應為類上的/blog加上index方法上的/index,所以應為 /blog/index,所以當請求/blog/index.do的時候就會訪問BlogController的index方法。加在類上的 @RequestMapping不是必須的,當Controller類上加上了@RequestMapping的時候,那么Controller方法上的 @RequestMapping就是相對于類上的@RequestMapping而言的,也就是前面說的請求映射的時候是類上的地址加方法上的地址,而當 Controller類上沒有加@RequestMapping的時候,方法上的@RequestMapping就是絕對路徑了。

Java代碼 收藏代碼
  1. @Controller
  2. @RequestMapping("/blog")
  3. publicclassBlogController{
  4. @RequestMapping("/index")
  5. publicStringindex(Map<String,Object>map){
  6. return"blog/index";
  7. }
  8. }

在上面的代碼中,如果index方法上沒有RequestMapping注解,而只有BlogController類上有,且該類只有一個方法的時候,直接請求類上的URL就會調用里面的方法,即直接請求/blog.do的時候就會調用index方法。

在RequestMapping中還可以指定一個屬性method,其主要對應的值有RequestMethod.GET和 RequestMethod.POST,利用該屬性可以嚴格的控制某一方法只能被標記的請求路徑對應的請求方法才能訪問,如指定method的值為 GET,則表示只有通過GET方式才能訪問該方法,默認是都可以訪問。RequestMapping中的URL映射還支持通配符*,如:

Java代碼 收藏代碼
  1. @Controller
  2. @RequestMapping("/blog")
  3. publicclassBlogController{
  4. @RequestMapping("/*/index")
  5. publicStringindex(Map<String,Object>map){
  6. return"blog/index";
  7. }
  8. }

在@RequestMapping中還有一個屬性params,可以通過該屬性指定請求參數中必須包含某一參數,或必須不包含某一參數,或某參數的值必須是什么,以此來縮小指定的映射范圍。

Java代碼 收藏代碼
  1. @Controller
  2. @RequestMapping("/blog")
  3. publicclassBlogController{
  4. @RequestMapping(value="/index",params="param1=value1")
  5. publicStringindex(Map<String,Object>map){
  6. return"blog/index";
  7. }
  8. }

在上面示例中,只有當請求/blog/index.do并且請求參數param1的值為value1的時候才能訪問到對應的index方法。如果 params的值為"param1",則表示請求參數只要包含param1就可以了,至于它的值是什么無所謂;如果params的值 為"!param1",則表示請求參數必須不包含param1才可以。@RequestMapping中還可以使用header來縮小映射范圍,如:

Java代碼 收藏代碼
  1. @Controller
  2. @RequestMapping("/blog")
  3. publicclassBlogController{
  4. @RequestMapping(value="/index",headers="content-type=text/html")
  5. publicStringindex(Map<String,Object>map){
  6. return"blog/index";
  7. }
  8. }

在SpringMVC中常用的注解還有@PathVariable,@RequestParam,@PathVariable標記在方法的參數上,利用它標記的參數可以利用請求路徑傳值,看下面一個例子

Java代碼 收藏代碼
  1. @RequestMapping(value="/comment/{blogId}",method=RequestMethod.POST)
  2. publicvoidcomment(Commentcomment,@PathVariableintblogId,Httpsessionsession,HttpServletResponseresponse)throwsIOException{
  3. }

在該例子中,blogId是被@PathVariable標記為請求路徑變量的,如果請求的是/blog/comment/1.do的時候就表示 blogId的值為1,@PathVariable在進行賦值的時候如果像上面那樣沒有指定后面接的變量是對應URL中的哪個變量時默認是從URL中取跟 后面接的變量名相同的變量,如上面示例中的@PathVariable int blogId,沒有指明要獲取URL中的哪個變量,這個時候就默認取URL中的blogId變量對應的值賦給方法參數中的blogId,那如果方法參數的 名稱跟RequestMapping中定義的訪問路徑中的變量名不一樣,或者我要利用PathVariable明確指定后面接的方法參數是對應于URL中 的哪個變量時,可以像下面這樣做,在PathVariable中給定一個value="blogId"(只有一個參數的時候value是可以省略的)值明 確指定方法參數中的id變量是對應請求路徑定義中的blogId變量的。

Java代碼 收藏代碼
  1. @RequestMapping(value="/comment/{blogId}",method=RequestMethod.POST)
  2. publicvoidcomment(Commentcomment,@PathVariable("blogId")intid,HttpSessionsession,HttpServletResponseresponse)throwsIOException{
  3. }

同樣@RequestParam也是用來給參數傳值的,但是它是從頭request的參數里面取值,相當于 request.getParameter("參數名")方法。它的取值規則跟@PathVariable是一樣的,當沒有指定的時候,默認是從 request中取名稱跟后面接的變量名同名的參數值,當要明確從request中取一個參數的時候使用@RequestParam("參數名"),如下 所示:

Java代碼 收藏代碼
  1. @RequestMapping("/show")
  2. publicvoidshowParam(@RequestParamintid,@RequestParam("name")Stringusername){
  3. //這樣做進行URL請求訪問這個方法的時候,就會先從request中獲取參數id的值賦給參數變量id,從request中獲取參數name的值賦給參數變量username
  4. }

在Controller的方法中,如果需要WEB元素HttpServletRequest,HttpServletResponse和 HttpSession,只需要在給方法一個對應的參數,那么在訪問的時候SpringMVC就會自動給其傳值,但是需要注意的是在傳入Session的 時候如果是第一次訪問系統的時候就調用session會報錯,因為這個時候session還沒有生成。

接下來討論一下方法的返回值,主要有以下情況:

  • 返回一個ModelAndView,其中Model是一個Map,里面存放的是一對對的鍵值對,其可以直接在頁面上使用,View是一個字符串,表示的是某一個View的名稱
  • 返回一個字符串,這個時候如果需要給頁面傳值,可以給方法一個Map參數,該Map就相當于一個Model,往該Model里面存入鍵值對就可以在頁面上進行訪問了
  • 返回一個View對象
  • 返回一個Model也就是一個Map,這個時候將解析默認生成的view name,默認情況view name就是方法名, 這里之前搞錯了,感謝網友的指正。默認的View Name是由RequestToViewNameTranslator來解析的,顧名思義就是把request翻譯成viewName,在沒有指定 RequestToViewNameTranslator時,Spring將使用其自身的默認實現 DefaultRequestToViewNameTranslator的默認配置,即取到當前請求的URI,去掉最前和最后的斜杠“/”,以及對應的后 綴。所以當你請求“http://localhost/app/abc”的時候,對應的默認viewName就是請求URI——“/abc”去掉最前最后 的斜杠和后綴之后的結果,即“abc”,請求“http://localhost/app/abc/efg”時對應的默認視圖名稱是“abc /efg”,“http://localhost/app/abc/efg/hi.html”——>“abc/efg/hi”。如果需要改變默認的 視圖名稱的解析方式,可以在SpringMVC的配置文件中配置一個名稱為viewNameTranslator,類型為 RequestToViewNameTranslator的bean。如果該bean是 DefaultRequestToViewNameTranslator,那么你可以通過prefix屬性指定視圖名稱的前綴,通過suffix指定后 綴,通過stripLeadingSlash指定是否需要去掉最前面的斜杠,更多可指定的屬性請參考 DefaultRequestToViewNameTranslator的實現。當然你也可以定義自己的 RequestToViewNameTranslator實現類,實現RequestToViewNameTranslator接口的 getViewName(HttpServletRequest request)方法,實現自己的獲取默認視圖名稱的邏輯。
  • 什么也不返回,這個時候可以在方法體中直接往HttpServletResponse寫入返回內容,否則將會由RequestToViewNameTranslator來決定
  • 任何其他類型的對象。這個時候就會把該方法返回類型對象當做返回Model模型的一個屬性返回給視圖使用,這個屬性名稱可以通過在方法上給定@ModelAttribute注解來指定,否則將默認使用該返回類名稱作為屬性名稱。
下面是一個簡單的實例Java代碼 收藏代碼
  1. @RequestMapping("/{owner}/index")
  2. publicStringuserIndex(Map<String,Object>map,@PathVariableStringowner,HttpServletRequestrequest)throwsParserException{
  3. List<DefCategory>categories=categoryService.find(owner);
  4. intoffset=Util.getOffset(request);
  5. Pager<Blog>pager=blogService.find(owner,0,offset,maxResults);
  6. inttotalRecords=pager.getTotalRecords();
  7. List<Blog>blogs=pager.getData();
  8. Util.shortBlog(blogs);
  9. List<Message>messages=messageService.find(owner,0,5).getData();
  10. Util.shortMessage(messages,20);
  11. map.put("messages",messages);
  12. map.put("totalRecords",totalRecords);
  13. List<BlogStore>stores=storeService.find(owner,0,5).getData();
  14. map.put("maxResults",maxResults);
  15. map.put("blogs",blogs);
  16. map.put("totalRecords",totalRecords);
  17. map.put("owner",userService.find(owner));
  18. map.put("defCategories",categories);
  19. map.put("stores",stores);
  20. return"blog/userIndex";
  21. }
給頁面傳值

在Controller中把請求轉發給業務邏輯層進行處理之后需要把業務邏輯層的處理結果進行展現,在展現的過程中就需要我們把處理結果傳給展示層進行展 示。那么處理結果是怎么進行傳遞的呢?前面已經說了Controller的返回結果可以是一個包含模型和視圖的ModelAndView,也可以僅僅是一 個視圖View,當然也可以什么都不返回,還可以是僅僅返回一個Model。我們知道模型Model是用來封裝數據給視圖View進行展示的,那么,在 SpringMVC中,如果要把我們后臺的信息傳遞給前臺進行展示的話應該怎么做呢?這主要有兩種方式: 1.返回包含模型Model的ModelAndView,或者是直接返回一個Model(這個時候就需要考慮默認的視圖),這種類型的返回結果是包含Model的,這個Model對象里面的對應屬性列都可以直接在視圖里面使用。 2.如果是直接返回一個視圖View,這個時候SpringMVC提供了一種類似于在Controller方法中獲取HttpRequest對象的機制,這個時候我們只需要給定Controller方法一個Map參數,然后在方法體里面給這個Map加上需要傳遞到視圖的鍵值對,這樣在視圖中就可以直接訪問對應的鍵值對。

文章出自:http://haohaoxuexi.VEvb.com/blog/1343761


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久999精品视频| 亚洲性生活视频| 欧美大胆在线视频| 国产一区二区黑人欧美xxxx| 日韩欧美国产中文字幕| 日韩中文字幕在线观看| 欧美在线xxx| 在线国产精品视频| 孩xxxx性bbbb欧美| 欧美性生交大片免费| 2021国产精品视频| 久久成人亚洲精品| 国产精品免费一区| 久久久精品影院| 国产精品96久久久久久又黄又硬| 国产精品自拍偷拍| 日韩成人av网| 亚洲国产成人精品一区二区| 亚洲在线一区二区| 国产精品久久久久久久7电影| 日韩一级裸体免费视频| 国产精品中文字幕久久久| 亚洲精品短视频| 国产日韩av高清| 欧美电影免费播放| 国产精品网红直播| 久久精品国产综合| 欧美在线观看网址综合| 国模视频一区二区| 欧美激情视频网站| 欧美中文在线免费| 欧美成人一二三| 日韩av电影国产| 色婷婷av一区二区三区在线观看| 国产欧美va欧美va香蕉在| xxx一区二区| 精品欧美国产一区二区三区| 国产色视频一区| 日韩美女视频中文字幕| 国产欧美精品在线播放| 亚洲人成电影在线| 国外日韩电影在线观看| 亚洲精品网址在线观看| 国产精品久久久| 91精品国产网站| 久久久亚洲精选| 久久精品国产亚洲7777| 亚洲一区二区三区四区在线播放| 精品国产鲁一鲁一区二区张丽| 97超级碰在线看视频免费在线看| 成人免费网站在线| 欧美第一黄色网| 欧美性猛交xxxxx免费看| 日韩欧美精品网站| 国产精品久久久久久久一区探花| 欧美激情亚洲综合一区| 91夜夜揉人人捏人人添红杏| 国产精品久久久久9999| 欧美另类老女人| 国产精品高潮呻吟久久av黑人| 精品亚洲夜色av98在线观看| 亚洲韩国日本中文字幕| 亚州成人av在线| 国产成人黄色av| 精品久久香蕉国产线看观看gif| 精品国产一区二区三区在线观看| 精品福利一区二区| 亚洲第一综合天堂另类专| 秋霞av国产精品一区| 91久久综合亚洲鲁鲁五月天| 成人午夜在线影院| 中文字幕av一区二区| 日韩一级黄色av| 国产欧美精品va在线观看| 亚洲综合在线做性| 国产亚洲精品久久久久久牛牛| 日韩小视频在线观看| 国产精品一区二区3区| 亚洲欧美成人精品| 97涩涩爰在线观看亚洲| 中文字幕在线视频日韩| 国产91精品在线播放| 日韩视频免费大全中文字幕| 欧美精品video| 国产91色在线|免| 久久久久久成人精品| 成人福利网站在线观看11| 国产精品大片wwwwww| 亚洲免费av电影| 欧美性猛交xxxx免费看漫画| 亚洲图片在区色| 91久久久亚洲精品| 91沈先生在线观看| 成人黄色av免费在线观看| 亚洲无限乱码一二三四麻| 亚洲激情电影中文字幕| 亚洲成年人影院在线| 欧美中在线观看| 在线视频国产日韩| 亚洲第一区中文99精品| 亚洲97在线观看| 日韩第一页在线| 国产激情久久久| 成人黄色网免费| 国产精品美腿一区在线看| 欧美一区二粉嫩精品国产一线天| 久久成年人免费电影| 欧美日韩免费观看中文| 久久不射热爱视频精品| 中文字幕日韩在线观看| 26uuu亚洲伊人春色| 亚洲国产精品人久久电影| 91精品国产高清久久久久久91| 国产99久久精品一区二区| 91视频88av| 久久99热这里只有精品国产| 欧美在线精品免播放器视频| 亚洲丁香婷深爱综合| 久久精品91久久久久久再现| 欧美成人高清视频| 日韩高清欧美高清| 欧美在线视频一区二区| 亚洲bt欧美bt日本bt| 国产精品女人网站| 亚洲一区二区三区在线免费观看| 亚洲精品中文字幕有码专区| 韩国精品美女www爽爽爽视频| 欧美成年人视频网站欧美| 欧美在线观看视频| 国产欧美中文字幕| 亲爱的老师9免费观看全集电视剧| 日韩福利在线播放| 一本色道久久88精品综合| 国产午夜精品美女视频明星a级| 国产不卡精品视男人的天堂| 日韩av在线一区| 日韩欧中文字幕| 欧美一区二区色| 欧美激情一区二区三级高清视频| 国产91成人video| 97国产一区二区精品久久呦| 国产精品久久综合av爱欲tv| 久久艳片www.17c.com| 精品视频久久久久久久| 日韩av电影在线免费播放| 日本精品视频在线| 欧美日韩一二三四五区| 日韩美女主播视频| 国产视频在线一区二区| 国产精品男人的天堂| 免费97视频在线精品国自产拍| 成人激情在线播放| 57pao国产成人免费| 欧美大尺度激情区在线播放| 国产高清视频一区三区| 国产精品91在线观看| 国语自产精品视频在线看| 热久久免费国产视频| 国产精品久久久久久久久久久新郎| 亚洲热线99精品视频| 亚洲系列中文字幕| 欧美一区二区三区免费观看| 久久久电影免费观看完整版| 韩日精品中文字幕|