注解描述
注解 | 描述 |
@Controller | 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。 |
@RequestMapping | 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性: value: 指定请求的实际地址 method: 指定请求的method类型, GET、POST、PUT、DELETE等; consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; params: 指定request中必须包含某些参数值是,才让该方法处理。 headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。 |
@PostMapping | Spring MVC新特性提供了对Restful风格的支持。从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的: @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) 新方法可以简化为:@GetMapping("/get/{id}") |
@GetMapping | |
@PutMapping | |
@DeleteMapping | |
@PatchMapping | |
@Resource | 做bean的注入时使用,可以写在字段和setter方法上,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。默认按照ByName自动注入。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。 |
@Autowired | 做bean的注入时使用,可以写在字段和setter方法上,为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;它是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。 |
@PathVariable | 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。 @RequestMapping(value="/users/{userId}/topics/{topicId}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId) 如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。 |
@requestParam | @requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。 |
@ResponseBody | 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。 |
@RequestBody | 是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。 |
@RestController | 作用等同于@Controller + @ResponseBody |
@ModelAttribute | 注解用于将方法的参数或方法的返回值作为Model的属性加入到Model中,然后Spring框架自会将这个Model传递给ViewResolver。Model的生命周期只有一个http请求的处理过程,请求处理完后,Model就销毁了。 |
@SessionAttributes | 注解只用作用在 类 上,作用是将指定的 Model 的键值对保存在 session 中。可以让其他请求共用 session 中的键值对。 SessionAttribute有两个参数: String[] value:要保存到session中的参数名称 Class[] typtes:要保存的参数的类型,和value中顺序要对应上 所以可以这样写:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”}) |
@ControllerAdvice | @ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理,需要配合@ExceptionHandler使用。 |
@exceptionhandler | 可以用来统一处理方法抛出的异常 |
实例
1、注解支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--启用注解扫描-->
<context:component-scan base-package="com.by"/>
<!--注解驱动-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2、控制层
@Controller
public class HelloController {
@RequestMapping("/query")
public ModelAndView query(){
ModelAndView mv=new ModelAndView("index.jsp");
mv.addObject("hello","这是注解,今天天气不错!");
return mv;
}
}
返回逻辑视图
@GetMapping("/api/save")
public String save(@RequestParam String name, @RequestParam int age, Model model){
System.out.println("name==="+name);
System.out.println("age==="+age);
model.addAttribute("name",name);
model.addAttribute("age",age);
return "index";
}
@RequestMapping 替代:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
3、页面显示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
msg: ${hello}
</body>
</html>
4@PathVariable
@GetMapping("/save/{name}/{age}")
public void save(@PathVariable(value = "name") String name,@PathVariable("age") int age){
System.out.println("name==="+name);
System.out.println("age==="+age);
}
5、@requestParam
@GetMapping("/save")
public void save(@RequestParam String name,@RequestParam int age){
System.out.println("name==="+name);
System.out.println("age==="+age);
}
访问: http://localhost/save?name=abc&age=23
6、@ModelAttribute
该注解用于将方法的参数或方法的返回值绑定到指定的模型属性上,并返回给Web视图。
6.1、注释void返回值的方法
被@ModelAttribute注解注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
@ModelAttribute
public void processModel(@RequestParam(required = false) String userid, Model model) {
if(null!=userid)
model.addAttribute("userid", userid);
}
@GetMapping("/api/update")
public String update(){
return "index";
}
说明:
这个例子,在请求/api/update时,processModel方法会在update方法之前先被调用,它把请求参数(/api/update?userid=1)加入到一个名为
userid的model属性中,在它执行后update会被调用,返回视图名为index和model已由@ModelAttribute方法生产好了。
6.2、注释返回具体类的方法
@ModelAttribute
public User getUser(){
User user=new User();
user.setName("lily");
return user;
}
@GetMapping("/api/info")
public String userinfo(){
return "index";
}
说明:
这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是
user。这个例子中model属性名称有返回对象类型隐含表示,model属性对象的值就是方法的返回值。它无须要特定的参数。
6.3、@ModelAttribute 和@RequestMapping同时注释一个方法
@ModelAttribute
@RequestMapping("/api/index")
public User getUser(){
User user=new User();
user.setName("lily");
return user;
}
说明:
这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/api/index"转换为逻辑视图/api/index.jsp。
6.4@ModelAttribute注释一个方法的参数
@ModelAttribute("user")
public User addAccount() {
return new User("jz","123");
}
@RequestMapping(value = "/api/save")
public String save(@ModelAttribute("user") User user) {
user.setUserName("jizhou");
return "index";
}
说明:在这个例子里,
@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session。
7、@SessionAttributes
指定保存的属性名(user),作用是将 Model 中指定 属性名 的键值对保存在 session 中。
@Controller
@SessionAttributes(value = {"user"})
public class HelloController {
@ModelAttribute
@RequestMapping("/api/index")
public User getUser(){
User user=new User();
user.setName("lily");
return user;
}
}
@SessionAttributes 将放在Model中的属性存储到session中(如果是通过在方法参数上注解 @ModelAttribute将参数加入model中,@SessionAttributes是找不到的该参数的)
@SessionAttribute 获取session中的值存储到对应的参数上
json数据注解支持
1、在spring mvc配置文件中启用注解驱动:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--启用注解扫描-->
<context:component-scan base-package="com.by"/>
<!--注解驱动-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2、引入jacson的相关maven依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.2</version>
</dependency>
备注
接收form data数据参数
直接在控制类的方法上定义参数javabean ,它里面的属性与参数名称一致,且提供geter/seter方法
接收json格式数据
- @RequestBody 注解在方法参数上 可以接收post/put请求的json格式数据
- 参数类型可以是javabean 或map
响应json格式数据:
- 控制类上注解 @Controller 和 @ResponseBody (或者方法上加@ResponseBody )
- 在控制类上注解 @RestController
- @RestController === @Controller+@ResponseBody
获取地址栏参数
在控制类的方法中,默认的定义的参数名与提交过来的参数名一致,既可获得对应的参数值
也可以使用@RequestParam注解 来指明具体的参数名(请求提交过来的参数名,此时方法的参数可以与提交过来的参数名不一致 )