例如,我想在用户点击页面中的“注册”按钮后才在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实例。
如何解决?
答案 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的转换。