Я новичок в Spring MVC и thymeleaf. Написал работающий код, но есть подозрение, что я использую костыли в контроллере и форме (результат поверхностного знакомства с thymeleaf).
Есть класс Person
для хранения данных о пользователе, у него есть поля типа Set<Address>
и Set<PhoneNumber>
. Для их заполнения я использую геттеры в контроллере (метод add()
) - и кажется, это не очень правильный способ. Есть ли какой другой способ заполнения этих полей данными?
Класс Person (геттеры и сеттеры и импорты я везде опустил):
@Entity
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String lastName;
@NotNull
private String firstName;
private String patronymic;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "person_phone_numbers", joinColumns = @JoinColumn(name = "person_id"))
private Set<PhoneNumber> phoneNumbers = new HashSet<>();
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "person_addresses", joinColumns = @JoinColumn(name = "person_id"))
@AttributeOverrides({
@AttributeOverride(name = "addressLine1", column = @Column(name = "house_number")),
@AttributeOverride(name = "addressLine2", column = @Column(name = "street"))
})
private Set<Address> addresses = new HashSet<>();
public Person() {
}
public Person(String lastName, String firstName, String patronymic,
Set<PhoneNumber> phoneNumbers, Set<Address> addresses) {
this.lastName = lastName;
this.firstName = firstName;
this.patronymic = patronymic;
this.phoneNumbers = phoneNumbers;
this.addresses = addresses;
}
Класс PhoneNumber:
@Embeddable
public class PhoneNumber {
@Size(max = 30)
private String type;
@NotNull
@Size(max = 10)
private String number;
public PhoneNumber() {
}
public PhoneNumber(@Size(max = 30) String type, @NotNull @Size(max = 10) String number) {
this.type = type;
this.number = number;
}
Класс Address:
import javax.persistence.Embeddable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Embeddable
public class Address {
@NotNull
@Size(max = 100)
private String addressLine1;
@NotNull
@Size(max = 100)
private String addressLine2;
@NotNull
@Size(max = 100)
private String city;
@NotNull
@Size
private String region;
@NotNull
@Size
private String country;
@NotNull
@Size
private String zipCode;
public Address() {
}
public Address(@NotNull @Size(max = 100) String addressLine1, @NotNull @Size(max = 100) String addressLine2,
@NotNull @Size(max = 100) String city, @NotNull @Size String region,
@NotNull @Size String country, @NotNull @Size String zipCode) {
this.addressLine1 = addressLine1;
this.addressLine2 = addressLine2;
this.city = city;
this.region = region;
this.country = country;
this.zipCode = zipCode;
}
Контроллер:
@Controller
public class MainController {
@Autowired
private PersonRepository personRepository;
@GetMapping("/main")
public String main(Map<String, Object> model) {
Iterable<Person> persons = personRepository.findAll();
model.put("persons", persons);
return "main";
}
@PostMapping("/main")
public String add(@ModelAttribute Person person, @ModelAttribute PhoneNumber phoneNumber,
@ModelAttribute Address address, Model model) {
person.getPhoneNumbers().add(phoneNumber);
person.getAddresses().add(address);
personRepository.save(person);
Iterable<Person> persons = personRepository.findAll();
model.addAttribute("persons", persons);
return "main";
}
Код вьюхи:
<html xmlns:th="http://www.w3.org/1999/xhtml">
<body>
<div>
<h2>Введите данные контакта</h2>
<form method="post">
<input type="text" name="lastName" placeholder="Фамилия"/>
<input type="text" name="firstName" placeholder="Имя">
<input type="text" name="patronymic" placeholder="Отчество">
<p>
<input type="text" name="type" placeholder="Тип"/>
<input type="text" name="number" placeholder="Номер">
</p>
<p>
<input type="text" name="addressLine1" placeholder="Номер дома"/>
<input type="text" name="addressLine2" placeholder="Улица"/>
<input type="text" name="city" placeholder="Город"/>
<input type="text" name="region" placeholder="Регион"/>
<input type="text" name="country" placeholder="Страна"/>
<input type="text" name="zipCode" placeholder="Код"/>
</p>
<button type="submit">Добавить</button>
</form>
</div>
<div><h2>Список контактов </h2></div>
<div>
<p th:each="person : ${persons}"
th:text="${person.id} + '. ' + ${person.lastName} + ' ' + ${person.firstName} +
' ' + ${person.patronymic} + '. Тел.: ' + ${person.phoneNumbers} + ${person.addresses}"> PERSON
TEST </p>
</div>
</body>
</html>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий...
Есть адаптер который генерирует и обрабатываете клики по елементам, из него вызывается при нажатии на картинку fragmentDialog в котором есть edittextМы...
Не получается реализовать переход из фрагмента в активити по кнопкеПерерыв весь интернет, решила попросить о помощи, т
как реализовать общение между двумя и больше компьютеров? Читал что нужно использовать сокеты, но возможно есть и другой вариант? Раньше...