[Spring MVC] Implementieren Sie die in der URL enthaltenen dynamischen Parameter ohne Verwendung von Optional (~ Java7).

Ich baue derzeit ein Web-System auf Basis von Java 7. Es gibt verschiedene Gründe, warum ich Java 8 nicht verwende Im Gegenzug bestand das Problem darin, dass Optional nicht verwendet werden konnte.

Implementieren mit Optional (für Java 8 oder höher)

Optional ist "Ich weiß nicht, ob das Argument einen Wert haben wird, aber ich werde versuchen, ihn zu erhalten!" In Spring MVC wird es jedoch verwendet, um den URL-Parameter im REST-Format auszudrücken.

Angenommen, Sie definieren den Controller wie folgt:

SampleController.java


@Controller
@RequestMapping("page")
public class SampleController {

  @RequestMapping({"", "{num}"})
  public ModelAndView getMessages(@PathVariable("num") Optional<String> num) {
    if (num.ifPresent()) {
      //Wenn der Parameter vorhanden ist
    } else {
      //Wenn der Parameter nicht existiert
    }
    return new ModelAndView("index");
  }

}

Es ist eine Implementierung, die dieselbe Aktionsmethode mit oder ohne Parameterwerte verarbeiten möchte. Dieses Mal nehmen wir die URLs `http: // localhost / page / 1``` und` http: // localhost / page``` an.

Wenn der erstere angefordert wird, wird die Zeichenfolge nach dem zweiten Schrägstrich (** 1 **) als Parameter beurteilt ** 1 ** wird in das Argument num eingegeben, und das Ergebnis von `ifPresent ()`, um festzustellen, ob eine Eingabe vorhanden war, ist ** true **. Da die Typvariable * \ <String > * ist, ist es hier möglich, den Wert mit num.get () als Zeichenkettentyp abzurufen.

Wenn die letztere URL angefordert wird, wird festgestellt, dass der Parameterwert nicht vorhanden ist und kein ** Wert in das Argument num ** eingegeben wird. Daher ist das Beurteilungsergebnis von `ifPresent ()` ** false **.

In Java 8 oder höher ist die obige Implementierung ausreichend. Bis zu diesem Punkt ist es eine gängige Methode, die auch an externen Standorten und in Qiita eingeführt wird.

Implementieren ohne Verwendung von Optional

Da Optional jedoch eine in Java8 neu implementierte Klasse ist, kann das obige Programm erst in Java7 verwendet werden. Ich dachte auch "Ist es möglich, den Argumenttyp auf * String * zu setzen und ihn mit * null * abzurufen?", Aber ich löse eine ** NullPointerException **.

Sie können es implementieren, indem Sie die Aktionsmethode aufteilen, aber ich möchte das nicht wirklich tun, weil ich das Gefühl habe, verloren zu haben. (Ich wollte nicht mindestens zwei derselben Quelle in derselben Klasse haben oder eine private Methode implementieren, um die erstere zu vermeiden. Wenn Sie dies tun, möchte ich dieselbe Quelle verwenden. )

Implementierungsmethode

Anschließend müssen Sie eine Klasse erstellen, die wie Optional (im Folgenden ** Parameterklasse **) verwendet werden kann, und sie als Alternative verwenden.

SampleParameter.java


public class SampleParameter {
  private String num;

  //Wenn Sie keinen Lombok verwenden, benötigen Sie:
  // pubric String getNum() { return num; }
  // pubric String setNum(String num) { this.num = num; }

  boolean ifPresent() {
    return num != null;
  }
}

SampleController.java


@Controller
@RequestMapping("page")
public class SampleController {

  @RequestMapping({"", "{num}"})
  public ModelAndView getMessages(@PathVariable("num") SampleParameter num) {
    if (num.ifPresent()) {
      //Wenn der Parameter vorhanden ist
    } else {
      //Wenn der Parameter nicht existiert
    }
    return new ModelAndView("index");
  }

}

Ja, so sieht es aus. Wie bei `@ ModelAttribute``` sieht es so aus, als würden Sie so etwas wie eine Formularklasse erstellen. In der Tat, wenn die Parameterklasse nicht den durch `@ RequestMapping``` angegebenen Parameternamen hat Seien Sie vorsichtig, da es eine ** NullPointerException ** auslöst.

Vorteile und Vorsichtsmaßnahmen für die Umsetzung

verdienen

Auf den ersten Blick sieht es so aus, als würden wir die Räder neu erfinden, aber es ist auch eine ziemlich bequeme Klasse.

  1. Die Getter / Setter-Methode kann geändert werden.
    Dies ist der größte Verdienst. Tatsächlich habe ich bei der Definition der Parameterklasse kein lombok
    verwendet Ich habe den ** Entschlüsselungsprozess ** der mit AES-128 + Base64 verschlüsselten Parameter in den Getter eingefügt.
  2. Sie können Ihre Lieblingsmethode hinzufügen / Sie können Ihre Lieblingsmethode hinzufügen.
    Du kannst machen was immer du willst. (Es ist jedoch erforderlich, einen Getter vorzubereiten, der dem Parameternamen entspricht.)
  3. Sie können frei erweitern / implementieren.
    Es bedeutet nicht, dass Optional nicht möglich ist, aber es ist eine Originalklasse, also
    Es kann frei vererbt / implementiert werden.

Vorsichtsmaßnahmen für die Umsetzung

Im Gegenteil, die folgenden Punkte sollten bei der Prüfung der Implementierung beachtet werden.

  1. In der Parameterklasse muss eine Setter-Methode vorbereitet werden, die dem Parameternamen ** @ RequestMapping ** entspricht.
    Für `@ RequestMapping ({" "," {num} "})` `benötigen Sie beispielsweise die Methode` setNum (Object) `` `.
    Möglicherweise sind Sie sich dessen nicht sehr bewusst, wenn Sie Setter-Methoden mit Lombok erstellen.
  2. Es ist auch erforderlich, den Argumentnamen der Aktionsmethode abzugleichen.
    Es ist ein großes Problem, wenn Sie die richtigen Regeln haben, aber es ist problematisch, wenn Sie dies nicht tun.
    (Möglicherweise gibt es hier eine Problemumgehung.)

Recommended Posts

[Spring MVC] Implementieren Sie die in der URL enthaltenen dynamischen Parameter ohne Verwendung von Optional (~ Java7).
Implementieren Sie reCAPTCHA v3 in Java / Spring
Map ohne Verwendung eines Arrays in Java
Implementieren Sie eine Freigabeschaltfläche in Rails 6, ohne Gem zu verwenden
Implementieren Sie Test Double in JUnit, ohne externe Bibliotheken zu verwenden
Testen Sie die Klasse mit Feldinjektion im Spring-Boot-Test, ohne den Spring-Container zu verwenden
Implementieren Sie Thread in Java und versuchen Sie, die anonyme Klasse Lambda zu verwenden
Authentifizieren Sie 3 oder mehr Parameter im JSON-Format mit Spring Security
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
Versuchen Sie es mit RocksDB mit Java
Java-Konfiguration mit Spring MVC
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Verwenden von Mapper mit Java (Spring)
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
[Java] Abrufen von Daten aus der Datenbank mithilfe des Singleton-Dienstes in Spring (Boot)
Hochladen und Herunterladen von Dateien mit Ajax mit Spring Boot (ohne JQuery)