Je crée une application Web en utilisant springBoot dans mon entreprise, et je vais vous présenter les astuces liées à Form que j'ai apprises là-bas.
Vous souhaiterez peut-être définir la valeur initiale lors de l'affichage du formulaire en vue. Il existe différentes manières.
Le formulaire est généré lorsque le Controller est appelé en définissant @ModelAttribute, et est automatiquement compressé dans le modèle. Donc, si vous définissez un constructeur qui définit la valeur au moment de la génération, la valeur sera définie au moment de l'initialisation
Form.java
@Getter
@Setter
public class Form {
private String name;
private int age;
Form() {
this.name = "hoge";
this.age = 18;
}
}
Cependant, soyez prudent lorsque vous spécifiez un constructeur avec des arguments comme indiqué ci-dessous.
Form.java
@Getter
@Setter
public class Form {
private String name;
private int age;
Form(String name, int age) {
this.name = name;
this.age = age;
}
}
Avec cela seul, lors du POST de la valeur du formulaire
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for class com.example.demo.ParsonForm] with root cause
J'obtiens une erreur comme celle-ci. Cela se produit car il n'y a pas de constructeur sans arguments. Ainsi, lorsque vous utilisez un constructeur avec des arguments, écrivez le constructeur sans arguments ainsi que ci-dessous.
Form.java
@Getter
@Setter
public class Form {
private String name;
private int age;
Form(String name, int age) {
this.name = name;
this.age = age;
}
Form() {
}
}
Il peut également être spécifié par le poseur dans le contrôleur. Cependant, dans ce cas, n'oubliez pas de transmettre le formulaire avec la valeur ajoutée au modèle.
indexController.java
@RequestMapping("/new")
public String index(Form form) {
form.setName("hoge");
form.setAge(18);
model.addAttribute("form",form);
return "index";
}
Vous pouvez également ajouter une valeur avec th: value en vue. Cependant, dans ce cas, les précautions suivantes sont nécessaires.
index.html
<form method="post" action="/" th:object="${form}">
<input type="text" name="name" th:value="*{name == null ? 'hoge' : name">
<input type="text" name="age" th:value="*{age == null ? 18 : age}">
</form>
Spring Form est pratique car vous pouvez facilement définir la validation avec des annotations. Cependant, si vous souhaitez travailler avec des structures de données plus complexes, vous pouvez utiliser des objets imbriqués.
Par exemple, le formulaire Parson suivant conserve plusieurs itemNames et itemSizes. ..
ParsonForm
@Getter
@Setter
public class ParsonForm {
private String name;
private itemName1;
private itemName2;
private itemSize1;
private itemSize2;
}
Vous pouvez également écrire, mais créer un modèle d'élément pour ce qui suit,
Item.java
@Getter
@Setter
public class Item {
private String name;
private int size;
}
Il sera plus propre de l'écrire comme Collection
ParsonForm
@Getter
@Setter
public class ParsonForm {
private String name;
private Collection<Item> items;
}
Si vous souhaitez valider davantage les éléments de l'objet imbriqué, Ajoutez simplement l'annotation @Valid dans les éléments ParsonForm La validation dans Item.java fonctionnera.
Parson
@Getter
@Setter
public class ParsonForm {
private String name;
@Valid
private Collection<Item> items;
}
Item.java
@Getter
@Setter
public class Item {
@NotBlank
private String name;
@Max(100)
@Min(1)
private int size;
}
Assurez-vous d'ajouter le tableau [] pour le spécifier dans le champ th:.
form.html
<form class="parsonForm" th:action="@{/}" th:method="post" th:object="${parsonForm}">
<input type="text" th:field="*{name}">
<input type="text" th:field="*{items[0].name}">
<input type="text" th:field="*{items[0].size}">
<input type="text" th:field="*{items[1].name}">
<input type="text" th:field="*{items[1].size}">
<input type="submit">
</form>
https://qiita.com/yo1000/items/b58a1ae8b3e51fdda479 https://area-b.com/blog/2015/02/04/2009/
Recommended Posts