springMVC 註解總結

ssm大行其道的當下,瞭解越多的技巧越是對技術得心應手, 現在總結下springMVC的常用註解.

1.@RequestMapping 

RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑。

使用 @RequestMapping 的一些高級用法

(1)params屬性

@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })
    public String testParams() {
       System. out .println( "test Params..........." );
       return "testParams" ;
    }
用@RequestMapping 的params 屬性指定了三個參數,這些參數都是針對請求參數而言的,它們分別表示參數param1 的值必須等於value1 ,參數param2 必須存在,值無所謂,參數param3 必須不存在,只有當請求/testParams.do 並且滿足指定的三個參數條件的時候才能訪問到該方法。所以當請求/testParams.do?param1=value1¶m2=value2 的時候能夠正確訪問到該testParams 方法,當請求/testParams.do?param1=value1¶m2=value2¶m3=value3 的時候就不能夠正常的訪問到該方法,因爲在@RequestMapping 的params 參數裏面指定了參數param3 是不能存在的。

(2)method屬性

@RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
    public String testMethod() {
       return "method" ;
    }
在上面的代碼中就使用method 參數限制了以GET 或DELETE 方法請求/testMethod 的時候才能訪問到該Controller 的testMethod 方法。

(3)headers屬性

@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })
    public String testHeaders() {
       return "headers" ;
    }
headers 屬性的用法和功能與params 屬性相似。在上面的代碼中當請求/testHeaders.do 的時候只有當請求頭包含Accept 信息,且請求的host 爲localhost 的時候才能正確的訪問到testHeaders 方法。

 @RequestMapping 標記的處理器方法支持的方法參數和返回類型

1. 支持的方法參數類型

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

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

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

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

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

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

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

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

   (9 )Spring 封裝的Errors 和BindingResult 對象。 這兩個對象參數必須緊接在需要驗證的實體對象參數之後,它裏面包含了實體對象的驗證結果。

2. 支持的返回類型

   (1 )一個包含模型和視圖的ModelAndView 對象。

   (2 )一個模型對象,這主要包括Spring 封裝好的Model 和ModelMap ,以及java.util.Map ,當沒有視圖返回的時候視圖名稱將由RequestToViewNameTranslator 來決定。

   (3 )一個View 對象。這個時候如果在渲染視圖的過程中模型的話就可以給處理器方法定義一個模型參數,然後在方法體裏面往模型中添加值。

   (4 )一個String 字符串。這往往代表的是一個視圖名稱。這個時候如果需要在渲染視圖的過程中需要模型的話就可以給處理器方法一個模型參數,然後在方法體裏面往模型中添加值就可以了。

   (5 )返回值是void 。這種情況一般是我們直接把返回結果寫到HttpServletResponse 中了,如果沒有寫的話,那麼Spring 將會利用RequestToViewNameTranslator 來返回一個對應的視圖名稱。如果視圖中需要模型的話,處理方法與返回字符串的情況相同。

   (6 )如果處理器方法被註解@ResponseBody 標記的話,那麼處理器方法的任何返回類型都會通過HttpMessageConverters 轉換之後寫到HttpServletResponse 中,而不會像上面的那些情況一樣當做視圖或者模型來處理。

   (7 )除以上幾種情況之外的其他任何返回類型都會被當做模型中的一個屬性來處理,而返回的視圖還是由RequestToViewNameTranslator 來決定,添加到模型中的屬性名稱可以在該方法上用@ModelAttribute(“attributeName”) 來定義,否則將使用返回類型的類名稱的首字母小寫形式來表示。使用@ModelAttribute 標記的方法會在@RequestMapping 標記的方法執行之前執行。

@RequestMapping(value="/getName", method = RequestMethod.GET)    //get方法請求地址: /getName
public String getName(String userName) {
   return userName;
}
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)   //get方法請求地址: /user/1/roles/1
public String getLogin(@PathVariable("userId") String userId,                  //請求地址中獲取值userId
   @PathVariable("roleId") String roleId){  
     System.out.println("User Id : " + userId);  
   return "hello";  
} 
2.@PathVariable

用於將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量作爲參數.

@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

將請求的參數綁定到方法中的參數上,其實即使不配置該參數,註解也會默認使用該參數。它有三個常用參數:defaultValue = "0", required = false, value = "isApp";defaultValue 表示設置默認值,required 通過boolean設置是否是必須要傳入的參數,value 值表示接受的傳入的參數類型。

@PathVariable和@RequestParam的區別 

請求路徑上有個id的變量值,可以通過@PathVariable來獲取  @RequestMapping(value = "/page/{id}", method = RequestMethod.GET)  
@RequestParam用來獲得靜態的URL請求入參     spring註解時action裏用到。

A、處理requet uri 部分(這裏指uri template中variable,不含queryString部分)的註解:   @PathVariable;

B、處理request header部分的註解:   @RequestHeader, @CookieValue;

C、處理request body部分的註解:@RequestParam,  @RequestBody;

D、處理attribute類型是註解: @SessionAttributes, @ModelAttribute;

4.@ResponseBody
它的作用是將返回類型直接輸入到HTTP response body中。@ResponseBody在輸出JSON格式的數據時會經常用到.

5.@SessionAttributes

該註解用來綁定HttpSession中的attribute對象的值,便於在方法中的參數裏使用。該註解有value、types兩個屬性,可以通過名字和類型指定要使用的attribute 對象;

示例代碼:
@Controller  
@RequestMapping("/editPet.do")  
@SessionAttributes("pet")  
public class EditPetForm {  
    // ...   
} 

6.@ModelAttribute
該註解有兩個用法,一個是用於方法上,一個是用於參數上;
用於方法上時:  通常用來在處理@RequestMapping之前,爲請求綁定需要從後臺查詢的model;
用於參數上時: 用來通過名稱對應,把相應名稱的值綁定到註解的參數bean上;要綁定的值來源於:
A) @SessionAttributes 啓用的attribute 對象上;
B) @ModelAttribute 用於方法上時指定的model對象;
C) 上述兩種情況都沒有時,new一個需要綁定的bean對象,然後把request中按名稱對應的方式把值綁定到bean中。

用到方法上@ModelAttribute的示例代碼:

@ModelAttribute  
public Account addAccount(@RequestParam String number) {  
    return accountManager.findAccount(number);  
} 
這種方式實際的效果就是在調用@RequestMapping的方法之前,爲request對象的model裏put(“account”, Account)。

用在參數上的@ModelAttribute示例代碼:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
} 
首先查詢 @SessionAttributes有無綁定的Pet對象,若沒有則查詢@ModelAttribute方法層面上是否綁定了Pet對象,若沒有則將URI template中的值按對應的名稱綁定到Pet對象的各屬性上。

詳細:  http://blog.csdn.net/li_xiao_ming/article/details/8349115

7.@RequestHeader、

@RequestHeader 註解,可以把Request請求header部分的值綁定到方法的參數上。

上面的代碼,把request header部分的 Accept-Encoding的值,綁定到參數encoding上了, Keep-Alive header的值綁定到參數keepAlive上。

8.@CookieValue
@CookieValue 可以把Request header中關於cookie的值綁定到方法的參數上。

例如有如下Cookie值:JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {  
} 
即把JSESSIONID的值綁定到參數cookie上。

9.@Value

@Value可以讀取*.properties 配置文件的屬性值

@Value("${INDEX_CONTENT_REDIS_KEY}")       //讀取*.properties 配置文件的key爲 INDEX_CONTENT_REDIS_KEY 的value, 配置文件放在 resource 文件夾下
private String INDEX_CONTENT_REDIS_KEY;




發佈了60 篇原創文章 · 獲贊 114 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章