spring MVC 定义和相关注解

174 阅读4分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

定义:

1,spring MVC 是一套基于java实现的MVC设计模型的请求驱动类型的轻量级Web框架,是spring框架的一个模块

2,通过一套注解,使一个普通的java类成为处理请求的控制器 无须实现接口,还支持RESTful风格的请求

常用注解

  • @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。

  • @RestController注解替代@Controller注解,@RestController相当于@ResponseBody+@Controller,表示控制器中所有的方法都返回JSON格式数据,一般不使用其他注解标识控制器。

  • @RequsestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求 的方法都是以该地址作为父路径。

    • value:指定请求的实际地址。
    • method:指定请求的method类型, GET、POST、PUT、DELETE等。
    • consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。
    • produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
    • params:指定request中必须包含某些参数值是,才让该方法处理。
    • headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
  • @ControllerAdvice标识一个类是全局异常处理类。

@ControllerAdvice
public class ControllerTest {
    //全局异常处理类
}
  • @ExceptionHandler

@ExceptionHandler标识一个方法为全局异常处理的方法

@ExceptionHandler
public void ExceptionHandler(){
    //全局异常处理逻辑...
}
  • @PathVariable 接收uri地址传过来的参数
@RequestMapping("/user/{userId}/{userName}/query")
public User query(@PathVariable("userId") Long userId, @PathVariable("userName") String userName){

}
  • @RequestParam 用于将请求参数映射到控制器方法的形参上,不是接收uri地址传过来的参数
@RequestMapping(path = "/test", method = RequestMethod.GET)
@ResponseBody
public string getTestNum(@RequestParam(value = "requestNumber") final String requestNumber) {
    return requestNumber;
}
  • @Responsebody
    表示该方法的返回的结果直接写入 HTTP 响应正文中,一般在异步获取数据时使用;在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。例如,异步获取json数据,加上@Responsebody注解后,就会直接返回json数据。

SpringMVC四种返回值类型总结

@ResponseBody来修改默认行为,该注解表示返回JSON数据 而不是视图

  1. ModelAndView
@RequestMapping("/userList")
public ModelAndView getAllUser(ModelAndView mv) {
    List<User> users= userService.getAllUser();
    //添加数据模型到request域中
    mv.addObject("users", users);
    mv.setViewName("userList");//指定视图名
    return mv;
}
  1. void 如果返回值为void的话,并不是真正没有返回值,而是会出现以下几种情况:
  • 如果方法内真的没有返回值,那么SpringMVC默认把deleteUser(映射的URL)当成视图名称来解析,如果存在该视图,就返回给客户端;如果不存在该视图,就会报视图找不到异常。
@RequestMapping("/deleteUser")
@ResponseBody
public void deleteUser() {
    //删除操作
}

通过加@ResponseBody来修改默认行为,加上该注解表示返回JSON数据,这里返回空JSON数据,而不是把URL当成视图名称来解析

@RequestMapping("/deleteUser")
@ResponseBody
public void deleteUser() {
    //删除操作
}
  • 请求转发
@GetMapping("/")
public void root(HttpServletRequest req,HttpServletResponse resp) {
    req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);
}
  • 重定向
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
    resp.setStatus(302);
    resp.addHeader("Location","/WEB-INF/jsp/index.jsp");
}
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
    resp.sendRedirect("/WEB-INF/jsp/index.jsp");
}
  1. string
  • 逻辑视图名
@RequestMapping("/deleteUser")
//方法返回JSON数据
@ResponseBody   
public String deleteUser(Model model) {
    model.addAttribute("msg","删除成功");
    return "userList";
}
  • 重定向
@RequestParam("/login")
public String redirect(User user){
    if{
        //登录成功...
    }else{
        //登录失败,重定向到登录页面
        return "redirect:tologin";
    }
}
  • 请求转发
@RequestParam("/login")
public String redirect(User user){
    if{
        //登录成功...
    }else{
        //登录失败,转发到登录页面
        return "forward:tologin";
    }
}
  • 真的返回String,相当于JSON格式的数据
@RequestMapping("/deleteUser")
@ResponseBody
public String deleteUser() {
    try{
        //删除成功
        return "删除成功";
    }catch(Exception e){
        return "删除失败";
    }
}
  1. json 现在前后端分离的情况下,大部分后端只需要返回JSON数据即可,List 集合、Map集合,实体类等都可以返回,这些数据由 HttpMessageConverter自动转为JSON ,如果使用了Jackson或者Gson,不需要额外配置就可以自动返回JSON了,因为框架帮我们提供了对应HttpMessageConverter
@RequestMapping("/info")
@ResponseBody
public List<User> info() {
    List<User> users = userService.getAllUser();
    return users;
}