天天看點

SpringMVC常用注解那麼多!你能記幾個?

作者:尚矽谷教育

SpringMVC的注解太多了,面試官随便問幾個讓我說細節。啊,,,這,,,。要是記不清的話那下面我們就來詳細說說常用的幾個,這次可要好好記了哈!

01概述

SpringMVC架構作為目前比較流行的web架構之一,提供了大量的注解以友善我們在開發時使用,在面試期間也會經常被問及,大多數學員能說出常用的兩三個,但完整的羅列出用法還需要停頓片刻,那本篇文章針對SpringMVC的常用注解做一個小總結。

02 常用注解

2.1@Controller

@Controller 聲明該類為SpringMVC中的Controller,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 傳回給對應的View 進行展示。在SpringMVC 中使用@Controller ,就無需繼承特定的類或實作特定的接口,隻需使用@Controller 标記一個類是Controller,然後使用@RequestMapping 和@RequestParam 等一些注解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界通路到。

SpringMVC常用注解那麼多!你能記幾個?

@Controller 用于标記在一個類上,使用它标記的類就是一個SpringMVC Controller 對象。分發處理器将會掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解。@Controller 隻是定義了一個控制器類,而使用@RequestMapping 注解的方法才是真正處理請求的處理器。單單使用@Controller标記在一個類上還不能真正意義上的說它就是SpringMVC 的一個控制器類,因為這個時候Spring 還不認識它。那麼要如何做Spring 才能認識它呢?這個時候就需要我們把這個控制器類交給Spring 來管理。有兩種方式:

(1)在SpringMVC 的配置檔案中定義MyController 的bean 對象。(2)在SpringMVC 的配置檔案中告訴Spring 該到哪裡去找标記為@Controller 的Controller 控制器。

<!--方式一-->

<bean class="com.atguigu.controller.MyController"/>

<!--方式二-->

< context:component-scan base-package = "com.atguigu.controller" />//路徑寫到controller的上一層(掃描包詳解見下面淺析)

2.2@RequestMapping

@RequestMapping的作用是建立請求URL和處理方法之間的對應關系

@RequestMapping可以作用在方法和類上

作用在類上:第一級的通路目錄

作用在方法上:第二級的通路目錄

@RequestMapping的屬性

path-指定請求路徑的URL

value屬性和path屬性是一樣的

mthod 指定該方法的請求方式

params 指定限制請求參數的條件

headers 發送的請求中必須包含的請求頭

讓我們看一下源碼@RequestMapping的源碼:

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Mapping

public @interface RequestMapping {

String name() default "";

String[] value() default {};

String[] path() default {};

RequestMethod[] method() default {};

String[] params() default {};

String[] headers() default {};

String[] consumes() default {};

String[] produces() default {};

}

1)在@Target中有兩個屬性,分别為 ElementType.METHOD 和 ElementType.TYPE ,也就是說 @RequestMapping 可以在方法和類的聲明中使用

2)可以看到注解中的屬性除了 name() 傳回的字元串,其它的方法均傳回數組,也就是可以定義多個屬性值,例如 value() 和 path() 都可以同時定義多個字元串值來接收多個URL請求

案例:

1)将 @RequestMapping 注解在 login 方法上,而UserController上不添加 @RequestMapping 注解,這時的請求 URL 是相對于 Web 根目錄

@Controller

public class UserController {

@RequestMapping("/login")

public String login() {

return "success";

}

}

這時的方法 login() 能處理的 URL 請求路徑是基于 Web 應用的,也就是 http://localhost/SpringMVC/login,也就是 index.html 頁面中的 User Login 連結位址應該是:

<a href="login">User Login</a>

2)将 @RequestMapping 注解在 UserController 類上,這時類的注解是相對于 Web 根目錄,而方法上的是相對于類上的路徑

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/login")

public String login() {

return "success";

}

}

這時的方法login()能處理的 URL 請求路徑則是 http://localhost/SpringMVC/user/login,也就是 index.html 頁面中的 User Login 連結位址應該是:

<a href="user/login">User Login</a>

2.3@RequestParam

@RequestParam:将請求參數綁定到你控制器的方法參數上(是springmvc中接收普通參數的注解)

文法:@RequestParam(value=”參數名”,required=”true/false”,defaultValue=””)

value:參數名

required:是否包含該參數,預設為true,表示該請求路徑中必須包含該參數,如果不包含就報錯。

defaultValue:預設參數值,如果設定了該值,required=true将失效,自動為false,如果沒有傳該參數,就使用預設值

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/login")

public String login(@RequestParam(value="userName",required=true ,defaultValue="atguigu") String userName,

@RequestParam(value="password") String password) {

return "success";

}

}

當請求參數名userName與形參userName保持一緻時,該注解可以省略,如下

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/login")

public String login( String userName,

String password) {

return "success";

}

}

2.4@PathVariable

通過 @PathVariable 可以将 URL 中占位符參數綁定到控制器處理方法的入參中:URL 中的 {xxx} 占位符可以通過@PathVariable("xxx") 綁定到操作方法的入參中

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/delete/{id}")

public String delete(@PathVariable("id") Integer id) {

UserDao.delete(id);

return "success";

}

}

請求位址:

<a href="/user/delete/1001">删除</a>

該注解為了符合REST風格的請求方式,并擷取請求參數的值,關于REST風格後續會單獨講解。

2.5@RequestBody

@RequestBody主要用來接收前端傳遞給後端的json字元串中的資料的(請求體中的資料的),是以隻能發送POST請求。

GET方式無請求體,是以使用@RequestBody接收資料時,前端不能使用GET方式送出資料,而是用POST方式進行送出。

在後端的同一個接收方法裡,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多隻能有一個,而@RequestParam()可以有多個。 注:一個請求,隻有一個RequestBody;一個請求,可以有多個RequestParam。

案例:

//定義一個json示例

var user={

userId:1001,

userName:'atguigu',

password:'123456'

}

//在需要的事件中直接使用

this.$axios({

url:'/user/addUser',

data:jsons,

header:{

'Content-Type':'application/json' //如果寫成contentType會報錯

}

})

.then(res=>{

console.log(res.data)

})

.catch(Error=>{

console.log(Error)

})

後端接收:

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/addUser")

public String addUser(@RequestBody User user) {

System.out.println("user->>" + user) ;

return "success";

}

}

2.6@ResponseBody

作用:@ResponseBody注解通常使用在控制層的方法上,用于将Controller的方法傳回的對象,通過springmvc提供的HttpMessageConverter接口轉換為指定格式的資料如:json、xml等,通過Response響應給用戶端。

假如是字元串則直接将字元串寫到用戶端;假如是一個對象,此時會将對象轉化為json串然後寫到用戶端。這裡需要注意的是,如果傳回對象,按utf-8編碼。如果傳回String,頁面可能出現亂碼。是以在注解中我們可以手動修改編碼格式,例如@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),前面是請求的路徑,後面是編碼格式。

@Controller

@RequestMapping("/user")

public class UserController {

@autowire

private UserService userService;

@ResponseBody

@RequestMapping("/addUser")

public List<User> getUsers() {

List<User> list = userService.getUserList();

return list;

}

}

這裡傳回的一個JSON字元串數組并用于前端頁面解析,@RequestBody隻能修飾方法。

2.7@ModelAttribute

1) 可以用在 方法的參數上:

注解在參數上,會将用戶端傳遞過來的參數按名稱注入到指定對象中,并且會将這個對象自動加入ModelMap中

<form action="../register" method="post">

姓名:<input type="text" name="name" id="name"><br/>

生日:<input type="text" id="birthday" name="birthday"><br>

<input id="submit" type="submit" value="送出"/>

</form>

@RequestMapping(value="/register")

public String register(@ModelAttribute User user,Model model) {

System.out.println(user.getBirthday());

model.addAttribute("user", user);

return "success";

}

2)用在Controller的方法上:

注解在方法上,會在每一個@RequestMapping标注的方法前執行,如果有傳回值,則自動将該傳回值加入到ModelMap中

/*

* 在控制器類的處理方法執行前執行指定的方法

*/

@ModelAttribute

public User getUser(Model model) {

User user=new User("atguigu","123",new Address("北京","海澱"));

model.addAttribute("user", user);

return user;

}

@RequestMapping("/modelAttribute")

public String modelAttribute(User user) {

System.out.println(user);

return "success";

}

2.8@SessionAttributes

預設情況下Spring MVC将模型中的資料存儲到request域中。當一個請求結束後,資料就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes注解就可以使得模型中的資料存儲一份到session域中。

@SessionAttributes的參數:

 1)names:這是一個字元串數組。裡面應寫需要存儲到session中資料的名稱。

 2)types:根據指定參數的類型,将模型中對應類型的參數存儲到session中。

3)value:其實和names是一樣的。

@SessionAttributes(value={"names"},types={Integer.class,User.class})

@Controller

public class Test {

@RequestMapping("/test")

public String test(Map<String,Object> map){

map.put("names", Arrays.asList("atguigu","尚矽谷","大廠學院"));

map.put("age", 18);

map.put("user",new User("1001","admin",18))

return "hello";

}

}

這裡可以将map中的names存放在session中, 也可以将age存放在session中,因為指定了存放Integer類型

還可以存放User對象。

【注意】:@SessionAttributes注解隻能在類上使用,不能在方法上使用。

2.9@RestController

這裡的@RestController等價于 @Controller + @ResponseBody。 表示所有的請求都支援對象格式(json格式)的資料傳回。不再贅述。