Я использую весеннюю загрузку 2.1.2...
Интересно, существует ли существующая концепция или функция в весенней загрузке для создания общей страницы добавления или редактирования для общих объектов с CrudRepository? Я хочу не писать весь шаблонный код снова и снова для добавления или редактирования страниц в тимелеафе и вместо этого использовать общую страницу.
Итак, что я хотел бы сделать вместо этого, это общая форма, подобная этой:
<form action = "#" th:action = "@{/edit-$entityName}" th:object = "${entity}" method = "post">
<input type = "hidden" th:field = "*{id}" id = "id"/>
<!-- iterating over each field and creating an input form element -->
<div class = "form-group" th:each = "field: ${fields}">
<label for = "${field}" th:text = "${field}"/>
<input type = "text" th:value = "${entity['name']}" th:attr = "id=#{${field}}, placeholder=#{$field}" class = "form-control">
<span th:if = "${#fields.hasErrors($field)}" th:errors = "*{$field}"></span>
</div>
<button type = "submit" class = "btn btn-default">save</button>
</form>
С контроллером, который добавляет поля:
@Controller
public class EntityController {
@Autowired
private EntityService service;
@RequestMapping("/edit-entity/{id}")
public String editProject(Map<String, Object> model, @PathVariable("id") Integer id) {
Optional<MyEntity> byId = service.getById(id);
model.put("entity", byId.orElse(new MyEntity()));
model.put("entityName", "myEntity");
List<String> fields = new ArrayList<>();
for (Field field : MyEntity.class.getDeclaredFields()) {
if (!field.getName().equals("id"))
fields.add(field.getName());
}
model.put("fields", fields);
return "edit-page";
}
}
Подробно: У меня есть простой объект "пользователь"
@Entity
@Table(name = "user_tbl")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String email;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Чтобы добавить или отредактировать этот пользовательский объект, я создал следующую форму (исключая код контроллера и некоторую разметку вокруг формы):
<form action = "#" th:action = "@{/edit-user}" th:object = "${user}" method = "post">
<input type = "hidden" th:field = "*{id}" id = "id"/>
<div class = "form-group">
<label for = "name">Name</label>
<input type = "text" th:field = "*{name}" id = "name" placeholder = "Name" class = "form-control">
<span th:if = "${#fields.hasErrors('name')}" th:errors = "*{name}"></span>
</div>
<div class = "form-group">
<label for = "email">Email</label>
<input type = "text" th:field = "*{email}" id = "email" placeholder = "email" class = "form-control">
<span th:if = "${#fields.hasErrors('email')}" th:errors = "*{email}"></span>
</div>
<div class = "form-group">
<label for = "age">Alter</label>
<input type = "text" th:field = "*{age}" id = "age" placeholder = "age" class = "form-control">
<span th:if = "${#fields.hasErrors('age')}" th:errors = "*{age}"></span>
</div>
<button type = "submit" class = "btn btn-default">save</button>
</form>
Если я собираюсь создать другой объект, другой пользователь, я собираюсь скопировать и вставить все это и, возможно, изменить некоторые имена или поля или что-то еще, но они полностью похожи друг на друга...
Есть ли способ сделать это один раз и повторно использовать для всех других моих объектов, которые я определю?
Привет Ахмет, спасибо за ваш ответ. Да, ты прав, и я думал об этом. Я мог бы добиться этого с помощью (пользовательских) аннотаций. Тем не менее, я не хочу заходить так далеко. Пока я просто спрашиваю о существующих концепциях или существующих стратегиях :)




Это можно сделать, но это трудно сделать. Написание универсального кода для всех типов объектов обременительно, потому что, во-первых, когда вы выполняете итерацию по всем полям bean-компонента для отображения элемента ввода, вы хотите отображать различные типы элементов ввода (иногда текстовое поле, иногда флажок, иногда поле со списком и т. д.), что трудно, если вы не поддерживаете тип ввода с полем.