Java 使用Get请求的Spring MVC绑定命令对象

Java 使用Get请求的Spring MVC绑定命令对象,java,spring,spring-mvc,Java,Spring,Spring Mvc,我需要实现一个控制器,该控制器有一个命令对象,该对象支持一个过滤表单,用于跨多个条目进行搜索 问题是,我被要求在不使用POST请求的情况下执行此操作,而只使用GET请求,在失去springs为我们提供的默认数据绑定功能之前 因此,我尝试在我的控制器内实现一种方法,如下所示: @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)

我需要实现一个控制器,该控制器有一个命令对象,该对象支持一个过滤表单,用于跨多个条目进行搜索

问题是,我被要求在不使用POST请求的情况下执行此操作,而只使用GET请求,在失去springs为我们提供的默认数据绑定功能之前

因此,我尝试在我的控制器内实现一种方法,如下所示:

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    if (isSearchRequest(request)) {
        MyCommandObject myCommandObject = (MyCommandObject) getCommand(request);
        System.out.println(managePositionsForm);
    }
    return super.handleRequestInternal(request, response);
}
但是getCommand返回一个全新的CommandObject,没有任何值,尽管这些值存在于请求对象中(然后我可以使用HttpServletRequest的getParameter方法进行检索)。但没有任何约束力

因此,问题是:

1) 有没有办法把这个存档

2) 同样非常重要的是,表单中的所有值都会丢失,最终(如果这个问题得到解决),我需要为用户“持久化”过滤器,以避免在第一次搜索后重新输入

  • 自动响应:setSessionForm(真);看起来我能做这项工作!(根据javadoc)
谢谢大家

问候


维克多。

好的,我找到了一种方法来归档a所寻找的内容

我将为那些以前有同样问题的人解释,并希望找到一个有经验的用户来验证这个方法。。。一个很常见的现象是,做同一件事有多种方法,如果没有正确的认知,人类很难知道正确的道路。。因此,我在AbstractFormController(javadoc很好地记录了它)中发现了这一点

因此,我做了如下操作,在控制器构造函数的末尾添加了以下几行:

    setSessionForm(true);
    setBindOnNewForm(true);
这就是所有的魔法

但是setSessionForm(true)还不够。根据javadoc,setBindOnNewForm(布尔)方法执行以下操作:

/**
 * Set if request parameters should be bound to the form object
 * in case of a non-submitting request, i.e. a new form.
 */
所以我猜这两个标志必须标记为true,因为:

  • setSessionForm允许将form对象存储为会话属性,因此“存储在会话中以在请求之间保留form对象实例,而不是在每个请求上创建一个新实例”(根据setSessionForm方法的javadoc)
  • setBindOnNewForm允许使用初始请求填充表单对象(不管我们有什么类型的请求方法)。根据javadoc发现的“仅当bindOnNewForm设置为true时,才应用ServletRequestDataBinder以使用初始请求参数填充新表单对象…”
但我仍然注意到,在使用调试器的控制器流之后,填充发生在方法“getErrorsForNewForm(HttpServletRequest)”中。。这就是使用ServletRequestDataBinder类型的具体对象的地方,如果setBindOnNewForm为true,并且稍后(如javadoc所述)调用onBindOnNewForm方法,允许程序员用自定义行为覆盖它,那么默认行为就是空的(这再次与AbstractFormController的代码进行了双重检查)

我有一种强烈的感觉来验证我的想法,所以如果有人能帮助我,那也没关系,而且问题已经解决了

提前感谢大家


您好。

您似乎在说您不能使用GET(仅在第二段后)将数据绑定到命令对象?这是不正确的-GET也能工作!谢谢!您能告诉我怎么做,或者在哪里我能找到一个解释来解释这一点吗?您是说setSessionForm(true)发挥了所有的魔力?