【问题标题】:How to init a SpringMVC form by AJAX?如何通过 AJAX 初始化 SpringMVC 表单?
【发布时间】:2012-09-06 21:42:42
【问题描述】:

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

如何解决?

【问题讨论】:

  • 我猜你真的别无选择。在你的 ajax 中,你引用的是 modeAttribute="reg" 所以你得到这个错误是正常的。当 ajax 在您的页面中执行时,您没有任何对象“reg”
  • 嗨@rptmat57,您误解了错误。 AJAX 代码由 CALLBACK 函数中的“注册”按钮调用。当我在浏览器地址栏中输入 URL localhost:8080/.../initPage.do 并按 Enter 时出现错误。
  • 如果 form:form 是服务器端标签,您希望它如何工作?尝试从客户端修改 jsp 是个坏主意。无论如何,您可以使用 Spring MVC 呈现表单,然后使用 AJAX 帖子提交生成的 html 表单。
  • 嗨@BorisTreukhov,你也误解了代码。我给出的示例是当用户单击“注册”按钮时显示一个弹出窗口。但是我不想在用户单击“注册”按钮之前初始化表单实例。那些HTML代码只是为了显示一个弹出对话框,不管是静态html还是动态html,我需要的是使用AJAX初始化Form实例然后显示弹出窗口,我不想初始化所有表单随着页面加载,因为在我的页面中我有许多不同的按钮,每个按钮使用不同的 Form 类
  • @BorisTreukhov 不是误解代码的人...

标签: jquery ajax spring-mvc


【解决方案1】:

我假设这段代码包含在 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>');
        }
  );

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

在渲染 JSP 时,它不关心标签是 HTML、javascript 还是任何地方。如果它看到一个 JSP 标记,它将执行适当的处​​理。试图将 JSP 代码呈现到 html 页面中以响应 AJAX 调用是行不通的,因为 JSP 标记的处理必须在服务器上进行。

通常您会希望以 JSON 格式(或者我猜是 XML)返回一个对象并在 javascript 中使用它。查看jQuery's get command 的文档。您的成功处理程序函数有一个“数据”参数,它将包含来自您的 Ajax 调用的响应。为了使它起作用,您应该将initRegister 的返回类型从void 更改为其他类型。您可以使用 Jackson 进行 POJO 到 JSON 的转换。

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 2013-09-16
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多