Написать код класса контроллера (RegisterController.java) следующим образом:
File: src/main/java/net/codejava/spring/controller/RegisterController.java
package net.codejava.spring.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.codejava.spring.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value = "/register")
public class RegisterController {
@RequestMapping(method = RequestMethod.GET)
public String viewRegistration(Map<String, Object> model) {
User userForm = new User();
model.put("userForm", userForm);
List<String> professionList = new ArrayList<>();
professionList.add("Developer");
professionList.add("Designer");
professionList.add("IT Manager");
model.put("professionList", professionList);
return "Registration";
}
@RequestMapping(method = RequestMethod.POST)
public String processRegistration(@ModelAttribute("userForm") User user,
Map<String, Object> model) {
// implement your own registration logic here...
// for testing purpose:
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
System.out.println("birth date: " + user.getBirthDate());
System.out.println("profession: " + user.getProfession());
return "RegistrationSuccess";
}
}
Мы можем видеть, что этот контроллер предназначен для обработки запроса URL/регистрация:
@RequestMapping(value = "/register")
Мы реализуем два метода viewRegistration() и processRegistration() для обработки запросов GET и POST, соответственно. Методы написания обработчиков весной очень гибкие, так как мы можем свободно выбирать собственные имена методов и необходимые параметры. Давайте рассмотрим каждый метод указанного класса контроллера в деталях: viewRegistration(): в этом методе мы создаем объект модели и поместить его в модель карты с ключом «UserForm»:
User userForm = new User();
model.put("userForm", userForm);
Это создает связывание между указанным объектом с формой в представлении, возвращаемом этим методом (который является регистрационной формой). Обратите внимание, что ключ «userForm» должен соответствовать значению атрибута commandName тега.
Другим интересным моментом является то, что мы создаем список строк и поместить его в модель карты с ключом «professionList»:
List<String> professionList = new ArrayList<>();
professionList.add("Developer");
professionList.add("Designer");
professionList.add("IT Manager");
model.put("professionList", professionList);
Эта коллекция будет использоваться тег на странице Registration.jsp для того, чтобы динамический список выпадающих профессий. Наконец, этот метод возвращает имя вида («Регистрация»), которое будет отображаться на странице регистрационной формы выше. processRegistration(): этот метод обрабатывает отправку формы (через запрос POST). Важным параметром здесь является:
@ModelAttribute("userForm") User user
Это сделает объект модели, который хранится под ключ «UserForm» в карте модели, доступной для тела метода. Опять же, ключевой «userForm» должен соответствовать значению атрибута commandName тега. Когда форма отправлена, Spring автоматически связывает значения полей формы на объекте подложки в модели, таким образом, мы можем получить доступ к значениям формы, введенные пользователем с помощью этого опорного объекта, как это:
System.out.println("username: " + user.getUsername());
Для демонстрационной цели , этот метод только распечатывает детали объекта User и, наконец, возвращает имя представления страницы успеха («RegistrationSuccess»).
Пробовал это. Я получаю 'java.lang.IllegalStateException: не удается получить доступ к объекту аннотации public abstract java.lang.Class [] javax.validation.constraints.NotNull.groups() \t net.bytebuddy.description.annotation.AnnotationDescription $ ForLoadedAnnotation.getValue (AnnotationDescription.java:673) ' –
Неплохо, я не думал, что свойство« NotNull »имеет необязательные атрибуты, где трюк с лямбдой не работает. Это действительно анти-шаблон, я был на моем телефоне и ленился. Официальный способ определения аннотаций теперь включен в мой обновленный ответ выше, где вы также можете установить необязательные атрибуты. –
Похоже, что ошибка исчезла. Только сейчас проблема заключается в том, что значение не задано. Появляется Spring MVC, требующий геттер/сеттер. Не понимаю, как добавить getter/setter с ByteBuddy. Есть идеи по этому поводу? –