Spring、SpringMVC常用注解

Spring常用注解

  • @Component:标注一个普通的Spring Bean类。
  • @Controller:标注一个控制器组件类。
  • @Service:标注一个业务层组件类。
  • @Repository:标注一个dao持久层组件类

SpringMVC常用注解

  1. @Controller
  2. @RequestMapping
  3. @Autowired
  4. @ResponseBody
  5. @RequestBody
  6. @RequestParam
  7. @PathVariable
  8. @MatrixVariable
  9. @CrossOrigin
  10. @RequestHeader
  11. @CookieValue
  12. @RequestAttribute
  13. @SessionAttribute
  14. @SessionAttributes
  15. @ModelAttribute
  16. @RestController
  17. @ResponseStatus
  18. @ExceptionHandle
  19. @ControllerAdvice
  20. @RestControllerAdvice

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.host.app.web.controller.MyController"/>
<!--方式二-->
<context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层

2.@RequestMapping

RequestMapping详解
@RequestMapping的作用是建立请求URL和处理方法之间的对应关系

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

  • 作用在类上:第一级的访问目录
  • 作用在方法上:第二级的访问目录

@RequestMapping的属性

属性作用
path指定请求路径的URL
value属性和path属性是一样的
mthod指定该方法的请求方式
params指定限制请求参数的条件
headers发送的请求中必须包含的请求头

3. @Autowired

作用:spring可以自动帮你把bean里面引用的对象的 setter/getter 方法省略,它会自动帮你set/get。

正常情况下,你在userService里面要做一个userDao的setter/getter方法,但如果你用了@Autowired,你就不需要写getter/setter方法了,只需要在UserService的实现类中声明即可,之所以不用写,秘诀就在于java的“反射机制”。

通常我们都得这么写:

@Controller
public class UserController {
	public void setUserService (UserService injectedService){
		this.userService = injectedService;
	}
}

使用@Autowired注解后:

@Controller
public class UserController {
	@Autowired
	UserService userService;
	
}

4. @ResponseBody

作用:@ResponseBody注解通常使用在控制层的方法上,用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json、xml等,通过Response响应给客户端。

假如是字符串则直接将字符串写到客户端;
假如是一个对象,此时会将对象转化为json串然后写到客户端。

这里需要注意的是,如果返回对象,按utf-8编码。如果返回String,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),前面是请求的路径,后面是编码格式。

5. @RequestBody

作用:用于获取请求体的内容
RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 JSON 提交传来两个参数 username 和 password,此时我们需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便。例如:

@PostMapping("/user")
public String test(@RequestBody User user) {
	System.out.println(user.getUsername(),user.getPassword());
	return "success";
}

可以看出,@RequestBody 注解用于 POST 请求上,接收 JSON 实体参数。它和上面我们介绍的表单提交有点类似,只不过参数的格式不同,一个是 JSON 实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可

6. @RequestParam

与@RequestBody类似,用于将指定的请求参数赋值给方法中的形参

@PostMapping("/user")
public String test(@RequestParam String username, @RequestParam String password) {
	System.out.println(username, password);
	return "success";
}

7. @PathVariable

请求URL中的动态参数

@RequestMapping("/pathVariableTest/{id}")
public void pathVariableTest(@PathVariable Integer id)
// 如果url后面最后id传过来的值为"666",那么通过@PathVariable绑定,方法中id形参的值就被赋值为"666"

8. @MatrixVariable

此注解扩展了URL请求地址的功能,可以接收多个变量,用”;“(分号)分隔,可以用于多条件查询

默认在SpringMVC中是不启用的,需要手动启用

<!-- 启用@MatrixVariable注解 -->
<mvc:annotation-driven enable-matrix-variables="true"/>
// 映射地址 /test/{id};name=wang;age=21/{randNum};q=1;w=2
@RequestMapping("/test/{id}")
public void test(@PathVariable Integer id,
                @MatrixVariable(name="name",pathVar="id") String name,
                @MatrixVariable(name="age",pathVar="id") Integer age,
                @PathVariable Integer randNum,
                @MatrixVariable(name="q",pathVar="randNum") Integer q,
                @MatrixVariable(name="w",pathVar="randNum") Integer w)
// @MatrixVariable注解 
// name属性:指定请求参数绑定的名称,省略则绑定同名参数	
// pathVar属性:所在同级路径变量的名称

9. @CrossOrigin

用于处理SpringMVC中跨域请求问题

// 超时时间 单位/秒
@CrossOrigin(maxAge=3600)
@Controller
public class Test{
    @CrossOrigin(origins="http://www.baidu.com")
    @RequestMapping("/hello")
    public String hello(){
        // ......
    }
}

@CrossOrigin注解分别用于类上和方法上,SpringMVC会合并两个一起使用

现在Test控制器的hello方法可以处理来自”http://www.baidu.com”的跨域请求

也可以把“@CrossOrigin(origins=“http://www.baidu.com”)”这个写在类上,说明这个Test控制器的所有方法都可以处理来自”http://www.baidu.com”的跨域请求

10. @RequestHeader

用于将请求的头信息数据映射到功能处理的方法的参数上

@RequestMapping("/test")
public void test(@RequestHeader("User-Agent") String userAgent, 
                 @RequestHeader("Accept") String[] accepts){
	//......
}

11. @CookieValue

用于将请求的Cookie数据映射到功能处理的方法参数上

// 请求方法时 @CookieValue注解将cookie中名为message的值 传入到 message变量中
// 如果cookie中没有message时 则使用defalutValue配置的值
public void test(@CookieValue(name="message",defalutValue="") String message){
    //......
}

12. @RequestAttribute

由请求方法、过滤器或拦截器创建或预先存在于request作用域中的属性,将该属性传到方法的参数上

public void test(@RequestAttribute(name="username") String username)

13. @SessionAttribute

由请求方法、过滤器或拦截器创建或预先存在于session作用域中的属性,将该属性传到方法的参数上

public void test(@SessionAttribute(name="username") String username)

14. @SessionAttributes

只能用于类上,无法用于方法上

用于让我们有选择地指定Model中的那些属性转存到HttpSession对象当中

// 写法一
@SessionAttributes("demo")
public class test{
    // ......
}

// 写法二
@SessionAttributes(type={Demo.class}, value="user")
public class test{
    // ......
}

// 写法三
@SessionAttributes(type={Demo.class, DemoOne.class}, value={"user", "demoOne"})
public class test{
    // ......
}

15. @ModelAttribute

用于将请求参数绑定到对象。

  1. @ModelAttribute(name=“”) 用于返回具体类的方法
    用此注解的方法会先于请求的方法执行,用注解方法的返回值就赋给Model属性的值

    @Controller
    public class test{
        // 此方法会先于请求的方法执行
        @ModelAttribute(name="username")
        public String testOne(@RequestParam("username") String username){ 
            // 返回值直接给Model对象的username属性赋值
            return username; 
        }
        
        @RequestMapping("/hello")
        public String hello(){
            // 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法
        }
    }
    
  2. @ModelAttribute 用于返回具体类的方法
    注解没有指定name,取返回值类型(首字符小写)做为name,属性值为方法返回值

      @ModelAttribute
        public User testOne(@RequestParam("loginname") String username,
                            @RequestParam("password") String password){
            // User类自行创建 此处举例
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            // 此处注解没有指定name,那么返回值是User类型,那么model的属性就是user
            return user;
        }
    
        @RequestMapping(value="/hello")
        public String hello() {
        	// 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法
        }
    
  3. @ModelAttribute用于void返回值的方法

    无返回值,无法自动给model对象设置属性名称和值,只能通过model.addAttribute() 实现

       @ModelAttribute
        public void testOne(@RequestParam("username") String username, 
                            @RequestParam("password") String password, 
                            Model model){
            model.addAttribute("username", username);
            model.addAttribute("password", password);
        }
    
        @RequestMapping(value="/hello")
        public String hello() {
        	// 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法
        }
    
  4. @ModelAttribute和@RequestMapping同时用于一个方法

    方法返回的不是视图名,而是model的属性值,视图名是@RequestMapping注解的name值

    @RequestMapping(name="/testOne")
    @ModelAttribute(name="username")
    public String testOne() {
        return "admin";
        // 这里返回的并不是一个视图名 而是model属性的值
        // 视图名称是@RequestMapping注解中的testOne
        // 执行完此方法会跳转到 testOne.jsp 页面
    }
    
  5. @ModelAttribute用于一个方法的参数

    此方法最为常用,可以将前台页面的值回传到另一个页面

    @RequestMapping(value="/testOne")
    public String testOne(@ModelAttribute User user) {
        // 加了@ModelAttribute注解的参数值会自动加入到model对象的同名属性中
        return "hello";
        // 此处hello为视图名
    }
    

16. @RestController

使用此注解的类首先是一个Controller类,类中所有使用了@RequestMapping注解的方法都默认使用了@ResponseBody注解

17. @ResponseStatus

此注解是处理异常的的最简单的方式,可以用于类上或者方法上,用于类上时,该类通常为异常类

使用时,先声明一个自定义异常类,在类上加上@ResponseStatus注解。当抛出该自定义异常时,@ResponseStatus注解的code属性(http状态码)和reason属性(异常信息)将返回给浏览器。

// 如果没有使用code属性,说明该异常可以被http任何状态调用
@ResponseStatus(reason="自定义异常具体信息")
public class MyException extends RuntimeException{
    // ...
}
@Controller
public class test{
    @RequestMapping("/hello")
    public String hello() throws Exception{
        try{
            int i = 5 / 0;
            return "success";
        } catch(Exception e){
            throw new MyException();
            // 当访问/hello方法时 如果出现异常 则抛出MyException自定义异常
            // 如果抛出MyException该自定义异常 将注解中的reason属性值返回给浏览器
        }
    }
}

18. @ExceptionHandle

此注解用于方法之上

定义一个BaseController类,让所有Controller继承此类,用此类处理所有Controller的异常

public class BaseController {
    // value属性可以指定 异常类型
    // value值为Exception 说明此方法可以处理所有Exception类型的异常
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        // 设置异常信息
        mav.addObject("ex", e);
        // 设置跳转异常处理页面
        mav.setViewName("error"); 
        return mav;
    }
}

定义一个UserController,继承BaseController

@Controller
public class UserController extends BaseController{
	// 访问/login链接
	@RequestMapping("/login")
	public String login(String username) throws Exception{
		if(username == null ){
			throw new NullPointerException("用户名不存在!");
		}
		return "success";
	}
}

访问/login链接,如果username为空,则抛出NullPointerException,会被父类中带有@ExceptionHandler注解的方法根据指定异常类型处理。

19. @ControllerAdvice

该注解使用了@Component注解,可以被Spring容器扫描到。扫描到之后会将用此注解的类的内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的请求处理方法上。最常用@ExcetionHandler,其他两个作用不大。

// 此类会被Spring容器扫描
@ControllerAdvice
public class MyExceptionHandler {
	// 处理Exception类型异常
	@ExceptionHandler(value = Exception.class)
    public ModelAndView errorHandler1(Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("ex", e);
        mav.setViewName("error");
        return mav;
    }
	
	// 处理MyException自定义异常
	@ExceptionHandler(value = MyException.class)
	@ResponseBody
    public Object errorHandler2(Exception e) throws Exception {
        // 创建返回对象Map并设置属性,会被@ResponseBody注解转换为JSON返回
        Map<String, Object> map = new HashMap<>();
        map.put("code", 100);
        map.put("message", e.getMessage());
        map.put("data", "请求失败");
        return map;
    }
}
// 自定义异常类
public class MyException extends RuntimeException {
    
}
// Controller类
@Controller
public class TestController{
	@RequestMapping("/hello")
	public String hello() throws Exception{
		// 此异常将被MyExceptionHandler类的errorHandler1方法捕获
        int i = 5 / 0;
		return "hello";
	}
    
	@RequestMapping("/world")
	public String world() throws Exception{
		try {
			int i = 5 / 0;
			return "world";
		} catch (Exception e) {
			e.printStackTrace();
			// 此异常将被MyExceptionHandler类的errorHandler2方法捕获
			throw new MyException("呀,出异常了!");
		}
	}
}

20. @RestControllerAdvice

该注解使用@ControllerAdvice和@ResponseBody注解,使用此注解的类会被看作是一个ControllerAdvice,而该类中所有使用@ExceptionHandler注解的方法都默认使用了@ResponseBody注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhShy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值