【SpringMVC】常用註解

@RequestParam

作用

把請求中指定名稱的參數給控制器中的形參賦值。

屬性

value:請求參數中的名稱。
required:請求參數中是否必須提供此參數。默認值:true。表示必須提供,如果不提供將報錯。

案例

有一個jsp頁面:

<html>
<head>
    <title>註解</title>
</head>
<body>
    <!--訪問anno/requestParam,傳入參數username=zhangsan-->
    <a href="anno/requestParam?username=zhangsan">RequestParam</a>
</body>
</html>

在AnnoController 類中有一個方法testRequestParam爲上面鏈接對應的訪問方法,但是參數是names:

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("requestParam")
    public String testRequestParam(String names){
        System.out.println("testRequestParam方法執行。。");
        System.out.println(name);
        return "success";
    }
}

訪問該鏈接會由於username與testRequestParam中的形參names不匹配而報錯,此時可以使用 @RequestParam 註解把請求中username的參數給控制器中的形參names賦值:

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("requestParam")
    public String testRequestParam(@RequestParam(name = "username") String names){
        System.out.println("testRequestParam方法執行。。");
        System.out.println(names);
        return "success";
    }
}

@RequestBody

作用

用於獲取請求體內容。直接使用得到是key=value&key=value…結構的數據。
注意: get請求方式不適用(get請求沒有請求頭,封裝在了url)。

屬性

required:是否必須有請求體。默認值是:true。當取值爲true時,get請求方式會報錯。如果取值爲false,get請求得到是null。

案例

發起一起請求:

    <form action="anno/requestBody" method="post">
        用戶姓名:<input type="text" name="username">
        用戶年齡:<input type="text" name="age">
        <input type="submit" value="提交">
    </form>

對應的方法:

//    獲取到請求體的內容
    @RequestMapping("requestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("testRequestBody方法執行。。");
        System.out.println(body);
        return "success";
    }

輸入:
在這裏插入圖片描述
控制檯輸出:
testRequestBody方法執行。。
username=%E5%BC%A0%E4%B8%89&age=23

@PathVaribale

作用

用於綁定url中的佔位符。例如:請求url中 /delete/{id},這個{id}就是url佔位符。 url支持佔位符是spring3.0之後加入的。是springmvc支持restful風格URL的一個重要標誌。

屬性

value:用於指定url中佔位符名稱。 required:是否必須提供佔位符。

案例

jsp代碼:

<!-- PathVariable註解 --> 
<a href="springmvc/usePathVariable/100">pathVariable註解</a>

控制器代碼:

@RequestMapping("/usePathVariable/{id}")
 public String usePathVariable(@PathVariable("id") Integer id){ 
 	System.out.println(id);
 	return "success"; 
}

輸出:100

@RequestHeader

作用

用於獲取請求消息頭。

屬性

value:提供消息頭名稱 required:是否必須有此消息頭
注: 在實際開發中一般不怎麼用。、

@CookieValue

作用

用於把指定cookie名稱的值傳入控制器方法參數。

屬性

value:指定cookie的名稱。
required:是否必須有此cookie。

案例

jsp中的代碼:

<!-- CookieValue註解 -->
 <a href="springmvc/useCookieValue">綁定cookie的值</a>

控制器中的代碼:

@RequestMapping("/useCookieValue") 
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){ 	
	  System.out.println(cookieValue);
 	  return "success";
}

@ModelAttribute

作用

該註解是SpringMVC4.3版本以後新加入的。它可以用於修飾方法和參數。
出現在方法上,表示當前方法會在控制器的方法執行之前,先執行。
它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。
出現在參數上,獲取指定的數據給參數賦值。

屬性

value:用於獲取數據的key。
key可以是POJO的屬性名稱,也可以是map結構的key。

應用場景

當表單提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。
例如:
我們在編輯一個用戶時,用戶有一個創建信息字段,該字段的值是不允許被修改的。在提交表單數據是肯定沒有此字段的內容,一旦更新會把該字段內容置爲null,此時就可以使用此註解解決問題。

案例1:當前方法會在控制器的方法執行之前,先執行

jsp中:

    <form action="anno/testModelAttribute" method="post">
        用戶姓名:<input type="text" name="username"><br>
        用戶年齡:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

控制器中:

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(){
        System.out.println("testModelAttribute方法執行。。");
        return "success";
    }

    @ModelAttribute
    public void showUser(){
        System.out.println("showUser方法執行了");
    }

測試的時候,由於showUser方法上有註解@ModelAttribute,因此會在調用到testModelAttribute方法之前先執行showUser方法。

案例2:當表單提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。

User對象有三個屬性:

public class User implements Serializable {
    private String uname;
    private Integer age;
    private Date date;

jsp中表單隻包含2個屬性:

    <form action="anno/testModelAttribute" method="post">
        用戶姓名:<input type="text" name="uname"><br>
        用戶年齡:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

控制器:

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("testModelAttribute方法執行。。");
        System.out.println(user);
        return "success";
    }

    //該方法先執行
    @ModelAttribute
    public User showUser(String uname){
        System.out.println("showUser方法執行了");
        //通過uname查數據庫,假設查詢到的User是:
        User user = new User();
        user.setAge(20);
        user.setUname(uname);
        //假設是數據庫查詢到的結果
        user.setDate(new Date());
        return user;
    }

提交表單:
在這裏插入圖片描述
雖然提交的沒有生日,但是還是從數據庫中查詢出原來的生日進行填充:

showUser方法執行了
testModelAttribute方法執行。。
User{uname=‘張三’, age=23, date=Thu May 11 22:39:46 CST 2020}

@SessionAttributes

作用

用於多次執行控制器方法間的參數共享。

屬性

value:用於指定存入的屬性名稱
type:用於指定存入的數據類型。

案例

jsp頁面與兩條超鏈接:

    <a href="anno/testSessionAttributes">SessionAttribute</a>
    <a href="anno/getSessionAttributes">getSessionAttribute</a>

對應的控制器:

@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) //把msg存入到session域對象
public class AnnoController {

    //SessionAttributes註解
    @RequestMapping("testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes方法執行。。");
        //會存儲到Request域對象
        model.addAttribute("msg","你好");
        return "success";
    }

    //從Session域中獲取值
    @RequestMapping("getSessionAttributes")
    public String getSessionAttributes(ModelMap model){
        System.out.println("getSessionAttributes方法執行。。");
        String msg = (String) model.get("msg");
        System.out.println(msg);
        return "success";
    }
}

在這裏插入圖片描述
點擊第一個超鏈接將會調用testSessionAttributes方法,其中有一個Model對象會存儲鍵值對到request域。由於類上有註解@SessionAttributes(value = {“msg”}),會把鍵值對存到session域中。然後點擊點兒個超連接,調用getSessionAttributes方法,其中ModelMap是Model的實現類,其中的get方法可以從session於中獲取鍵值對,實現方法之間的數據共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章