将多个对象绑定到JSP表单:form标签

时间:2018-05-20 11:57:16

标签: spring-mvc jsp-tags

我有一个JSP singup-form.jsp ,其中基本上包含两种信息:

  1. 用户信息
  2. account infos
  3. singup-form.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
            <title>Sign up</title>
        </head>
    <body>
        <h1>Sign up</h1>
        <form:form action="processSignup" method="GET" modelAttribute="user">
            <p>*First name</p>
            <form:input path="firstName"/>
    
            <p>Middle name</p>
            <form:input path="middleName"/>
    
            <p>*Last name</p>
            <form:input path="lastName"/>
    
            <form:form method="GET" modelAttribute="account">
                <p>*Email</p>
                <form:input path="userName"/>
    
                <p>*Password</p>
                <form:password path="password"/>
            </form:form>
    
            <br><br>
            <input type="submit" value="Sign Up" />
    
        </form:form>    
    </body>
    </html>
    

    当加载 signup-form.jsp 时,我通过openSignupForm(Model userModel, Model accountModel)方法在 SignupController.java 中创建2个单独的模型:

    package tech.devhq.account.controller;
    
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import tech.devhq.account.model.Account;
    import tech.devhq.account.model.User;
    
    @Controller
    @Scope("singleton")
    public class SignupController {
    
        @RequestMapping("/signup")
        public String openSignupForm(Model userModel, Model accountModel) {
            User user = new User();
            userModel.addAttribute("user", user);
    
            Account account = new Account();
            accountModel.addAttribute("account", account);
    
            return "signup-form";
        }
    
        @RequestMapping("/processSignup")
        public String processSignupForm(@ModelAttribute("user") User user, @ModelAttribute("account") Account account) {
            return "welcome";
        }   
    }
    

    提交表单时,我想将两个模型都传递到 welcome.jsp 页面,以便打印出相应的字段名称。上面控制器类的方法processSignupForm(@ModelAttribute("user") User user, @ModelAttribute("account") Account account)应该这样做。

    此处要求 signup-form.jsp 的字段应与用户帐户模型分开处理。

    结果如下:

    1. 没有编译错误
    2. 没有运行时错误
    3. / signup-form 网址正在开启 - 此处也没有问题
    4. 我填写由用户(名字,中间名和姓氏)和帐户信息(电子邮件/用户名和密码)组成的表格并提交按钮
    5. 没有操作,没有页面加载,没有错误,没有发生任何变化..上一页 - 注册表格保持原样
    6. 部分已检查替代 解决

      1. 我尝试在控制器中安装一个模型并将用户帐户对象封装到其中
      2. 我尝试只有一个表单,上面有5个提到的字段,但表单中有2个 modelAttribute 元素。例如: modelAttribute =&#34; user&#34; modelAttribute =&#34; account&#34;
      3. 此外,我还尝试了一个由子表单组成的表单,一个用于用户,一个用于帐户。通过这种方式,我试图处理父表单,希望2个子表单将自动找到他们的模型绑定,因为我有2个模型为它们
      4. 当然,我试图在StackOverflow中围绕类似问题获得答案。他们都没有帮助
      5. 我希望找到一个代码更改量最小的解决方案,如果这是一个轻松的胜利。

        编辑:希望此编辑有助于缩小问题的根源,以便从 signup-form.jsp 中排除以下与帐户信息相关的部分,< strong> WORKS 很好,但是当然我没有获得有关帐户的任何信息,只是关于 welcome.jsp 页面上的用户:

        <%-- 
        <form:form method="GET" modelAttribute="account">
                <p class="field-name">*Email</p>
                <form:input path="userName"/>
        
                <p class="field-name">*Password</p>
                <form:password path="password"/>
            </form:form> 
        --%>
        

        感谢提示和头脑风暴!

        贝斯茨, Seymur

1 个答案:

答案 0 :(得分:1)

我认为你在使用你的解决方法时处于正确的轨道上,但可能错过了将它们捆绑在一起的一些细节。您只需要一个<form:form>和一个带有两组字段的模型,可以是子对象,也可以是直接。

但是如果您使用子对象,则需要将您的JSP字段命名为user.firstName

e.g。

public class MyModel {
    private User user;
    private Account account;
    ... getters & setters
}

<form:form ... modelAttribute="myModelBean">
    ...
    <form:input path="user.firstName"/>
    ...
    <form:input path="account.userName"/>
    ...
</form:form>