Dieses Jahr war ich an Projekten beteiligt, die Spring Boot verwenden, und ich habe die Erkenntnisse organisiert, die ich über Thymeleaf und Enum gewonnen habe.
Bei Spring oder Spring Boot ist es üblich, Thymeleaf mit der Template-Engine zu verwenden. Es ist üblich, enum zu verwenden, um den Wert und den Anzeigenamen des Auswahlfelds des Eingabeformulars zu verwalten.
Auszug aus https://www.baeldung.com/thymeleaf-enums, aber wenn Sie googeln, sehen Sie einige Beispiele wie das folgende.
<select name="color">
<option th:each="colorOpt : ${T(com.baeldung.thymeleaf.model.Color).values()}"
th:value="${colorOpt}" th:text="${colorOpt.displayValue}"></option>
</select>
Es gibt auch ein solches Beispiel bei der Beurteilung, ob es sich um eine bestimmte Aufzählung handelt, indem der Anfangswert beurteilt wird.
<div th:if="${widget.color == T(com.baeldung.thymeleaf.model.Color).RED}">
Ich sehe es oft, aber wenn es um das Beste geht, kann ich nichts sagen.
Der Punkt ist, dass etwas hereinkommt, das nichts mit der Vorlage zu tun hat, was sich negativ auf die Lesbarkeit und Wartbarkeit auswirkt. Wenn Sie etwas machen möchten, das vorerst funktioniert, ist diese Methode in Ordnung, aber ein wenig schmerzhaft.
Grundsätzlich ist es eine gute Idee, das, was Sie in der Vorlage verwenden, in enum zu implementieren. Anstatt direkt von der Vorlage aus aufzurufen, ist es besser, das Formular so zu ändern, dass die erforderliche Instanz vom Controller übergeben wird.
Java enum hat eine implizite Methode namens "public static T [] values ()". Verwenden Sie diese Option, um alle Elemente aufzulisten. (Apropos Klassiker, es ist eine klassische Geschichte.)
public enum UserStatus {
ACTIVE(1, "Wirksamkeit"),
INACTIVE(0, "Ungültig"),
PENDING(2, "in Wartestellung"),
FORBIDDEN(3, "Zwangsstopp")
;
private final int value;
private final String viewName;
private UserStatus(int value, String viewName) {
this.value = value;
this.viewName = viewName;
}
public int getValue() {
return this.value;
}
public String getViewName() {
return this.viewName;
}
}
@Controller
public class SampleController
@RequestGetMapping
public ModelAndView index() {
ModelAndView model = new ModelAndView();
model.setAttribute("statusList", UserStatus.values());
return model;
}
<select name="status">
<option th:each="status : statusList}"
th:value="${status.value}" th:text="${status.viewName}">
</option>
</select>
Die obige Methode ist unpraktisch, um den Wert als Aufzählung zu erhalten.
enum hat implizit die Methoden name ()
undvalueOf (String name)
deklariert.
Der Name für "name ()" wird zurückgegeben, und "valueOf (String name)" gibt die entsprechende Instanz zurück, wenn die Namen übereinstimmen. Der Frühling wird diese für Sie verwenden.
<select name="status">
<option th:each="status : statusList}"
th:value="${status.name()}" th:text="${status.viewName}">
</option>
</select>
public class NewUserForm {
private UserStatus status;
// ...
}
@RequestPutMapping
public ModelAndView create(NewUserForm form) {
ModelAndView model = new ModelAndView();
// ...
return model;
}
Anschließend kann die Auswahl im Formular einer Aufzählung zugeordnet und empfangen werden.
Es gibt eine Möglichkeit, eine Methode namens isXXX zu enum hinzuzufügen.
public enum UserStatus {
// ...
public boolean isActive() {
return this == ACTIVE;
}
public boolean isForbidden() {
return this == FORBIDDEN;
}
}
<div th:if="${status.isForbidden()}">
This user is forbidden.
</div>
Diese isXXX-Methode ist nicht nur für Vorlagen nützlich, sondern auch zum Schreiben von Geschäftslogik. Wenn Sie beispielsweise nur gültige Benutzer eingrenzen möchten, sieht dies folgendermaßen aus.
public class User {
//...
private final UserStatus status;
public UserStatus getStatus() {
return this.status
}
}
List<User> users = ...
List<User> activeUsers = users.stream()
.filter(x -> x.getStatus().isActive())
.collect(Collectors.toList());
Möglicherweise finden Sie die Best Practices in Ihrer Nähe oder nicht. Es ist auch selten herauszufinden, ob die durch die Suche gefundene Methode für Ihre aktuelle Situation geeignet ist oder nicht. Vorlagen sind leicht in viele Interessen einzubeziehen, daher müssen Sie bei der Implementierung viele Entscheidungen treffen.
Recommended Posts