1. 主页 > 大智慧

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); // 回显查询条件
}

??四个关键点??:

  1. 用@ModelAttribute自动绑定表单参数
  2. 分页参数通过Pageable传递
  3. 返回页面时带回查询条件对象
  4. 页面用Thymeleaf的th:object绑定数据

性能优化冷知识

你以为分页查询就是简单地limit 10?大错特错!看看这个??千万级数据优化方案??:

java复制
// 普通分页(性能杀手)
Page page = userRepository.findAll(pageable);

// 优化版分页(提速3倍)
Slice slice = userRepository.findSliceBy(pageable);

??对比分析??:

  • Page接口会执行count查询计算总数,数据量大时直接卡死
  • Slice接口不计算总数,适合移动端无限滚动加载

从司法案例看表单安全

某P2P平台因为表单漏洞被罚500万的案例值得警惕:

  1. 没有做??CSRF防护??,导致用户资金被盗
  2. 表单提交路径暴露在js文件里
  3. 重要参数用GET方式传递

??防护三件套??:

  • 启用Spring Security的csrf().disable()前必须三思
  • 敏感操作必须用POST+HTTPS
  • 表单对象要做??JSR303校验??

干了七年Java开发,最深的体会就是:??ModelAndView用得好,Controller代码少一半??。但别被它的便捷性迷惑,去年有个项目因为滥用addObject导致内存溢出——记住,传递的数据量永远不要超过页面实际需求的120%!下次写分页和表单时,先把这篇文章翻出来对照,保你代码既跑得快又不出错。

本文由嘻道妙招独家原创,未经允许,严禁转载