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 就能被外界通路到。
@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格式)的資料傳回。不再贅述。