2015-03-09 5 views
1

Я недавно начал работать с JSP в Spring Framework, и я попытался реализовать страницу обработки формы.Spring Framework JSP Обработка формы: @ModelAttribute

Я создал базовую страницу формы, которая вводит пользователя, и после того, как они попали в submit, они получают страницу подтверждения с введенным им вводом.

Эти два отображенные методы, которые я имею в своем классе контроллера:

import java.util.Map; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
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 org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

import com.redcup.model.Person; 
import com.redcup.model.User; 
import com.redcup.test.ServletTestBean; 

import javax.annotation.PostConstruct; 

@Controller 
public class RedCupController { 

    private final Logger logger = LoggerFactory.getLogger(RedCupController.class); 

    @PostConstruct 
    public void intializeComplete() { 
     logger.info("Controller initialized"); 
    } 

    @RequestMapping(method=RequestMethod.GET, value="/health") 
    @ResponseBody 
    public String getHealth() 
    { 
     logger.info("GET /health invoked."); 

     return "hello world!"; 
    } 

    @RequestMapping(method=RequestMethod.GET, value="/welcome") 
    public String getWelcome(Model model) { 
     User user = new User(); 
     model.addAttribute("userform", user); 
     return "welcome"; 
    } 

    @RequestMapping(method=RequestMethod.POST, value="/confirmation") 
    public String getConfirmation(@ModelAttribute("userform") User user, @ModelAttribute("pew") User user2, 
           @ModelAttribute("whomp")Person person, Model model) { 

     user = getUserForm(); 
     user2 = getUserForm2(); 

     System.out.println("hello: " + user); 
     System.out.println("goodbye: " + user2); 

     System.out.println("user: " + user.getFirstName()); 
     System.out.println("user: " + user.getLastName()); 
     System.out.println("user: " + user.getEmail()); 
     System.out.println("user: " + user.getAge()); 

     System.out.println("user2: " + user2.getFirstName()); 
     System.out.println("user2: " + user2.getLastName()); 
     System.out.println("user2: " + user2.getEmail()); 
     System.out.println("user2: " + user2.getAge()); 

     System.out.println("person: " + person.getName()); 
     System.out.println("person: " + person.getNum2()); 

     model.addAttribute("user", user); 
     model.addAttribute("user2", user2); 
     model.addAttribute("person", person); 

     return "confirmation"; 
    } 

    @ModelAttribute("userform") 
    public User getUserForm() { 
     return new User(); 
    } 

    @ModelAttribute("userform2") 
    public User getUserForm2() { 
     return new User(); 
    } 
} 

Класс пользователя для модели:

общественного класса пользователя {

private String firstName; 
private String lastName; 
private String email; 
private int age; 

public User() { 
    firstName = "John"; 
    lastName = "Smith"; 
    email = "default email"; 
    age = 1; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getEmail() { 
    return email; 
} 

public void setAge (int age) { 
    this.age = age; 
} 

public int getAge() { 
    return age; 
} 

}

И ниже - страница с информацией о форме welcome.jsp:

<!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>Insert title here</title> 
</head> 
<body> 
    <div align="center"> 

     <form:form action="confirmation" method="post" commandName="userform"> 
      <form:input path="firstName"/> 
      <form:input path="lastName"/> 
      <form:input path="email"/> 
      <form:input path="age"/> 
      <input type="submit" value="Press this to submit"/> 
     </form:form> 
    </div> 
</body> 
</html> 

В моем обработчике контроллера: getConfirmation У меня есть два параметра (пользователь и user2) .Отель часть я путать о том, что когда я нажимаю представить в моем welcome.jsp, пользователь и user2 заполняются точно такой же значения из модели в welcome.jsp. Я не уверен, почему это происходит, поскольку я думал, что @ModelAttribute присваивает соответствующий атрибут модели указанному параметру (т. Е. Пользователь получит модель под пользовательской формой commandName).

Но мне кажется, что аннотация @ModelAttribute ничего не делает. Параметры пользователя и пользователя2 будут заполнены теми же значениями поля (что я ввел в форму), когда @ModelAttributes имеют разные ключи (т.е. пользовательскую форму vs userform2), и когда я даже удаляю аннотации @ModelAttribute, пользователь и пользователь2 будут STILL быть с теми же значениями поля.

Может кто-нибудь объяснить, почему это происходит и что именно делает аннотация @ModelAttribute?

Заранее благодарен!

EDIT

Я создал класс UserWrapper за предложение Алана Хэя:

общественного класса UserWrapper {

private User user1; 
    private User user2; 

    public User getUser1() { 
     return user1; 
    } 

    public User getUser2() { 
     return user2; 
    } 

    public void setUser1(User user) { 
     user1 = user; 
    } 

    public void setUser2(User user) { 
     user2 = user; 
    } 

    public void setUser1FirstName(String firstName) { 
     user1.setFirstName(firstName); 
    } 

    public String getUser1FirstName() { 
     return user1.getFirstName(); 
    } 

    public void setUser2FirstName(String firstName) { 
     user2.setFirstName(firstName); 
    } 

    public String getUser2FirstName() { 
     return user2.getFirstName(); 
    } 
} 

и обновил свой welcome.jsp с помощью следующей формы:

<form:form action="confirmation" method="post" commandName="userform"> 
     <form:input path="user1.firstName"/> 
     <form:input path="user1.lastName"/> 
     <form:input path="user1.email"/> 
     <form:input path="user1.age"/> 
     <input type="submit" value="Press this to submit"/> 
    </form:form> 

ответ

2

Это ожидаемое поведение.

Важно отметить, что если вы посмотрите на сгенерированный HTML вашей страницы редактирования вы увидите, что есть входы, как:

<input name="firstName" type="text" value="user"> 
<input name="lastName" type="text" value="7702"> 

именно. нет ничего явно, чтобы связать его с каким-либо конкретным экземпляром объекта модели. Теперь, при отправке формы, обработчик Spring рассмотрит то, что вы указали в качестве атрибутов модели в методе обработчика, и попытается связать представленные параметры с соответствующими полями в этих объектах модели независимо от квалификаторов - это то, что вы видите.

Чтобы получить поведение вы ожидаете, вам нужно будет обернуть два атрибутов модели что-то вроде ниже:

Создать оболочку как форма подложки объекта:

public class UserWrapper(){ 

    private User user1; 
    private User user2; 

    public User getUser1(){ 
     return user1; 
    } 

    public User getUser2(){ 
     return user2; 
    } 
} 

специфически связываются только поля формы в Пользователя1

<form:form action="confirmation" method="post" commandName="userWrapper"> 
    <form:input path="user1.firstName"/> 
    <form:input path="user1.lastName"/> 
    <form:input path="user1.email"/> 
    <form:input path="user1.age"/> 
    <input type="submit" value="Press this to submit"/> 
</form:form> 

Обновление обработчика:

@RequestMapping(method=RequestMethod.POST, value="/confirmation") 
public String getConfirmation(@ModelAttribute UserWrapper wrapper) { 

    System.out.println("user: " + wrapper.getUser1().getFirstName()); 
    System.out.println("user: " + wrapper.getUser2().getFirstName()); 

    return "confirmation"; 
} 
+0

Да, конечно. Сожалею. –

+0

Должен ли возвращаемый тип getUserForm() и getUserForm2() быть пользователем? Я изменил тип возврата на User и в getConfirmation я добавил эти две строки: user = getUserForm(); user2 = getUserForm2(); Я все еще получал одинаковые значения полей для обоих объектов, а объекты user и user2 не отражают вход, который я сделал в welcome.jsp; они просто показывают значения по умолчанию из конструктора User. – user7702

+0

Вам нужно будет опубликовать полный контроллер и ваш пользовательский класс. –

Смежные вопросы