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.
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.
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. )
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.
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.
Im Gegenteil, die folgenden Punkte sollten bei der Prüfung der Implementierung beachtet werden.
`@ RequestMapping ({" "," {num} "})` `benötigen Sie beispielsweise die Methode`
setNum (Object) `` `. Recommended Posts