springmvc(4)註解簡單瞭解

来源:http://www.cnblogs.com/zr520/archive/2016/01/03/5096235.html
-Advertisement-
Play Games

對於我這樣的新人來說,因為是剛開始做項目,所以以前的技術不是用的很多,就比如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”

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 剛開始學習python,之前完全沒有接觸,在這裡寫下自己學習python的過程和心得。 首先,安裝python,打開官網:http://python.org.點擊Download.我選擇了3.5.1版本進行安裝。 接下來,按照教程開始學習: 於是開始了經典的第一個程式,在互動式解釋器里輸入...
  • 運行時數據區域程式計數器(Program Counter Register):可看作是當前程式所執行的位元組碼的行號指示器。在虛擬機的概念模型里(不同虛擬機可能有不同的實現方法),位元組碼解釋器就是通過改變程式計數器的值來取下一條位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都依賴於這個計數...
  • 一、ssmm簡介ssmm是當下企業最常用的開發框架架構maven:管理項目jar包,構建項目spring:IOC容器,事務管理springmvc:mvc框架myBatis:持久層框架velocity:前端視圖模板(相較於jsp,速度非常快,而且不需要占據jvm的永久代記憶體)上述這些框架再加上版本控制...
  • 1.直接通過github搜索tomcat,正好找到一位有部分翻譯內容的版本,直接fork並下載git clone https://github.com/codefollower/Tomcat-Research.git2.轉換成eclipse項目工程,如果沒有安裝maven,可以先配置maven環境變...
  • 題目:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.思路:類似於上一篇文章中的方法一,對每列的左右拓展極限進行記...
  • 裝飾器1.普通函數#簡單的函數和調用def a1(): print("i am zhangsan")def a2(): print("i am lisi")a1()a2()2.在函數前後添加功能def inner(func): print("添加1") func() p...
  • 一、第一個程式Hello World: 1、列印輸出Hello World: Python2列印方法: >>> print "hello world"hello world Python3列印方法: >>> print("hello world") hello world 註:Python3與Pyt...
  • GPIO庫的核心功能,當然就是操作GPIO了,GPIO就是“通用輸入/輸出”介面,比如點亮一個LED、繼電器等,或者通過iic spi 1-wire等協議,讀取、寫入數據,這都是GPIO的用處,可以說沒有GPIO,樹莓派只能當小電腦用,有了GPIO,就升級成一個控制器了。先來說說怎麼操作一個數字量(...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...