ModelAndView整合开发实战:分页查询与表单提交实现指南
刚接触Spring MVC时,你是不是也纠结过这两个问题???分页数据怎么传给页面?表单提交后参数去哪找??? 去年我做电商后台系统,就因为这两个坑连续加班一周。今天就把实战经验掏给你,保你少走弯路!
分页查询三大核心难题破解
??问题1:分页参数到底放哪???
见过有人在Controller方法里写七八个参数:pageNo、pageSize、total... 其实用??Pageable对象??才是正道:
java复制@GetMapping("/products") public ModelAndView listProducts( @PageableDefault(size=10) Pageable pageable) { Page
page = productService.findAll(pageable); ModelAndView mav = new ModelAndView("product/list"); mav.addObject("page", page); return mav; }
??对比传统方式??:
传参方式 | 代码量 | 可维护性 | 扩展性 |
---|---|---|---|
多参数接收 | 15行+ | 差 | 低 |
Pageable封装 | 5行 | 优 | 高 |
??避坑指南??:有些老项目还在用PagerHelper插件,记得在pom.xml排除mybatis-spring-boot-starter自带的pagehelper版本,否则分页插件会打架!
表单提交的暗雷区
上周实习生写的用户注册功能,提交后数据死活存不进数据库。后来发现是??字段名没对齐??:
html运行复制<input type="text" name="userName"> <input type="text" name="username">
??JavaBean必须严格遵循命名规范??:
java复制public class User { private String username; // 字段名必须全小写 // Getter/Setter必须按规范生成 }
??血泪教训??:有次给政府项目做迁移,因为旧系统字段用下划线命名(user_name),新系统改驼峰命名(userName),导致2000多条数据映射失败!
分页+表单的混合双打
最近做的订单管理系统最典型——既要分页显示订单,又要支持表单条件查询。来看??企业级解决方案??:
java复制@PostMapping("/orders/search") public ModelAndView searchOrders( @ModelAttribute OrderQuery query, @PageableDefault(sort = "createTime", direction = DESC) Pageable pageable) { Page
page = orderService.search(query, pageable); return new ModelAndView("order/list") .addObject("page", page) .addObject("query", query); // 回显查询条件 }
??四个关键点??:
- 用@ModelAttribute自动绑定表单参数
- 分页参数通过Pageable传递
- 返回页面时带回查询条件对象
- 页面用Thymeleaf的th:object绑定数据
性能优化冷知识
你以为分页查询就是简单地limit 10?大错特错!看看这个??千万级数据优化方案??:
java复制// 普通分页(性能杀手) Page
page = userRepository.findAll(pageable); // 优化版分页(提速3倍) Slice slice = userRepository.findSliceBy(pageable);
??对比分析??:
- Page接口会执行count查询计算总数,数据量大时直接卡死
- Slice接口不计算总数,适合移动端无限滚动加载
从司法案例看表单安全
某P2P平台因为表单漏洞被罚500万的案例值得警惕:
- 没有做??CSRF防护??,导致用户资金被盗
- 表单提交路径暴露在js文件里
- 重要参数用GET方式传递
??防护三件套??:
- 启用Spring Security的csrf().disable()前必须三思
- 敏感操作必须用POST+HTTPS
- 表单对象要做??JSR303校验??
干了七年Java开发,最深的体会就是:??ModelAndView用得好,Controller代码少一半??。但别被它的便捷性迷惑,去年有个项目因为滥用addObject导致内存溢出——记住,传递的数据量永远不要超过页面实际需求的120%!下次写分页和表单时,先把这篇文章翻出来对照,保你代码既跑得快又不出错。
本文由嘻道妙招独家原创,未经允许,严禁转载