SpringMVC常用注解那么多!你能记几个?

SpringMVC常用注解那么多!你能记几个?SpringMVC的注解太多了,面试官随便问几个让我说细节。啊,,,这,,,。要是记不清的话那下面我们就来详细说说常用的几个,这次可要好好记了哈

欢迎大家来到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 就能被外界访问到。

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格式)的数据返回。不再赘述。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/48717.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信