Страница редактирования общей сущности Spring Boot Thymeleaf

Я использую весеннюю загрузку 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-компонента для отображения элемента ввода, вы хотите отображать различные типы элементов ввода (иногда текстовое поле, иногда флажок, иногда поле со списком и т. д.), что трудно, если вы не поддерживаете тип ввода с полем.

Ahmet 22.02.2019 09:13

Привет Ахмет, спасибо за ваш ответ. Да, ты прав, и я думал об этом. Я мог бы добиться этого с помощью (пользовательских) аннотаций. Тем не менее, я не хочу заходить так далеко. Пока я просто спрашиваю о существующих концепциях или существующих стратегиях :)

Marcel 22.02.2019 10:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
624
0

Другие вопросы по теме