欢迎大家来到IT世界,在知识的湖畔探索吧!
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格式)的数据返回。不再赘述。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/48717.html