使用 Post/Redirect/Get 模式保留模型状态

2024-02-26

目前我正在尝试使用 Spring MVC 3.1 实现 Post/Redirect/Get 模式。保存和恢复模型数据+验证错误的正确方法是什么?我知道我可以在 POST 方法中使用 RedirectAttributes 保留模型和 BindingResult。但是,在 GET 方法中从闪存范围恢复它们的正确方法是什么?

我已完成以下 POST 操作:

    @RequestMapping(value = "/user/create", method = RequestMethod.POST)
public String doCreate(@ModelAttribute("user") @Valid User user, BindingResult result, RedirectAttributes rA){

    if(result.hasErrors()){
        rA.addFlashAttribute("result", result);
        rA.addFlashAttribute("user", user);

        return "redirect:/user";
    }

    return "redirect:/user/success";
}

获取用户创建表单的步骤如下:

    @RequestMapping(value = "/user", method = RequestMethod.GET)
public ModelAndView showUserForm(@ModelAttribute("user") User user, ModelAndView model){

    model.addObject("user", user);
    model.setViewName("userForm");

    return model;
}

这使我能够在发生错误时保留给定的用户数据。但是恢复错误的正确方法是什么?(BindingResult)我想用 spring 表单标签在表单中显示它们:

<form:errors path="*" />

另外,如何从 get 方法访问 flash 范围会很有趣?


public class BindingHandlerInterceptor extends HandlerInterceptorAdapter {

    public static final String BINDING_RESULT_FLUSH_ATTRIBUTE_KEY = BindingHandlerInterceptor.class.getName() + ".flashBindingResult";

    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {


        if(METHOD_POST.equals(request.getMethod())) {

            BindingResult bindingResult = getBindingResult(modelAndView);

            FlashMap outFlash = RequestContextUtils.getOutputFlashMap(request);

            if(bindingResult == null || ! bindingResult.hasErrors() || outFlash == null ) {
                return;
            }

            outFlash.put(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY, bindingResult);

        }

        Map<String, ?> inFlash = RequestContextUtils.getInputFlashMap(request);

        if(METHOD_GET.equals(request.getMethod()) && inFlash != null && inFlash.containsKey(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY)) {

            BindingResult flashBindingResult = (BindingResult)inFlash.get(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY);

            if(flashBindingResult != null) {

                BindingResult bindingResult = getBindingResult(modelAndView);

                if(bindingResult == null) {
                    return;
                }

                bindingResult.addAllErrors(flashBindingResult);

            }

        }

    }

    public static BindingResult getBindingResult(ModelAndView modelAndView) {

        if(modelAndView == null) {
            return null;
        }

        for (Entry<String,?> key : modelAndView.getModel().entrySet()) {
            if(key.getKey().startsWith(BindingResult.MODEL_KEY_PREFIX)) {
                return (BindingResult)key.getValue();
            }
        }

        return null;
    }


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Post/Redirect/Get 模式保留模型状态 的相关文章

随机推荐

  • IE 是唯一不允许 Flash 对象操作的浏览器(或版本)吗?

    我已经尝试了多种方法通过 Javascript 编辑 Flash 对象 嵌入 它似乎适用于除 IE 之外的所有浏览器 因此我正在考虑将 IE 扔出此应用程序的窗口 除非有较旧的 使用过的其他浏览器版本也不允许您编辑对象 一个例子是 docu
  • ASP.NET MVC,“需要票证”属性

    我正在尝试构建一个允许用户执行某些操作的系统 但他们的帐户每次执行操作时都必须有一个特定的 票证 例如 假设他们希望创建一个Product 他们需要一个CreateProductTicket 当然 我可以简单地使用一些 if 语句来做到这一
  • jQuery 验证 - 两个字段,只需填写一个

    我正在使用jQuery 验证插件 http bassistance de jquery plugins jquery plugin validation 在我的表格上 我的表格上有一个 电话 字段和一个 手机号码 场地 我该如何制作 以便用
  • 在 SVG 路径中填充形状/图标 (js)

    我有一个带有路径的 SVG
  • 带有交叉验证的 scikits 混淆矩阵

    我正在使用 scikits 接口通过交叉验证 stratifiedKfold 训练 svm 分类器 对于每个测试集 k 个 我都会得到一个分类结果 我想要一个包含所有结果的混淆矩阵 Scikits 有一个混淆矩阵接口 sklearn met
  • 意外的tornado.ioloop.PeriodicCallback行为

    试图弄清楚如何PeriodicCallback已经安排好了 我写了这个脚本 import time import tornado ioloop t0 time time def foo time sleep 1 print time tim
  • 在 jenkins docker 容器内执行 docker host 命令

    我有一个运行 jenkins 的 docker 容器 我想在这个容器内部启动其他容器 所以在这个容器外部 我尝试用以下命令启动我的詹金斯控制器 docker run v var run docker sock var run docker
  • 如何缩小 Ruby 源文件?

    我有一种情况 我希望能够minify 未编译 Ruby 脚本 目标是 减少脚本的整体字符数 执行一定程度的混淆 使其他人难以修改代码 我们可以假设 是的 我知道我在做什么 而且我确实想缩小和混淆代码 Ruby 源代码具有简单的语法 并且不使
  • 列出 Google Drive 中所有文件的脚本:Api、cURL 和 Bash

    这是一个 bash 脚本 使用 cURL 列出我的 Google Drive 帐户 不是与我分享文件 只有我自己的文件 您必须在您的帐户中授予对 Google Drive API 的访问权限 并在脚本中填充变量 idclient and i
  • SSE 双线性插值

    我正在紧密循环中实现双线性插值 并尝试使用 SSE 对其进行优化 但我从中得到的加速为零 这是代码 非 SIMD 版本使用简单的向量结构 可以定义为struct Vec3f float x y z 实现乘法和加法运算符 ifdef USE
  • 禁用时更改开关颜色

    我有一个开关 当启用并选中时 它的颜色是我的 colorPrimary 我希望在检查但禁用时具有相同的颜色 但我找不到完成它的方法 我尝试使用选择器 但它改变了开关背景而不是切换本身 如何更改开关颜色 Thanks 1 在 styles x
  • 复选框确认消息 - 如果为 false,则保持选中状态

    我目前正在尝试在用户尝试取消选择选项时添加 JavaScript 确认消息 如果用户在确认屏幕上选择取消 则该复选框应保持选中状态 我遇到的问题是 即使我返回 false 该复选框也不会被选中 代码示例可以在这里找到http jsfiddl
  • 使用 python 的 CentOS 上的 Hadoop 流示例 - /mapred/local/taskTracker 上的权限被拒绝

    我已经能够使用 python 映射器和减速器设置流示例 mapred文件夹位置是 mapred local taskTracker root 和 mapred 用户都拥有此文件夹和子文件夹的所有权 但是 当我运行流式传输时 它会创建地图但不
  • NSString 中某个字符出现的次数

    我有一个NSString or NSMutableString并希望获得特定字符出现的次数 我需要对相当多的字符 在本例中为大写英文字符 执行此操作 所以速度快一点就好了 您可以在一行中完成此操作 例如 计算空格数 NSUInteger n
  • 我可以使用循环来最小化 ES6 import 语句吗?

    我检查了文档中的 导入 觉得不可能像数组元素一样对待导入的名称 欢迎任何处理这种情况的建议 import C1 from samples sample1 import C3 from samples sample3 import C4 fr
  • Drupal 对数据库执行查询

    我希望从我的 drupal 数据库中检索一些 nid 我有一个想要运行的查询 SELECT node nid AS projectnid FROM node node INNER JOIN content type project node
  • Xcode 13 中的 Info.plist 在哪里? (缺失,不在项目导航器内)

    有谁知道如何添加 编辑值Info plistXcode 13 还没到吗 我看到他们移动了Info plist从导航器窗格 但是虽然我可以找到它 但我不知道如何编辑它 这是一个 功能 你不再需要它了 来自发行说明 https develope
  • 运行进程时隐藏 vb.net 中的命令窗口

    如果我有这个代码 Send file to Unix server via pscp Dim Proc As New System Diagnostics Process Proc StartInfo New ProcessStartInf
  • 不小心把代码发布了。如何防止再次发生?

    最近我们发生了一起事件 一些原本没有计划发布的代码被发布了 显然它已经被托运到行李箱里了 我想这很好 如你所愿 提早入住 经常入住 然而在这种情况下 它不应该在下一个版本中发布 可以采取什么样的检查 策略 流程来避免代码过早发布 在我看来
  • 使用 Post/Redirect/Get 模式保留模型状态

    目前我正在尝试使用 Spring MVC 3 1 实现 Post Redirect Get 模式 保存和恢复模型数据 验证错误的正确方法是什么 我知道我可以在 POST 方法中使用 RedirectAttributes 保留模型和 Bind