Sping常見標簽整理

来源:http://www.cnblogs.com/stevehu1231/archive/2017/11/13/7828305.html
-Advertisement-
Play Games

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在方法上使用,不支持在類上的使用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我是Django的新手,我試圖通過我正在開發的一個簡單的項目“dubliners”和一個名為“book”的應用程式來學習它。目錄結構如下所示: 1 2 dubliners/book/ [includes models.py, views.py, etc.] dubliners/templates/b ...
  • 最近AlphaGo Zero的發佈,深度學習又火了一把,小伙伴們按捺不住內心的躁動,要搞一個游戲AI,好吧,那就從規則簡單、老少皆宜的五子棋開始講起。要做AI,得現有場景,所以本文先實現一個五子棋的邏輯。 ...
  • Python語言中import的使用很簡單,直接使用import module_name語句導入即可。這裡我主要寫一下"import"的本質。 Python官方定義:Python code in one module gains access to the code in another modul ...
  • 在採集美女站時,需要對關鍵詞進行分詞,最終採用的是python的結巴分詞方法. 中文分詞是中文文本處理的一個基礎性工作,結巴分詞利用進行中文分詞。其基本實現原理有三點: 安裝(Linux環境) 下載工具包,解壓後進入目錄下,運行:python setup.py install 模式 介面 組件只提供 ...
  • 官方解釋:os: This module provides a portable way of using operating system dependent functionality. 翻譯:提供一種方便的使用操作系統函數的方法。sys:This module provides access ...
  • 7個國家首都與中國的首都連線,線段的交於中國地圖上,記為7個點,這幾個點彼此互不影響,互不重合,按照各自國家所占的貿易比例,同時進行分割地圖。 ...
  • 異常的分類 在使用上 Error不用管他虛擬機錯誤 Exception必須要用catch抓 RuntimeExcption可以處理也可以不用處理 說明 Error:稱為錯誤,由java虛擬機生成並拋出,包括動態連接失敗,虛擬機錯誤,程式對其不做處理。 Exception:所有異常的父類,其子類對應了 ...
  • 初入Python,一開始就被她簡介的語法所吸引,代碼簡潔優雅,之前在C#裡面打開文件寫入文件等操作相比Python複雜多了,而Python打開、修改和保存文件顯得簡單得多。 1、打開文件的例子: 2、利用urllib庫請求頁面進行簡單的翻譯,請求百度翻譯,將要翻譯的內容當做參數傳給百度,然後將結果賦 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...