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

时间:2014-03-13 21:28:25

标签: java spring spring-mvc

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

问题在于我被要求在不使用POST请求的情况下执行此操作,而只使用GET请求,并且在丢失弹簧为我们带来的默认数据绑定功能之前就已经存在。

所以我试着在我的控制器中实现一个看起来像这样的方法:

@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(true);看起来可以做的工作! (根据javadoc)

感谢所有人!

问候

胜者。

1 个答案:

答案 0 :(得分:1)

哦,我发现了一种存档所需内容的方法。

我会解释为那些之前有同样问题的人,并希望找到一位经验丰富的用户来验证这种方法...一些安静的常见的是有多种方法可以做同样的事情,因为人类是非常的很难知道如果没有正确的确认正确的路径..所以这个ia发现在AbstractFormController内部(用javadoc很好地记录)。

所以我做的是以下内容,在我的控制器构造函数中,我在最后添加了这些行:

    setSessionForm(true);
    setBindOnNewForm(true);

那就是所有的魔力!

但是没有使用setSessionForm(true)。根据javadoc,setBindOnNewForm(boolean)方法执行以下操作:

/**
 * 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可以将表单对象存储为会话属性,因此"存储在会话中以保持表单对象实例位于请求之间,而不是在每个请求上创建新的表单对象实例。 (根据setSessionForm方法的javadoc)。
  • setBindOnNewForm允许具有初始请求的表单对象的填充(请求我们具有哪种类型的请求方法)。根据javadoc发现AbstractFormController"只有当bindOnNewForm设置为true时,才会应用ServletRequestDataBinder以使用初始请求参数填充新表单对象..."

但是我仍然注意到,在调试器的控制器流程之后,人口正在方法内部发生" getErrorsForNewForm(HttpServletRequest request)" ..这就是使用ServletRequestDataBinder类型的具体对象的地方 IF setBindOnNewForm为true,稍后(如javadoc所述)调用onBindOnNewForm方法,允许程序员用自定义行为覆盖它,默认行为只是空的(再次对此进行双重检查) AbstractFormController的代码。

我有一种强烈的感觉来验证我的想法,所以如果有人能帮助我,那就没问题,除了问题解决了!

提前感谢所有人!

问候。