對於我這樣的新人來說,因為是剛開始做項目,所以以前的技術不是用的很多,就比如springmvc來說,實際上使用的都是註解形式的,對於那些全部都是配置的來說,雖然也瞭解一些,但是實際上還是沒試用過的。 下麵就理一下註解的各種用法:@Controller:用於標識是處理器類;@RequestMappin...
對於我這樣的新人來說,因為是剛開始做項目,所以以前的技術不是用的很多,就比如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 @Mapping public @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”