2014-03-13 62 views
0

我需要实现有来头的过滤形式在多个搜索条目的命令对象的控制命令对象。Spring MVC的绑定使用GET请求

的问题是,我被要求做,没有使用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)

感谢所有!

Greetings

Victor。

+2

看来你是说你不能用GET做数据绑定到命令对象(只有POST - 第二段)?这是不正确的 - GET也适用! – nickdos

+0

谢谢Ashot!你能指定我该怎么做,或者我可以在哪里找到解决问题的方法?你是说setSessionForm(true)完成所有的魔法? – Victor

回答

1

奥基,我找到了一种方法来归档什么一直在寻找。

我会解释为了那些之前有同样的问题,希望找到一个有经验的用户来验证这种方法...一些安静的共同点是有多种方式来做同样的事情和人类是很难知道没有适当的承认正确的道路..所以这个ia找到了内部的AbstractFormController(这是与javadoc出色的记录)。

所以我所做的就是下面,在我的控制器构造我在末尾添加这些行:

setSessionForm(true); 
    setBindOnNewForm(true); 

这所有的魔法!

但不与setSessionForm(真)足够多。据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. 
*/ 

所以我的猜测是,这两个标志是必要的,被标记为真实的,因为:

  • 的setSessionForm让更多钞票来存储作为表单对象的会话属性,因此“存储在会话中以保持请求之间的表单对象实例,而不是在每个请求上创建新的表单”(根据setSessionForm方法的javadoc)。
  • 的setBindOnNewForm允许形式对象的与初始请求的人口(despites什么请求方法的类型,我们有)。据Javadoc中发现AbstractFormController“只有bindOnNewForm设置为true,那么ServletRequestDataBinder被应用于填充初始请求参数的新形式对象......”

但尽管如此,我注意到,在与一个控制器流调试器,即人口发生在方法“getErrorsForNewForm(HttpServletRequest请求)”中..这就是使用ServletRequestDataBinder类型的具体对象的地方IF setBindOnNewForm为true,并且稍后(如javadoc所述)onBindOnNewForm方法是被调用,允许程序员用自定义行为覆盖它,默认行为只是空的(再次对照AbstractFormController的代码进行检查)。

我有一个强大的感觉来验证我的想法,所以如果任何人都可以帮助我,那就没事了,除了问题解决了!

感谢所有提前!

问候。