java -- SpringMVC表现层数据封装详解
创始人
2024-11-06 13:09:13
0

表现层数据封装

介绍

1. ModelAndView

ModelAndView是Spring MVC提供的一个对象,用于封装模型数据和视图信息。当Controller处理完用户请求后,会返回一个ModelAndView对象给DispatcherServlet,DispatcherServlet再解析这个对象,找到对应的视图,并将模型数据传递给视图进行渲染。

@RequestMapping("/hello")   public ModelAndView hello() {       ModelAndView mv = new ModelAndView();       mv.addObject("message", "Hello, World!");       mv.setViewName("hello");       return mv;   } 

2. ModelMap

ModelMap是一个实现了Map接口的类,用于存储模型数据。Spring MVC会自动将ModelMap中的数据添加到请求对象中,从而可以在视图中访问。

在Controller的方法中,可以通过添加ModelMap类型的参数来接收模型数据,或者返回ModelAndView时通过addObject方法添加数据。

@RequestMapping("/hello")   public String hello(ModelMap model) {       model.addAttribute("message", "Hello, World!");       return "hello";   } 

3. @ModelAttribute

@ModelAttribute注解可以用在方法上或参数上。当用在方法上时,表示该方法的返回值会自动添加到模型中。当用在参数上时,表示该参数的值将从请求参数、路径变量、Session或Model中自动获取。

  • 用在方法上
@ModelAttribute   public void populateModel(@RequestParam String userId, Model model) {       User user = userService.getUser(userId);       model.addAttribute("user", user);   } 
  • 用在参数上
@RequestMapping("/editUser")   public String editUser(@ModelAttribute("user") User user) {       // 这里user对象的属性已经根据请求参数被填充       return "editUser";   } 

4. @RequestParam 和 @PathVariable

  • @RequestParam用于将请求参数绑定到你的控制器处理方法的参数上。
@RequestMapping("/user")   public String getUser(@RequestParam("id") String userId) {       // 使用userId...       return "user";   } 
  • @PathVariable用于将URL模板变量绑定到你的控制器处理方法的参数上。
@RequestMapping("/user/{userId}")   public String getUser(@PathVariable("userId") String userId) {       // 使用userId...       return "user";   } 

1 表现层响应数据的问题

问题:我们表现层增删改方法返回true或者false表示是否成功,getById()方法返回一个json对象,getAll()方法返回一个json对象数组,这里就出现了三种格式的响应结果,极其不利于前端解析。

在这里插入图片描述

解决:我们需要统一响应结果的格式

2 定义Result类封装响应结果

2.1 Result类封装响应结果
public class Result {     //描述统一格式中的数据     private Object data;     //描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败     private Integer code;     //描述统一格式中的消息,可选属性     private String msg;      public Result() {     }     public Result(Integer code,Object data) {         this.data = data;         this.code = code;     }     public Result(Integer code, Object data, String msg) {         this.data = data;         this.code = code;         this.msg = msg;     }      //同学们自己添加getter、setter、toString()方法 } 

注意事项:

Result类中的字段并不是固定的,可以根据需要自行增减

2.2 Code类封装响应码
//状态码 public class Code {     public static final Integer SAVE_OK = 20011;     public static final Integer DELETE_OK = 20021;     public static final Integer UPDATE_OK = 20031;     public static final Integer GET_OK = 20041;      public static final Integer SAVE_ERR = 20010;     public static final Integer DELETE_ERR = 20020;     public static final Integer UPDATE_ERR = 20030;     public static final Integer GET_ERR = 20040; }  

注意事项:

Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK

3 表现层数据封装返回Result对象

@RestController @RequestMapping("/books") public class BookController {      @Autowired     private BookService bookService;      @PostMapping     public Result save(@RequestBody Book book) {         boolean flag = bookService.save(book);         return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);     }      @PutMapping     public Result update(@RequestBody Book book) {         boolean flag = bookService.update(book);         return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);     }      @DeleteMapping("/{id}")     public Result delete(@PathVariable Integer id) {         boolean flag = bookService.delete(id);         return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);     }      @GetMapping("/{id}")     public Result getById(@PathVariable Integer id) {         Book book = bookService.getById(id);         Integer code = book != null ? Code.GET_OK : Code.GET_ERR;         String msg = book != null ? "" : "数据查询失败,请重试!";         return new Result(code,book,msg);     }      @GetMapping     public Result getAll() {         List bookList = bookService.getAll();         Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;         String msg = bookList != null ? "" : "数据查询失败,请重试!";         return new Result(code,bookList,msg);     } } 

相关内容

热门资讯

透视插件!wepoker辅助真... 透视插件!wepoker辅助真的假的(透视)永久脚本辅助神器(详细辅助技巧教程);1)wepoker...
科普常识!财神13辅助包最新版... 您好,财神13辅助包最新版本更新内容详解这款游戏可以开挂的,确实是有挂的,需要了解加微【136704...
透视辅助!xpoker辅助怎么... 透视辅助!xpoker辅助怎么用(透视)永久脚本辅助助手(详细辅助曝光教程)1、进入到xpoker辅...
终于清楚!传送屋辅助器,打两圈... 终于清楚!传送屋辅助器,打两圈泰兴辅助,高科技教程(有挂教学)您好,打两圈泰兴辅助,确实是有挂的,很...
总算了解!欢乐达人最新版破解版... 总算了解!欢乐达人最新版破解版,欢聚水鱼科技辅助下载,AI教程(有挂总结)1)欢乐达人最新版破解版辅...
透视讲解!德普之星透视辅助软件... 透视讲解!德普之星透视辅助软件是真的吗(透视)永久脚本辅助方法(详细辅助新2025教程)1、玩家可以...
玩家实测!新海贝之城辅助,推荐... 自定义推荐一下胡乐辅助脚本的教程系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅...
透视线上!wepoker模拟器... 透视线上!wepoker模拟器哪个好用(透视)永久脚本辅助app(详细辅助玩家教程);一、wepok...
推荐一款!财神13章作弊,哈糖... 自定义哈糖大菠萝挂法系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你...
重大科普!吉利比鸡辅助,广东麻... 重大科普!吉利比鸡辅助,广东麻雀有什么技巧,安装教程(有挂总结)1、这是跨平台的广东麻雀有什么技巧黑...