[英]Java Spring MVC PRG Pattern preserve Data on reload
我目前正在从事 spring mvc 项目。 我有一个带有表单的页面,它代表一个配置器。 用户可以在一堆 select 字段中选择一些数据,然后继续下一步,根据他所做的输入,他将获得相同的 jsp 页面但具有更多字段。 这将重复几次,直到他在另一页上得到他的结果。 每次将执行 POST。
现在,如果用户使用浏览器的背面 function,他不会进入上一页,而是进入浏览器默认的“损坏页面”,例如 Chrome 会说“请确认重新提交表单数据......” . 要真正重新提交数据,他必须按重新加载并确认弹出窗口。
重新提交本身并不是真正的问题,因为数据不会不一致,它只是对后端执行另一个调用并接收它提供的数据。 真正的禁忌是用户必须手动刷新页面并且偶然会被默认浏览器页面弄糊涂。
我做了一些研究,发现PRG(Post-Redirect-Get)模式可以解决这个问题。 事实上,我现在可以通过浏览器导航或重新加载页面,并且不会弹出或损坏页面 - 因为它现在当然是一个 GET 请求。
现在的问题是,如果我向后导航,最后一页不包含它之前包含的数据,但现在是空的,因为根本不存在任何数据。 我知道它现在是一个 GET 请求,并且没有发布任何数据,但我认为前一页将被“重用”,如此处所示。
现在使用 PRG 模式,应用程序的处理更加糟糕,因为如果用户重新加载或导航回来,他基本上必须从头开始。
我误解了这个模式的含义吗?
快速查看一些代码,我是如何实现的:
@PostMapping("/config")
public String handlePostRequestConfig(RedirectAttributes redirectAttributes, ProductForm productForm){
//Handle productForm and add additional content to it
if(noMoreStepsLeft){
return "redirect:/result";
}
redirectAttributes.addFlashAttribute("form", productForm);
return "redirect:/config";
}
@GetMapping("/config")
public String handleGetRequestConfig(Model model, @ModelAttribute("form") ProductForm productForm{
model.addAttribute("form", productForm);
return getJsp("product");
}
JSP 内部:
<form method="post" action="/config">
<c:foreach items="${form.selectFields}" var="selectField">
<input...>
</c:foreach>
<button type="submit">Submit</button>
</form>
在PRG中, P
不是用户动作流的第一步。 PRG是整个流程的一部分。
下面显示了一个流程以及PRG如何适应它:
用户将点击 URL。 例如: http://localhost:8080/myContextPath/config
。 这将使用GET
处理程序进行处理:
@GetMapping("/config")
public String show(ModelMap model) {
// code
model.put("form", productForm);
return "product"; // returning view name which will be resolved by a view resolver
}
产品.jsp :
<form commandName="form" method="post">
<c:foreach items="${form.selectFields}" var="selectField">
<input...>
</c:foreach>
<input type="submit" value="Submit"/>
</form>
此提交操作将由POST
处理程序处理:
@PostMapping("/config")
public String submit(@ModelAttribute("form") ProductForm productForm,
RedirectAttributes redirectAttributes){
// code, may be service calls, db actions etc
return "redirect:/config";
}
此重定向到/config
将由/config
GET
处理程序再次处理。 (或者您当然可以重定向到任何GET
处理程序)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.