Post/Redirect/Get(PRG)模式是一种Web开发设计模式,用于解决表单重复提交问题。其核心流程是:
在PRG模式中,由于HTTP的无状态特性,需要在重定向过程中保持数据,以下是几种常用方法:
Spring 3.1+提供了FlashMap机制:
@PostMapping("/submitForm")
public String handleFormSubmission(FormData formData, RedirectAttributes redirectAttributes) {
// 处理表单数据...
// 添加flash属性
redirectAttributes.addFlashAttribute("message", "操作成功");
redirectAttributes.addFlashAttribute("formData", formData);
return "redirect:/successPage";
}
@GetMapping("/successPage")
public String showSuccessPage(Model model) {
// Flash属性会自动添加到Model中
return "success";
}
将数据作为URL参数传递:
@PostMapping("/submitForm")
public String handleFormSubmission(FormData formData) {
// 处理表单数据...
return "redirect:/successPage?message=操作成功&id=" + formData.getId();
}
@GetMapping("/successPage")
public String showSuccessPage(@RequestParam String message,
@RequestParam Long id,
Model model) {
model.addAttribute("message", message);
// 根据id查询数据...
return "success";
}
@PostMapping("/submitForm")
public String handleFormSubmission(FormData formData, HttpSession session) {
// 处理表单数据...
session.setAttribute("tempFormData", formData);
return "redirect:/successPage";
}
@GetMapping("/successPage")
public String showSuccessPage(HttpSession session, Model model) {
FormData formData = (FormData) session.getAttribute("tempFormData");
model.addAttribute("formData", formData);
session.removeAttribute("tempFormData"); // 清除session数据
return "success";
}
| 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|---------| | Flash Attributes | 自动管理,无需手动清理,安全 | 仅适用于重定向后的第一个请求 | 大多数PRG场景 | | URL重写 | 简单直接 | 暴露敏感数据,URL长度限制 | 少量非敏感数据 | | Session存储 | 可传递复杂对象 | 需要手动清理,增加服务器负担 | 需要传递复杂对象时 |
// 表单提交处理
@Controller
public class FormController {
@GetMapping("/form")
public String showForm(Model model) {
model.addAttribute("formData", new FormData());
return "form";
}
@PostMapping("/submit")
public String submitForm(@Valid FormData formData,
BindingResult result,
RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return "form";
}
// 业务处理...
// 添加Flash属性
redirectAttributes.addFlashAttribute("message", "表单提交成功");
redirectAttributes.addFlashAttribute("submittedData", formData);
return "redirect:/result";
}
@GetMapping("/result")
public String showResult() {
// Flash属性会自动可用
return "result";
}
}
<!-- result.html (Thymeleaf示例) -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>提交结果</title>
</head>
<body>
<p th:text="${message}"></p>
<div th:if="${submittedData}">
<p>提交的数据:</p>
<p th:text="${submittedData.field1}"></p>
<p th:text="${submittedData.field2}"></p>
</div>
</body>
</html>
通过以上方法,您可以在Spring MVC中有效地实现PRG模式并保持数据传递。