【问题标题】:Binding multiple objects into JSP form:form tag将多个对象绑定到 JSP form:form 标记中
【发布时间】:2018-05-20 11:57:15
【问题描述】:

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

  1. 用户信息
  2. 账户信息

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 的字段应该与 UserAccount 模型分开处理。

结果如下:

  1. 没有编译错误
  2. 没有运行时错误
  3. /signup-form URL 正在打开 - 这里也没有问题
  4. 我填写了由用户(名字、中间名和姓氏)和帐户信息(电子邮件/用户名和密码)组成的表格并提交按钮
  5. 没有操作,没有页面加载,没有错误,没有发生任何变化..上一页 - 注册表保持原样

一些检查 WORKAROUNDS 没有解决:

  1. 我尝试在控制器中使用一个模型并将 UserAccount 对象都封装到其中
  2. 我尝试只使用一个包含上述 5 个字段的单个表单,但表单中有 2 个 modelAttribute 元素。喜欢:modelAttribute="user" modelAttribute="account"
  3. 我还尝试了一个由子表单组成的表单,一个用于User,一个用于Account。通过这种方式,我试图处理父表单,希望 2 个子表单会自动找到要绑定的模型,因为我有 2 个模型供他们使用
  4. 当然,我已经尝试在 StackOverflow 中对类似问题的答案有所帮助。他们都没有帮助

我想要一个代码更改最少的解决方案,如果这很容易获胜的话。

编辑:希望此编辑将有助于缩小问题的根源,以便从 signup-form.jsp 中排除与 Account 信息相关的以下部分,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> 
--%>

感谢您的提示和头脑风暴!

最好的, 西穆尔

【问题讨论】:

    标签: spring-mvc jsp-tags


    【解决方案1】:

    我认为您的解决方法尝试是正确的,但可能错过了一些将它们联系在一起的细节。您只需要一个&lt;form:form&gt; 和一个模型,其中包含两组字段,可以是子对象,也可以是直接的。

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

    例如

    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>
    

    【讨论】:

    • 感谢您的快速回答!好的,我按照你上面建议的方法。现在:我有一个 SignupModel.java 类。这聚合了 User 和 Account 类,具有 User 和 Account 类的字段的所有 getter 和 setter。我已经相应地调整了 signup-form.jsp。所以现在只有一种形式:具有单一模型参考的形式:.. modelAttribute="signupModel"
    • 更改后的结果:- 没有编译错误,但存在运行时错误“bean 类 [tech.devhq.account.model.SignupModel] 的无效属性 'firstName':属性 'firstName' 的获取器抛出异常;嵌套异常是 java.lang.reflect.InvocationTargetException"
    • 我想如果我从 User 和 Account 类中复制粘贴所有内容并将所有这些放在 SignupModel 中,结果应该是“好的”。但这听起来更脏。除了在 SignupModel 类中再次使用相同的 User 和 Account 的 getter 和 setter 之外,还有其他方法吗?
    • 所以SignupModel 有一个public User getUser() {} 方法,而你的JSP 使用&lt;input path="user.firstName"&gt;?这应该就是全部了。该错误看起来您仍在尝试直接从 SignupModel 的顶层获取 firstName
    • 显然我上面的猜测是正确的,因为当我添加例如将 firstName 属性添加到最近创建的类 - SignupModel,我解决了第一个问题,现在中间名出现运行时错误并显示相同的消息。所以我应该在 SignupModel 中包含所有字段,这不是一个好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多