多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > SpringMVC Controller介紹

SpringMVC Controller介紹

來源:程序員人生   發(fā)布時間:2015-01-13 08:13:07 閱讀次數(shù):2910次

SpringMVC Controller 介紹

1、簡介

         在SpringMVC 中,控制器Controller 負責(zé)處理由DispatcherServlet 分發(fā)的要求,它把用戶要求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理以后封裝成1個Model ,然后再把該Model 返回給對應(yīng)的View 進行展現(xiàn)。在SpringMVC 中提供了1個非常簡便的定義Controller 的方法,你無需繼承特定的類或?qū)崿F(xiàn)特定的接口,只需使用@Controller 標記1個類是Controller ,然后使用@RequestMapping 和@RequestParam 等1些注解用以定義URL 要求和Controller 方法之間的映照,這樣的Controller 就可以被外界訪問到。另外Controller 不會直接依賴于HttpServletRequest和HttpServletResponse 等HttpServlet 對象,它們可以通過Controller 的方法參數(shù)靈活的獲得到。為了先對Controller 有1個初步的印象,以下先定義1個簡單的Controller :

Java代碼  收藏代碼
  1. @Controller  
  2. public class MyController {  
  3.   
  4.     @RequestMapping ( "/showView" )  
  5.     public ModelAndView showView() {  
  6.        ModelAndView modelAndView = new ModelAndView();  
  7.        modelAndView.setViewName( "viewName" );  
  8.        modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對應(yīng)的屬性值,它是1個對象 " );  
  9.        return modelAndView;  
  10.     }  
  11.   
  12. }   
 

在上面的示例中,@Controller 是標記在類MyController 上面的,所以類MyController 就是1個SpringMVC Controller 對象了,然后使用@RequestMapping(“/showView”) 標記在Controller 方法上,表示當要求/showView.do 的時候訪問的是MyController 的showView 方法,該方法返回了1個包括Model 和View的ModelAndView 對象。這些在后續(xù)都將會詳細介紹。

2、使用 @Controller 定義1個 Controller 控制器

         @Controller 用于標記在1個類上,使用它標記的類就是1個SpringMVC Controller 對象。分發(fā)處理器將會掃描使用了該注解的類的方法,并檢測該方法是不是使用了@RequestMapping 注解。@Controller 只是定義了1個控制器類,而使用@RequestMapping 注解的方法才是真正處理要求的處理器,這個接下來就會講到。

   單單使用@Controller 標記在1個類上還不能真正意義上的說它就是SpringMVC 的1個控制器類,由于這個時候Spring 還不認識它。那末要如何做Spring 才能認識它呢?這個時候就需要我們把這個控制器類交給Spring 來管理。拿MyController 來舉1個例子

 

Java代碼  收藏代碼
  1. @Controller  
  2. public class MyController {  
  3.     @RequestMapping ( "/showView" )  
  4.     public ModelAndView showView() {  
  5.        ModelAndView modelAndView = new ModelAndView();  
  6.        modelAndView.setViewName( "viewName" );  
  7.        modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對應(yīng)的屬性值,它是1個對象 " );  
  8.        return modelAndView;  
  9.     }  
  10.   
  11. }   
 

這個時候有兩種方式可以把MyController 交給Spring 管理,好讓它能夠辨認我們標記的@Controller 。

   第1種方式是在SpringMVC 的配置文件中定義MyController 的bean 對象。

<bean class="com.host.app.web.controller.MyController"/>

   第2種方式是在SpringMVC 的配置文件中告知Spring 該到哪里去找標記為@Controller 的Controller 控制器。

Xml代碼  收藏代碼
  1. < context:component-scan base-package = "com.host.app.web.controller" >  
  2.    < context:exclude-filter type = "annotation"  
  3.        expression = "org.springframework.stereotype.Service" />  
  4. </ context:component-scan >   

    注:

       上面 context:exclude-filter 標注的是不掃描 @Service 標注的類

3、使用 @RequestMapping 來映照 Request 要求與處理器

         可使用@RequestMapping 來映照URL 到控制器類,或是到Controller 控制器的處理方法上。當@RequestMapping 標記在Controller 類上的時候,里面使用@RequestMapping 標記的方法的要求地址都是相對類上的@RequestMapping 而言的;當Controller 類上沒有標記@RequestMapping 注解時,方法上的@RequestMapping 都是絕對路徑。這類絕對路徑和相對路徑所組合成的終究路徑都是相對根路徑“/ ”而言的。

 

Java代碼  收藏代碼
  1. @Controller  
  2. public class MyController {  
  3.     @RequestMapping ( "/showView" )  
  4.     public ModelAndView showView() {  
  5.        ModelAndView modelAndView = new ModelAndView();  
  6.        modelAndView.setViewName( "viewName" );  
  7.        modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對應(yīng)的屬性值,它是1個對象 " );  
  8.        return modelAndView;  
  9.     }  
  10.   
  11. }   
 

在這個控制器中,由于MyController 沒有被@RequestMapping 標記,所以當需要訪問到里面使用了@RequestMapping 標記的showView 方法時,就是使用的絕對路徑/showView.do 要求就能夠了。

 

Java代碼  收藏代碼
  1. @Controller  
  2. @RequestMapping ( "/test" )  
  3. public class MyController {  
  4.     @RequestMapping ( "/showView" )  
  5.     public ModelAndView showView() {  
  6.        ModelAndView modelAndView = new ModelAndView();  
  7.        modelAndView.setViewName( "viewName" );  
  8.        modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對應(yīng)的屬性值,它是1個對象 " );  
  9.        return modelAndView;  
  10.     }  
  11.   
  12. }   
 

   這類情況是在控制器上加了@RequestMapping 注解,所以當需要訪問到里面使用了@RequestMapping 標記的方法showView() 的時候就需要使用showView 方法上@RequestMapping 相對控制器MyController上@RequestMapping 的地址,即/test/showView.do 。

(1)使用 URI 模板

   URI 模板就是在URI 中給定1個變量,然后在映照的時候動態(tài)的給該變量賦值。如URI 模板http://localhost/app/{variable1}/index.html ,這個模板里面包括1個變量variable1 ,那末當我們要求http://localhost/app/hello/index.html 的時候,該URL 就跟模板相匹配,只是把模板中的variable1 用hello 來取代。在SpringMVC 中,這類取代模板中定義的變量的值也能夠給處理器方法使用,這樣我們就能夠非常方便的實現(xiàn)URL 的RestFul 風(fēng)格。這個變量在SpringMVC 中是使用@PathVariable 來標記的。

   在SpringMVC 中,我們可使用@PathVariable 來標記1個Controller 的處理方法參數(shù),表示該參數(shù)的值將使用URI 模板中對應(yīng)的變量的值來賦值。

 

Java代碼  收藏代碼
  1. @Controller  
  2. @RequestMapping ( "/test/{variable1}" )  
  3. public class MyController {  
  4.   
  5.     @RequestMapping ( "/showView/{variable2}" )  
  6.     public ModelAndView showView( @PathVariable String variable1, @PathVariable ( "variable2" ) int variable2) {  
  7.        ModelAndView modelAndView = new ModelAndView();  
  8.        modelAndView.setViewName( "viewName" );  
  9.        modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對應(yīng)的屬性值,它是1個對象 " );  
  10.        return modelAndView;  
  11.     }  
  12. }   
 

   在上面的代碼中我們定義了兩個URI 變量,1個是控制器類上的variable1 ,1個是showView 方法上的variable2,然后在showView 方法的參數(shù)里面使用@PathVariable 標記使用了這兩個變量。所以當我們使用/test/hello/showView/2.do 來要求的時候就能夠訪問到MyController 的showView 方法,這個時候variable1 就被賦予值hello ,variable2 就被賦予值2 ,然后我們在showView 方法參數(shù)里面標注了參數(shù)variable1 和variable2 是來自訪問路徑的path 變量,這樣方法參數(shù)variable1 和variable2 就被分別賦予hello 和2 。方法參數(shù)variable1 是定義為String 類型,variable2 是定義為int 類型,像這類簡單類型在進行賦值的時候Spring 是會幫我們自動轉(zhuǎn)換的,關(guān)于復(fù)雜類型該如何來轉(zhuǎn)換在后續(xù)內(nèi)容中將會講到。

   在上面的代碼中我們可以看到在標記variable1 為path 變量的時候我們使用的是@PathVariable ,而在標記variable2 的時候使用的是@PathVariable(“variable2”) 。這二者有甚么區(qū)分呢?第1種情況就默許去URI 模板中找跟參數(shù)名相同的變量,但是這類情況只有在使用debug 模式進行編譯的時候才可以,而第2種情況是明確規(guī)定使用的就是URI 模板中的variable2 變量。當不是使用debug 模式進行編譯,或是所需要使用的變量名跟參數(shù)名不相同的時候,就要使用第2種方式明確指出使用的是URI 模板中的哪一個變量。

   除在要求路徑中使用URI 模板,定義變量以外,@RequestMapping 中還支持通配符“* ”。以下面的代碼我就能夠使用/myTest/whatever/wildcard.do 訪問到Controller 的testWildcard 方法。

 

Java代碼  收藏代碼
  1. @Controller  
  2. @RequestMapping ( "/myTest" )  
  3. public class MyController {  
  4.     @RequestMapping ( "*/wildcard" )  
  5.     public String testWildcard() {  
  6.        System. out .println( "wildcard------------" );  
  7.        return "wildcard" ;  
  8.     }    
  9. }   
 

(2)使用 @RequestParam 綁定 HttpServletRequest 要求參數(shù)到控制器方法參數(shù)

 

Java代碼  收藏代碼
  1. @RequestMapping ( "requestParam" )  
  2. ublic String testRequestParam( @RequestParam(required=false) String name, @RequestParam ( "age" ) int age) {  
  3.    return "requestParam" ;  
  4. }   
 

在上面代碼中利用@RequestParam 從HttpServletRequest 中綁定了參數(shù)name 到控制器方法參數(shù)name ,綁定了參數(shù)age 到控制器方法參數(shù)age 。值得注意的是和@PathVariable 1樣,當你沒有明確指定從request 中取哪一個參數(shù)時,Spring 在代碼是debug 編譯的情況下會默許取更方法參數(shù)同名的參數(shù),如果不是debug 編譯的就會報錯。另外,當需要從request 中綁定的參數(shù)和方法的參數(shù)名不相同的時候,也需要在@RequestParam 中明確指出是要綁定哪一個參數(shù)。在上面的代碼中如果我訪問/requestParam.do?name=hello&age=1 則Spring 將會把request要求參數(shù)name 的值hello 賦給對應(yīng)的處理方法參數(shù)name ,把參數(shù)age 的值1 賦給對應(yīng)的處理方法參數(shù)age 。

在@RequestParam 中除指定綁定哪一個參數(shù)的屬性value 以外,還有1個屬性required ,它表示所指定的參數(shù)是不是必須在request 屬性中存在,默許是true ,表示必須存在,當不存在時就會報錯。在上面代碼中我們指定了參數(shù)name 的required 的屬性為false ,而沒有指定age 的required 屬性,這時候候如果我們訪問/requestParam.do而沒有傳遞參數(shù)的時候,系統(tǒng)就會拋出異常,由于age 參數(shù)是必須存在的,而我們沒有指定。而如果我們訪問/requestParam.do?age=1 的時候就能夠正常訪問,由于我們傳遞了必須的參數(shù)age ,而參數(shù)name 是非必須的,不傳遞也能夠。

(3)使用 @CookieValue 綁定 cookie 的值到 Controller 方法參數(shù)

 

Java代碼  收藏代碼
  1. @RequestMapping ( "cookieValue" )  
  2. public String testCookieValue( @CookieValue ( "hello" ) String cookieValue, @CookieValue String hello) {  
  3.    System. out .println(cookieValue + "-----------" + hello);  
  4.    return "cookieValue" ;  
  5. }   
 

    在上面的代碼中我們使用@CookieValue 綁定了cookie 的值到方法參數(shù)上。上面1共綁定了兩個參數(shù),1個是明確指定要綁定的是名稱為hello 的cookie 的值,1個是沒有指定。使用沒有指定的情勢的規(guī)則和@PathVariable、@RequestParam 的規(guī)則是1樣的,即在debug 編譯模式下將自動獲得跟方法參數(shù)名同名的cookie 值。

(4)使用 @RequestHeader 注解綁定 HttpServletRequest 頭信息到Controller 方法參數(shù)

 

Java代碼  收藏代碼
  1. @RequestMapping ( "testRequestHeader" )  
  2. public String testRequestHeader( @RequestHeader ( "Host" ) String hostAddr, @RequestHeader String Host, @RequestHeader String host ) {  
  3.     System. out .println(hostAddr + "-----" + Host + "-----" + host );  
  4.     return "requestHeader" ;  
  5. }   
 

         在上面的代碼中我們使用了 @RequestHeader 綁定了 HttpServletRequest 要求頭 host 到Controller 的方法參數(shù)。上面方法的3個參數(shù)都將會賦予同1個值,由此我們可以知道在綁定要求頭參數(shù)到方法參數(shù)的時候規(guī)則和 @PathVariable 、 @RequestParam 和 @CookieValue 是1樣的,即沒有指定綁定哪一個參數(shù)到方法參數(shù)的時候,在 debug 編譯模式下將使用方法參數(shù)名作為需要綁定的參數(shù)。但是有1點 @RequestHeader 跟另外3種綁定方式是不1樣的,那就是在使用 @RequestHeader 的時候是大小寫不敏感的,即 @RequestHeader(“Host”) 和 @RequestHeader(“host”) 綁定的都是Host 頭信息。記住在 @PathVariable 、 @RequestParam 和 @CookieValue 中都是大小寫敏感的。

(5) @RequestMapping 的1些高級利用

         在RequestMapping 中除指定要求路徑value 屬性外,還有其他的屬性可以指定,如params 、method和headers 。這樣屬性都可以用于縮小要求的映照范圍。

 

1.params屬性

 

   params 屬性用于指定要求參數(shù)的,先看以下代碼。

 

Java代碼  收藏代碼
  1. @RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })  
  2. public String testParams() {  
  3.    System. out .println( "test Params..........." );  
  4.    return "testParams" ;  
  5. }   
 

   在上面的代碼中我們用@RequestMapping 的params 屬性指定了3個參數(shù),這些參數(shù)都是針對要求參數(shù)而言的,它們分別表示參數(shù)param1 的值必須等于value1 ,參數(shù)param2 必須存在,值無所謂,參數(shù)param3 必須不存在,只有當要求/testParams.do 并且滿足指定的3個參數(shù)條件的時候才能訪問到該方法。所以當要求/testParams.do?param1=value1&param2=value2 的時候能夠正確訪問到該testParams 方法,當要求/testParams.do?param1=value1&param2=value2&param3=value3 的時候就不能夠正常的訪問到該方法,由于在@RequestMapping 的params 參數(shù)里面指定了參數(shù)param3 是不能存在的。

 

2.method屬性

 

   method 屬性主要是用于限制能夠訪問的方法類型的。

 

Java代碼  收藏代碼
  1. @RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })  
  2. public String testMethod() {  
  3.    return "method" ;  
  4. }   
 

在上面的代碼中就使用method 參數(shù)限制了以GET 或DELETE 方法要求/testMethod.do 的時候才能訪問到該Controller 的testMethod 方法。

 

3.headers屬性

 

         使用headers 屬性可以通過要求頭信息來縮小@RequestMapping 的映照范圍。

 

Java代碼  收藏代碼
  1. @RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })  
  2. public String testHeaders() {  
  3.    return "headers" ;  
  4. }   
 

   headers 屬性的用法和功能與params 屬性相似。在上面的代碼中當要求/testHeaders.do 的時候只有當要求頭包括Accept 信息,且要求的host 為localhost 的時候才能正確的訪問到testHeaders 方法。

(6)以 @RequestMapping 標記的處理器方法支持的方法參數(shù)和返回類型

1. 支持的方法參數(shù)類型

         (1 )HttpServlet 對象,主要包括HttpServletRequest 、HttpServletResponse 和HttpSession 對象。 這些參數(shù)Spring 在調(diào)用途理器方法的時候會自動給它們賦值,所以當在處理器方法中需要使用到這些對象的時候,可以直接在方法上給定1個方法參數(shù)的申明,然后在方法體里面直接用就能夠了。但是有1點需要注意的是在使用HttpSession 對象的時候,如果此時HttpSession 對象還沒有建立起來的話就會有問題。

   (2 )Spring 自己的WebRequest 對象。 使用該對象可以訪問到寄存在HttpServletRequest 和HttpSession中的屬性值。

   (3 )InputStream 、OutputStream 、Reader 和Writer 。 InputStream 和Reader 是針對HttpServletRequest 而言的,可以從里面取數(shù)據(jù);OutputStream 和Writer 是針對HttpServletResponse 而言的,可以往里面寫數(shù)據(jù)。

   (4 )使用@PathVariable 、@RequestParam 、@CookieValue 和@RequestHeader 標記的參數(shù)。

   (5 )使用@ModelAttribute 標記的參數(shù)。

   (6 )java.util.Map 、Spring 封裝的Model 和ModelMap 。 這些都可以用來封裝模型數(shù)據(jù),用來給視圖做展現(xiàn)。

   (7 )實體類。 可以用來接收上傳的參數(shù)。

   (8 )Spring 封裝的MultipartFile 。 用來接收上傳文件的。

   (9 )Spring 封裝的Errors 和BindingResult 對象。 這兩個對象參數(shù)必須緊接在需要驗證

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 伊人国产在线观看 | 日韩a级毛片免费视频 | 久久亚洲欧美成人精品 | 亚洲综合在线播放 | 日日麻批视频 | 精品肉动漫资源在线观看 | 色偷偷青青草原在线视频 | 嫩草影院精品视频在线观看 | 欧美福利 | 91精品91| 国产亚洲在线 | 欧美一级毛片不卡免费观看 | 男女视频免费观看 | 国产亚洲一区二区三区在线观看 | 免费欧美日韩 | 欧美激情精品久久久久久久久久 | 亚洲欧美日韩中文字幕久久 | 成人区精品一区二区不卡亚洲 | 99精品大香线蕉线伊人久久久 | 欧美一级在线免费观看 | 亚洲第五页 | 自拍偷自拍亚洲精品10p | 亚洲精品无码专区在线播放 | www日本视频| 亚洲欧美精品天堂久久综合一区 | 伊人网视频在线 | xxxx欧美 | 爱爱客影院在线影院gf发现 | 一级片www | 国产成人啪午夜精品网站 | 国产大学生露脸激情 | 成人卡通精品卡通动漫第一页 | 小说区| 美国一级免费毛片 | 韩国欧美 | 黄色网址亚洲 | www.爱爱视频| 亚洲国产精品自在在线观看 | 欧美人与物videos另类3d | 69一级毛片 | 明星三级国产免费播放 |