这是我参与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数据 而不是视图
- ModelAndView
@RequestMapping("/userList")
public ModelAndView getAllUser(ModelAndView mv) {
List<User> users= userService.getAllUser();
//添加数据模型到request域中
mv.addObject("users", users);
mv.setViewName("userList");//指定视图名
return mv;
}
- 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");
}
- 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 "删除失败";
}
}
- json 现在前后端分离的情况下,大部分后端只需要返回JSON数据即可,List 集合、Map集合,实体类等都可以返回,这些数据由 HttpMessageConverter自动转为JSON ,如果使用了Jackson或者Gson,不需要额外配置就可以自动返回JSON了,因为框架帮我们提供了对应HttpMessageConverter
@RequestMapping("/info")
@ResponseBody
public List<User> info() {
List<User> users = userService.getAllUser();
return users;
}