Привязка нескольких объектов к форме JSP: тег формы - PullRequest
0 голосов
/ 20 мая 2018

У меня есть JSP singup-form.jsp , который включает в себя в основном 2 вида информации:

  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 , я создаю 2 отдельные модели в моем RegistrationController.java через openSignupForm(Model userModel, Model accountModel) метод:

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 обрабатывались отдельно с User и Учетная запись модели.

РЕЗУЛЬТАТ выглядит следующим образом:

  1. Нет ошибки компиляции
  2. Нет времени выполненияошибка
  3. / signup-form Открывается URL - здесь тоже нет проблем
  4. Я заполняю форму, состоящую из пользователя (имя, отчество и фамилияимя) и информацию об учетной записи (адрес электронной почты / имя пользователя и пароль) и отправьте кнопку
  5. Без действий, без загрузки страницы, без ошибок, без изменений .. Предыдущая страница - форма регистрации остается прежней

Некоторые проверили РАБОЧИЕ ТУРЫ , которые сделали НЕ разрешение:

  1. Я попытался иметь одну единственную модель в контроллере и инкапсулировать обе пользователь и учетная запись объекты в него
  2. я пытался получитьтолько одна форма с 5 упомянутыми выше полями, но 2 modelAttribute элемент в форме.Например: modelAttribute = "user" modelAttribute = "account"
  3. Также я попытался создать форму, состоящую из подформ, одна для User и один раз для Счет соответственно.Таким образом, я пытался обработать родительскую форму с надеждой, что 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> 
--%>

Спасибо за советы и мозговой штурм!

Bests, Сеймур

1 Ответ

0 голосов
/ 20 мая 2018

Я думаю, что вы были на правильном пути с вашими попытками обхода, но, возможно, пропустили некоторые детали, которые связали все это вместе.Вам нужна только одна <form:form> и одна модель с обоими наборами полей в ней, либо с подобъектами, либо напрямую.

Но если вы используете подобъекты, вам нужно назвать поля 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>
...