1、@RequestMapping RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法 都是以該地址作為父路徑,類和方法共同組成的字元串才是一個完整的url. RequestMapping註解有六個屬性,下麵我們把她分成三類進行說明 ...
org.springframework.web.bind.annotation這個包中註解如下圖,該包中的註解的作用是綁定參數和方法,比如@CookieValue是將前端的Cookie值和目標方法的參數綁定. @RequestParam 和 @ PathVariable 也是綁定 請求的參數 和 url 路徑中的值!
1、@RequestMapping
RequestMapping是一個用來處理請求地址映射的註解,將URL和目標方法綁定起來. 可用於類或方法上。用於類上,表示類中的所有響應請求的方法 都是以該地址作為父路徑,類和方法共同組成的字元串才是一個完整的url.
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping{ String[] value() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }
RequestMapping註解有六個屬性,下麵我們把她分成三類進行說明(下麵有相應示例)。
1、 value, method;
value: 指定請求的實際地址,指定的地址可以是URI Template 模式(後面將會說明);
method: 指定請求的method類型, GET(查)、POST(改)、PUT(增)、DELETE(刪)等;
2、consumes,produces
consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
3、params,headers
params: 指定request中必須包含某些參數值是,才讓該方法處理。
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。
2、@PathVariable
這個註解用來修飾handler類 方法參數的,被修飾的參數會將url 中的參數賦值給參數,方法內部就可以使用了.
//只能修飾參數 @Target({java.lang.annotation.ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PathVariable { String value() default ""; }
用於將請求URL中的模板變數映射到功能處理方法的參數上,即取出uri模板中的變數作為參數。如:
public class TestController { @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET) public String getLogin(@PathVariable("userId") String userId, @PathVariable("roleId") String roleId){ System.out.println("User Id : " + userId); System.out.println("Role Id : " + roleId); return "hello"; } @RequestMapping(value="/product/{productId}",method = RequestMethod.GET) public String getProduct(@PathVariable("productId") String productId){ System.out.println("Product Id : " + productId); return "hello"; } //還可以用正則表達式 @RequestMapping(value="/javabeat/{regexp1:[a-z-]+}", method = RequestMethod.GET) public String getRegExp(@PathVariable("regexp1") String regexp1){ System.out.println("URI Part 1 : " + regexp1); return "hello"; } }
3、@RequestParam
根據請求參數來進行參數綁定 .分為get 請求和post請求
1. get請求通過url直接獲取參數名,就可以在目標方法的參數中綁定數據.
2. 如果是ajax 中的get 或 post 請求,可以通過前端的參數名來獲取參數.
如果是form表單,則可以通過標簽中的name 屬性作為參數的名.
該註解只能修飾參數. 有三個參數, value 參數名, required 這個參數是否是必須的. defultVaule 預設值.
4、@CookieValue
客戶端進行的每一次請求都會將cookie值帶到後端.可以通過這個標簽將cookie的key作為@cookieValue的值,用來標註參數,這樣完成參數的賦值.
5、@ModelAttribute(重要)
@Target({java.lang.annotation.ElementType.PARAMETER,java.lang.annotationElementType.METHOD}) //修飾參數和方法 @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute{ String value() default ""; }
該註解 標註 在 參數 和 方法 . 綁定在 這個註解的對象,可以在 request 作用域中使用,也就是在一次請求中可以使用 這個對象, 如果想在整個session 中使用,則要用@SessionAttribute
1. 當我們請求 /myTest/sayHello.do 的時候使用 @ModelAttribute 標記的方法會先執行,然後把它們返回的對象存放到模型中。最終訪問到 sayHello 方法的時候
@Controller @RequestMapping ( "/myTest" ) public class MyController { //首先執行,hello 是model 的key 返回值 是這個model 的value..以下 同理 @ModelAttribute ( "hello" ) public String getModel() { System. out .println( "-------------Hello---------" ); return "world" ; } //首先執行 @ModelAttribute ( "intValue" ) public int getInteger() { System. out .println( "-------------intValue---------------" ); return 10; } @RequestMapping ( "sayHello" )
//參數被@ModelAttribute標註的參數都會被賦值.在目標方法中可以使用 public void sayHello( @ModelAttribute ( "hello" ) String hello, @ModelAttribute ( "intValue" ) int num, @ModelAttribute ( "user2" ) User user, Writer writer, HttpSession session) throws IOException { writer.write( "Hello " + hello + " , Hello " + user.getUsername() + num); writer.write( "\r" );
//session域中並沒有值,ModelAttribute作用域只是在request域中 Enumeration enume = session.getAttributeNames(); while (enume.hasMoreElements()) writer.write(enume.nextElement() + "\r" ); } //首先執行 @ModelAttribute ( "user2" ) public User getUser(){ System. out .println( "---------getUser-------------" ); return new User(3, "user2" ); } }
如果想把@ModelAttribute ( "key" )中的值放到Seeion中,只需要在這個類上加上@SessionAttribute("裡面放的是@ModelAttribute的key").就可以把request域放到Session域中.
還有一些其他的使用地方,如下
1
public class HelloWorldController { @ModelAttribute // abc 是請求參數的名 public void populateModel(@RequestParam String abc, Model model) { model.addAttribute("attributeName", abc); } @RequestMapping(value = "/helloWorld") public String helloWorld(在這裡面,可以將@ModelAttribute的值寫進去啊) { return "helloWorld"; } }
2
public Account addAccount(@RequestParam String number) { return accountManager.findAccount(number); }
這種情況,model屬性的名稱沒有指定,它由返回類型隱含表示,如這個方法返回Account類型,那麼這個model屬性的名稱是account。
這個例子中model屬性名稱有返回對象類型隱含表示,model屬性對象就是方法的返回值。它無須要特定的參數。
3
public class HelloWorldController { @RequestMapping(value = "/helloWorld.do") @ModelAttribute("attributeName") public String helloWorld() { return "hi"; }
這時這個方法的返回值並不是表示一個視圖名稱,而是model屬性的值,視圖名稱由RequestToViewNameTranslator根據請求"/helloWorld.do"轉換為邏輯視圖helloWorld。
Model屬性名稱有@ModelAttribute(value=””)指定,相當於在request中封裝了key=attributeName,value=hi。
6、@SessionAttribute
用法比較簡單,就是標註在類上,就可以把目標方法參數Map中的值,比如
@SessionAttributes(value={"names"},types={Integer.class}) @Controller public class Test { @RequestMapping("/test") public String test(Map<String,Object> map){ map.put("names", Arrays.asList("caoyc","zhh","cjx")); map.put("age", 18); return "hello"; } }
本來這個map 是request域的,現在成了session域
@ModelAttribute中的值放到Seeeion域中上面已介紹.
7.@RequestBody
將目標方法參數和Content-Type 中的數據綁定起來.
@Target({java.lang.annotation.ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestBody { boolean required() default true; }
客戶端發送一個請求,請求頭中 Content-Type : application/json , application/xml 表示請求的數據 是一個json串或者xml . 並非Accept-type是json或者xml
這個時候springMVC 就可以通過這個註解將請求來的 json 或者xml 和相應的Bean進行綁定,這個時候需要定義一個bean ,和josn 中的key 要一樣,才能完成綁定.
它是通過使用HandlerAdapter 配置的 MessageConverters
來解析post data body,然後綁定到相應的bean上的。這個註解的使用需要HttpMessageConverter 來完成json 到 bean 之間的轉換.
8.@RequestHeader
感覺和CookieValue一樣,將RequestHeader中的值賦給目標方法參數.
9.@ResponseBody
該註解標註類和方法.
@Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ResponseBody { }
1.標註方法的時候,會將返回值轉成josn或xml
@RequestMapping("/testResponseBody") @ResponseBody public Person testResponseBody() { Person p = new Person(); p.setName("xiaohong"); p.setAge(12); //返回值,放到這個 HttpResponse 中content中 return p; }
2 .@ResponseBody又可以加在類上,表示該類中的所有方法都加有@ResponseBody,很方便。另一種方式是使用@RestController註解在類上,作用等於@Controller與@ResponseBody同時加在類上,這也是最方便的一種方式。要讓@ResponseBody在類上也起作用,需要在springmvc配置文件中加上<mvc:annotation-driven />這一行配置才可以。而@ResponseBody使用在方法上,則不用添加該配置也可以使用。也就是說springmvc預設只支持@ResponseBody在方法上使用,不支持在類上的使用。