如何通过AJAX初始化SpringMVC表单?

时间:2012-09-05 19:18:11

标签: jquery ajax spring-mvc

例如,我想在用户点击页面中的“注册”按钮后才在Controller中执行“initRegister”方法

@Controller
public class UserController
{

    @RequestMapping(method=RequestMethod.GET, value="/initPage.do")
    public String initPage(Model model)
    {
        return "home.jsp";
    }

    @RequestMapping(method=RequestMethod.GET, value="/initRegister.do")
    @ResponseBody
    public void initRegister(Model model)
    {
        model.addAttribute("reg", new RegisterForm());
    }
}

JQuery AJAX由“注册”按钮调用:(显示一个小的弹出窗口进行注册)

$.get('initRegister.do', function()
            { 
               $('body').append('<div>'
                   +'<form:form method="POST" modelAttribute="reg" '
                   + 'commandName="reg" action="register.do">'
                   + 'name: <form:input path="name"/>'
                   + '<input type="submit" value="Submit">'
                   + '</form:form>'
                   + '</div>');
            }
      );

但是当我访问“http:// localhost:8080 /.../ initPage.do”时,我在浏览器中收到以下错误

Neither BindingResult nor plain target object for bean name 'reg' available as request attribute

该页面仅在我移动“model.addAttribute(”reg“,new RegisterForm())时有效;”到“initPage”方法。但是,在用户单击“注册”按钮之前,我不需要创建RegisterForm实例。

如何解决?

1 个答案:

答案 0 :(得分:2)

我假设此代码包含在home.jsp

$.get('initRegister.do', function()
        { 
           $('body').append('<div>'
               +'<form:form method="POST" modelAttribute="reg" '
               + 'commandName="reg" action="register.do">'
               + 'name: <form:input path="name"/>'
               + '<input type="submit" value="Submit">'
               + '</form:form>'
               + '</div>');
        }
  );

你不能这样做。呈现initPage.do时,在服务器端处理form:form标记,因为它是JSP标记,在javascript或html中没有任何意义。我很惊讶你得到了和你一样有意义的信息。

在渲染JSP时,它并不关心标签是否在HTML,javascript中,无论在哪里。如果它看到JSP标记,它将执行适当的处​​理。尝试将JSP代码呈现到html页面以响应AJAX调用只是不起作用,因为JSP标记的处理必须在服务器上进行。

通常,您需要以JSON格式(或我猜想的XML)返回一个对象,并在javascript中使用它。看看jQuery's get command的文档。成功处理程序的函数有一个'data'参数,它将包含来自Ajax调用的响应。为了实现这一点,您应该将initRegister的返回类型从void更改为其他内容。您可以使用Jackson进行从POJO到JSON的转换。