springmvc(4)註解簡單瞭解,springmvc註解瞭解

來源:互聯網
上載者:User

springmvc(4)註解簡單瞭解,springmvc註解瞭解

對於我這樣的新人來說,因為是剛開始做項目,所以以前的技術不是用的很多,就比如springmvc來說,實際上使用的都是註解形式的,對於那些全部都是配置的來說,雖然也瞭解一些,但是實際上還是沒試用過的。

 下面就理一下註解的各種用法:

@Controller:用於標識是處理器類;@RequestMapping:請求到處理器功能方法的映射規則;@RequestParam:請求參數到處理器功能處理方法的方法參數上的綁定;@ModelAttribute:請求參數到命令對象的綁定;@SessionAttributes:用於聲明session層級儲存的屬性,放置在處理器類上,通常列出模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的儲存到session中;@InitBinder:自訂資料繫結註冊支援,用於將請求參數轉換到命令對象屬性的對應類型; @CookieValue:cookie資料到處理器功能處理方法的方法參數上的綁定;@RequestHeader:要求標頭(header)資料到處理器功能處理方法的方法參數上的綁定;@RequestBody:請求的body體的綁定(通過HttpMessageConverter進行類型轉換);@ResponseBody:處理器功能處理方法的傳回值作為響應體(通過HttpMessageConverter進行類型轉換);@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態代碼和原因;@ExceptionHandler:註解式聲明異常處理器;@PathVariable:請求URI中的模板變數部分到處理器功能處理方法的方法參數上的綁定,

因為有一些註解不是經常使用,所以上網將基本上所有的註解都搜了一下。
1.URL映射:@RequestMapping,在控制器和方法上面使用,表示的是將url路徑映射到相應的處理方法中。:

@Controller@RequestMapping("/f")public class TestController2 {    @RequestMapping("index")    public String index(){        return "index";    }}

如果類上面有註解,那麼方法的路徑就是它的窄化,比如上面的就應該是‘/f/index’,如果路徑是單獨的index是不能訪問這個方法的。還有一點就是只有在這個控制器放入容器中才能使用註解。

@RequestMapping的幾個參數我們可以在源碼中瞭解一下:

package org.springframework.web.bind.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.util.concurrent.Callable;@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @interface RequestMapping {

  //為這個映射設定一個名字 目前還沒使用過這個參數 String name() default "";
  //1.表示的就是映射的值,如果只有這一個value參數有值的話,那麼不用指明參數名,這個是註解的用法
  //2.這是一個數組,所以可以指定多個路徑的。比如:@RequestMapping(value={"/test1", "/user/create"})表示的是/test1或者/user/create路徑都能夠訪問
String[] value() default {};
  //我們不僅可以指定映射的路徑,我們還可以指定特定的方法,如果路徑滿足,但是要求方法不滿足的話,那麼也不能進入到方法中來,
  //和value一樣,也是支援多個值的。:@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET})表示的是
  //GET和POST請求都能映射到方法中。預設是支援GET和POST的。一般在填寫表單的時候用的多
RequestMethod[] method() default {};
  //表示的是有某些參數的時候,比如:@RequestMapping(params="create", method=RequestMethod.POST)表示的是請求為POST,具有參數create的時候,能夠
  //進入到這個方法。有一點特別的用法,源碼是說: Expressions can be negated by using the "!=" operator,* as in "myParam!=myValue".可以指定當參數不等於
  //某個值的時候,還有一種用法是當沒有某一個參數的時候:
  //!myParam" style expressions indicate that the* specified parameter is <i>not</i> supposed to be present in the request.
    String[] params() default {};
  //也是一樣的意思,就是特定的要求標頭才能進入到方法內。就不舉例了
String[] headers() default {};
  
  //我們都知道 request和resonse是生產者消費者模式的,所以這個名字那麼怪,這個參數的意思是媒體類型
  //就是request頭的提交類型
  //
consumes = "text/plain"*
  //consumes = {"text/plain", "application/*"}
 String[] consumes() default {};  //上面是消費者的媒體類型,這個是生產者的媒體類型,就是瀏覽器中的Accept中表示可以接受的類型:
  //
produces = "text/plain"
  
  * produces = {"text/plain", "application/*"}
    String[] produces() default {};}

2.參數的註解:@RequestParam 表示的是從用戶端發送到伺服器的參數,可以通過註解綁定到參數中:

@RequestMapping("index")    public String index(@RequestParam(value="str",required=true,defaultValue="hotusm") String str){        return "index";    }

這幾個參數就很好理解啦。不過有一點是:這三個參數都不是必須的,也許很奇怪,那用戶端的資料怎麼綁定到參數中去,其實這既是springmvc的強大,如果預設的情況會將

同名的資料繫結到同名的參數中。

3.綁定Url模板變數值:

@RequestMapping("/article/{aId}-{categoryId}")    public String showArticle(@PathVariable("aId") String aId,@PathVariable("categoryId") String categoryId){        System.out.println("show the article info");        return "articleDetils";    }

對於一些資訊類的查看來說,這個註解還是很好用的。

4.操作Cookie:

@RequestMapping("cookInfo")    public String cookInfo(@CookieValue("JSESSIONID") String sessionId){        System.out.println("session:"+sessionId);        return "";    }

 5.@RequestHeader綁定要求標頭資料,和requestParam一樣,具有三個參數。

@RequestMapping(value="/header")  public String test(         @RequestHeader("User-Agent") String userAgent,         @RequestHeader(value="Accept") String[] accepts) 

6.ModelAttrbute:

@ModelAttribute一個具有如下三個作用:①綁定請求參數到命令對象:放在功能處理方法的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化繫結資料流程,而且自動暴露為模型資料用於視圖頁面展示時使用;②暴露表單引用對象為模型資料:放在處理器的一般方法(非功能處理方法)上時,是為表單準備要展示的表單引用對象,如註冊時需要選擇的所在城市等,而且在執行功能處理方法(@RequestMapping註解的方法)之前,自動添加到模型對象中,用於視圖頁面展示時使用;③暴露@RequestMapping方法傳回值為模型資料:放在功能處理方法的傳回值上時,是暴露功能處理方法的傳回值為模型資料,用於視圖頁面展示時使用。 一、綁定請求參數到命令對象如使用者登入,我們需要捕獲使用者登入的請求參數(使用者名稱、密碼)並封裝為使用者物件,此時我們可以使用@ModelAttribute綁定多個請求參數到我們的命令對象。 Java代碼  收藏代碼public String test1(@ModelAttribute("user") UserModel user)  和6.6.1一節中的五、命令/表單對象功能一樣。只是此處多了一個註解@ModelAttribute("user"),它的作用是將該綁定的命令對象以“user”為名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來擷取綁定的命令對象的屬性。 綁定請求參數到命令對象支援對象圖導航式的綁定,如請求參數包含“?username=zhang&password=123&workInfo.city=bj”自動綁定到user中的workInfo屬性的city屬性中。Java代碼  收藏代碼@RequestMapping(value="/model2/{username}")  public String test2(@ModelAttribute("model") DataBinderTestModel model) {   DataBinderTestModel相關模型請從第三章拷貝過來,請求參數到命令對象的綁定規則詳見【4.16.1、資料繫結】一節,URI模板變數也能自動綁定到命令對象中,當你請求的URL中包含“bool=yes&schooInfo.specialty=computer&hobbyList[0]=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&state=blocked”會自動綁定到命令對象上。 當URI模板變數和請求參數同名時,URI模板變數具有高優先權。 二、暴露表單引用對象為模型資料Java代碼  收藏代碼@ModelAttribute("cityList")  public List<String> cityList() {      return Arrays.asList("北京", "山東");  }   如上代碼會在執行功能處理方法之前執行,並將其自動添加到模型對象中,在功能處理方法中調用Model 入參的containsAttribute("cityList")將會返回true。Java代碼  收藏代碼@ModelAttribute("user")  //①  public UserModel getUser(@RequestParam(value="username", defaultValue="") String username) {  //TODO 去資料庫根據使用者名稱尋找使用者物件  UserModel user = new UserModel();  user.setRealname("zhang");       return user;  }   如你要修改使用者資料時一般需要根據使用者的編號/使用者名稱尋找使用者來進行編輯,此時可以通過如上代碼尋找要編輯的使用者。也可以進行一些預設值的處理。Java代碼  收藏代碼@RequestMapping(value="/model1") //②  public String test1(@ModelAttribute("user") UserModel user, Model model)   此處我們看到①和②有同名的命令對象,那Spring Web MVC內部如何處理的呢:(1、首先執行@ModelAttribute註解的方法,準備視圖展示時所需要的模型資料;@ModelAttribute註解方法形式參數規則和@RequestMapping規則一樣,如可以有@RequestParam等;(2、執行@RequestMapping註解方法,進行模型繫結時首先尋找模型資料中是否含有同名對象,如果有直接使用,如果沒有通過反射建立一個,因此②處的user將使用①處返回的命令對象。即②處的user等於①處的user。 三、暴露@RequestMapping方法傳回值為模型資料Java代碼  收藏代碼public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)  大家可以看到傳回值類型是命令物件類型,而且通過@ModelAttribute("user2")註解,此時會暴露傳回值到模型資料(名字為user2)中供視圖展示使用。那哪個視圖應該展示呢?此時Spring Web MVC會根據RequestToViewNameTranslator進行邏輯視圖名的翻譯,詳見【4.15.5、RequestToViewNameTranslator】一節。 此時又有問題了,@RequestMapping註解方法的入參user暴露到模型資料中的名字也是user2,其實我們能猜到:(3、@ModelAttribute註解的傳回值會覆蓋@RequestMapping註解方法中的@ModelAttribute註解的同名命令對象。 四、匿名繫結命令參數Java代碼  收藏代碼public String test4(@ModelAttribute UserModel user, Model model)  或  public String test5(UserModel user, Model model)   此時我們沒有為命令對象提供暴露到模型資料中的名字,此時的名字是什麼呢?Spring Web MVC自動將簡單類名(首字母小寫)作為名字暴露,如“cn.javass.chapter6.model.UserModel”暴露的名字為“userModel”。Java代碼  收藏代碼public @ModelAttribute List<String> test6()  或  public @ModelAttribute List<UserModel> test7()   對於集合類型(Collection介面的實現者們,包括數組),產生的模型對象屬性名稱為“簡單類名(首字母小寫)”+“List”,如List<String>產生的模型對象屬性名稱為“stringList”,List<UserModel>產生的模型對象屬性名稱為“userModelList”。 其他情況一律都是使用簡單類名(首字母小寫)作為模型對象屬性名稱,如Map<String, UserModel>類型的模型對象屬性名稱為“map”

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.