我在我的应用程序中使用SimpleFormController
来处理表单子目录。我遗漏的一件事是传递的请求对象onSubmit(request,response..)
与formBackingObject(..)
收到的初始请求对象不同,可能是因为它再次是来自Web的新请求。
我只想使用onSubmit(..)
中formBackingObject(..)
中我可以访问的formBackingObject(HttpServletRequest request)`
中的请求对象中的相同参数。
我可以存储它们并通过jsp中的隐藏字段传递,但我想尝试一些优雅的方法。
有没有办法实现这个目标?
编辑:
我压倒一切
onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
和
formbackingObject(..)
我班上的方法。
对于初始视图onSubmit(..)
将被调用,我将从请求对象中获得一些变量,然后如果用户提交表单formbackingObject(..)
将被调用,那么我将有另一个请求对象不同于我在request.getParameter()
收到的那个。
onSubmit(..)
种类
...)以便我可以使用它们
{{1}}没有发送它们
回来&通过隐藏的领域?'
答案 0 :(得分:2)
当用户发出初始表单视图请求时,将调用formBackingObject()
方法。当用户提交表单时,这是一个完全独立的HTTP请求,即调用onSubmit()
方法时。
如果要保存第一个HTTP请求的状态,以便在第二个HTTP请求中可用,那么最好的选择可能是将其保存在HTTP会话中。
例如:在您的formBackingObject()
方法中:
HttpSession session = request.getSession();
session.setAttribute("param1", request.getParameter("param1"));
session.setAttribute("param2", request.getParameter("param2"));
并在您的onSubmit()
方法中:
HttpSession session = request.getSession();
String param1 = (String) session.getAttribute("param1");
String param2 = (String) session.getAttribute("param2");
答案 1 :(得分:1)
formBackingObject()
应设置在下次提交时提供给onSubmit()
的“命令”对象。命令Object只是一个POJO,您可以根据需要创建并添加属性。
通常,您使用服务调用(最终来自数据库)在屏幕上显示一些数据来填充命令Object,但没有什么可以阻止您将formBackingObject()
中请求中的数据放入命令对象,并在调用onSubmit()
时再将其拉回。这样做的好处是,您最终不会在会话中浮动cruft。
例如,在MyCommand
中formBackingObject()
中的请求中添加一个布尔值:
protected Object formBackingObject(HttpServletRequest request)
{
boolean someBoolean = ServletRequestUtils.getBooleanParameter(request, "someBoolean");
MyCommand myCommand = new MyCommand();
myCommand.setSomeBoolean(someBoolean);
// optionally get some data from the DB to set on myCommand here...
return myCommand;
}
然后在onSubmit()
:
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
{
MyCommand myCommand = (MyCommand) command;
if (myCommand.getSomeBoolean()) {
System.out.println("someBoolean was set in formBackingObject!");
}
}
请注意,myCommand仅对会话可见(因此其他登录用户无法看到它,并且在会话结束时会被销毁)。