[JAVA] Super einfache Möglichkeit, Enum mit JSP zu verwenden

1. Zuallererst

Im Gegensatz zu Konstanten ist Java Enum typsicher und ein praktischer Datentyp, der mehrere Daten enthalten kann. Daher können Sie den Code wie Master und seine Bedeutung gemeinsam definieren. Dieses Mal möchte ich erklären, wie Listenfelder und Kontrollkästchen mithilfe der Aufzählung in JSP einfach angezeigt werden können. Web-Apps basieren auf Spring-Boot (Spring MVC, TERASOLUNA 5.x).

2. Definition der Aufzählung

Definieren Sie die in diesem Beispiel verwendete Aufzählung. Ich habe eine Aufzählung mit den Daten des "Code" -Felds von int und des "Label" -Felds erstellt, die angezeigt werden sollen. Wenn Sie lombok nicht verwenden, definieren Sie auch den Konstruktor und den Setter explizit.

Status.java


package com.example.demo;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum Status {

    APPROVAL(1, "Die Genehmigung"),
    DENIAL(2, "Verweigerung"),
    WITHDRAWAL(3, "Rückzug");

    int code;
    String label;

    //★ Punkt 1
    public String getName() {
        return name();
    }
}

** ★ Punkt 1 ** enum hat eine Methode namens "name ()", aber wir möchten als Getter darauf zugreifen, also definieren wir eine umschlossene "getName ()" -Methode. Dies ist eine Maßnahme zur Verwendung von Enum mit JSP.

3. Definition der Formularklasse

Definiert eine Formularklasse, in der die eingegebenen Daten gespeichert werden.

DemoForm.java


public class DemoForm implements Serializable {

    //★ Punkt 2
    @NotNull
    Status status;

    // ommited
}

** ★ Punkt 2 ** Definieren Sie die definierte Aufzählung so wie sie ist als Feld. Sie müssen es nicht im int-Code oder im String-Label erhalten. Da enum ein Datentyp ist, lautet dieses Feld immer "Status". Da ich es zu einem erforderlichen Element machen möchte, habe ich die Annotation "@ NotNull" der Bean-Validierung hinzugefügt.

4. JSP, die ein Listenfeld mit Aufzählung ausgibt

Erstellen Sie eine JSP, die ein Listenfeld mit Aufzählung ausgibt. Darum geht es in diesem Artikel. Verwenden Sie die Standard-JSP-Funktionen und Federfunktionen (<form: xxx /> ist das Feder-Tag).

JSP, die ein Listenfeld mit Aufzählung ausgibt


<%--★ Punkt 3--%>
<%@ page import="com.example.demo.Status" %>

...Kürzung...

<%--★ Punkt 4--%>
<form:errors path="status"/>
<form:select path="status" items="${Status.values()}" itemLabel="label" itemValue="name" />

** ★ Punkt 3 ** Ich möchte in JSP auf "Status" verweisen, also importiere die Klasse mit "<% @ page import =" fqcn "%>". Ich habe es oft in den Tagen gesehen, als JSP in Scriptlets geschrieben wurde, aber ich sehe es heutzutage nicht viel, aber es ist eine Standardfunktion von JSP.

** ★ Punkt 4 ** Geben Sie das Listenfeld mit dem Tag <form: select /> of spring aus. Da es viele Attribute gibt, wird jedes unten erläutert.

Attribut Erläuterung
path Geben Sie den entsprechenden Feldnamen der Formularklasse an. DiesmalstatusWird sein.
items Geben Sie die Sammlung oder das Array an, in dem die anzuzeigenden Daten im Listenfeld gespeichert sind.
Hier von enumvalue()Der Punkt ist, eine statische Methode aufzurufen. Diese Methode gibt ein Array von Enum zurück.
Jetzt können Sie 3 Elemente der Aufzählung anzeigen.
★ Bei Punkt 3StatusIch habe dies importiert, um diese statische Methode aufzurufen.
itemLabel Geben Sie das Feld an, das für das Anzeigeelement des Listenfelds verwendet werden soll.
Diesmal Statusvonlabelフィールドを表示したいvonでlabelAngegeben.
itemValue Geben Sie das Feld an, das für den Wert des Listenfelds verwendet werden soll.
codeIch möchte, aber hiernameDer Punkt ist zu spezifizieren.

Da der Getter beim Rendern aufgerufen wird, ★ definiert in Punkt 1getName()Die Methode wird aufgerufen.

5. Ausgabelistenfeld HTML

Der HTML-Code des Ausgabelistenfelds wird unten angezeigt. Das value-Attribut von <option> wird auf name von enum gesetzt, und das Anzeigeelement wird auf label gesetzt. Wenn value mit dem in Status enum definierten name übereinstimmt, kann er ohne besondere Verarbeitung an die Form-Klasse gebunden werden.

HTML ausgeben (Zeilenumbrüche zur besseren Lesbarkeit hinzufügen)


<select id="status" name="status">
  <option value="APPROVAL">Die Genehmigung</option>
  <option value="DENIAL">Verweigerung</option>
  <option value="WITHDRAWAL">Rückzug</option>
</select>

Wenn Sie value auf einen Wert setzen, der nicht in enum definiert ist (hier HOGE), tritt ein Typ-Mismatch-Fehler auf, wie unten gezeigt. Dies tritt auf, wenn das HTML-Formular manipuliert und ein ungültiger Wert für den Wert festgelegt wird oder wenn das Feld "Code" bei Punkt 4 fälschlicherweise auf "itemValue" gesetzt wird.

Wenn eine HTTP-Anforderung mit einem Wert erfolgt, der nicht konvertiert werden kann


Failed to convert property value of type java.lang.String to required type com.example.demo.Status for property status; 
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] 
to type [com.example.demo.Status] for value HOGE; nested exception is java.lang.IllegalArgumentException: No enum constant com.example.demo.Status.HOGE

** Wie Sie der bisherigen Erläuterung entnehmen können, wird bei Verwendung von enum in JSP der Typ "safe of enum" angewendet, wenn er in Form festgelegt wird, ohne eine spezielle Eingabeprüfung vorzubereiten. ** ** **

6. JSP, die ein Kontrollkästchen mit Aufzählung ausgibt

Ändern Sie die Formularklasse in ein Array, damit Sie mehrere Formulare auswählen können.

DemoForm.java


public class DemoForm implements Serializable {

    @NotNull
    @Size(min = 1, max = 3)
    Status[] status;
    // ommited
}

Ich habe bei der Ausgabe des Listenfelds das Tag "<form: select />" verwendet, für das Kontrollkästchen jedoch das Tag "<form: checkboxes />". Bitte beachten Sie, dass es auch ein "<form: checkbox />" -Tag gibt, das ein Kontrollkästchen ausgibt.

JSP, die ein Kontrollkästchen mit Aufzählung ausgibt


<%--★ Punkt 5--%>
<form:errors path="status"/>
<ul>
  <form:checkboxes path="status" items="${Status.values()}" 
      itemLabel="label" itemValue="name" element="li" />
</ul>

** ★ Punkt 5 ** Beschreibt das Attribut "Element", das sich vom Listenfeld unterscheidet. Legen Sie dies fest, wenn Sie das HTML-Element angeben möchten, das das Ausgabe-Kontrollkästchen umschließt. Dieses Mal habe ich "li" so eingestellt, dass es mit