Spring SimpleFormController onSubmit请求参数

时间:2010-01-25 06:46:39

标签: java spring spring-mvc

我在我的应用程序中使用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}}没有发送它们 回来&通过隐藏的领域?'

2 个答案:

答案 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

例如,在MyCommandformBackingObject()中的请求中添加一个布尔值:

    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仅对会话可见(因此其他登录用户无法看到它,并且在会话结束时会被销毁)。