Validating and Binding Data
Sovelluksesi Observers and Route Parameters voi käyttää FormView-komponenttia muokataksesi olemassa olevia asiakastietoja. Tämä vaihe hyödyntää Data binding -menetelmää, joka yhdistää käyttöliittymäkomponentit suoraan tietomalliin automaattista arvon synkronointia varten. Tämä vähentää boilerplate-koodia sovelluksessasi ja antaa sinun lisätä validointitarkistuksia Spring-entiteetille Customer, jolloin käyttäjät antavat täydellisiä ja tarkkoja tietoja täyttäessään lomakkeita. Tämä vaihe kattaa seuraavat käsitteet:
- Jakarta validation
- Käyttämällä
BindingContext-luokkaa
Tämän vaiheen suorittaminen luo version 5-validating-and-binding-data.
Sovelluksen suorittaminen
Sovellustasi kehittäessäsi voit käyttää 5-validating-and-binding-data -versiona vertailukohtana. Näet sovelluksen toiminnassa:
-
Siirry ykkösluokan hakemistoon, joka sisältää
pom.xml-tiedoston, tämä on5-validating-and-binding-data, jos seuraat GitHubin versiota. -
Käytä seuraavaa Maven-komentoa suorittaaksesi Spring Boot -sovelluksen paikallisesti:
mvn
Sovelluksen suorittaminen avaa automaattisesti uuden selaimen osoitteessa http://localhost:8080.
Validointisääntöjen määrittäminen
Muokattavalla datalla olevan sovelluksen kehittämiseen tulisi sisältyä validointi. Validointitarkistukset auttavat ylläpitämään merkityksellisiä ja tarkkoja käyttäjien lähettämiä tietoja. Jos niitä ei tarkisteta, se voi johtaa ongelmiin, joten on tärkeää saada kiinni niiden virheiden tyypit, joita käyttäjät voivat tehdä täyttäessään lomaketta reaaliajassa.
Koska se, mikä katsotaan voimassa olevaksi, voi vaihdella ominaisuuksien välillä, sinun on määritettävä, mikä tekee jokaisesta ominaisuudesta voimassa olevan ja ilmoitettava käyttäjälle, jos jokin asia on virheellinen. Onneksi voit tehdä tämän helposti Jakarta Validation -työkalulla. Jakarta validointi mahdollistaa rajoitusten lisäämisen ominaisuuksiin annotaatioina.
Tässä oppaassa käytetään kahta Jakarta-annotaatiota: @NotEmpty ja @Pattern. @NotEmpty tarkistaa null- ja tyhjät merkkijonot, kun taas @Pattern tarkistaa, vastaako ominaisuus asetettua säännöllistä ilmausta. Molemmat annotaatiot antavat sinun lisätä viestin näytettäväksi, kun ominaisuus muuttuu virheelliseksi.
Vaatiaksesi, että sekä etu- että sukunimet ovat pakollisia ja sisältävät vain kirjaimia, kun taas yritysnimi on valinnainen ja sallii kirjaimet, numerot ja välilyönnit, lisää seuraavat annotaatiot Customer-entiteettiin:
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message = "Asiakkaan etunimi on pakollinen")
@Pattern(regexp = "[a-zA-Z]*", message = "Virheelliset merkit")
private String firstName = "";
@NotEmpty(message = "Asiakkaan sukunimi on pakollinen")
@Pattern(regexp = "[a-zA-Z]*", message = "Virheelliset merkit")
private String lastName = "";
@Pattern(regexp = "[a-zA-Z0-9 ]*", message = "Virheelliset merkit")
private String company = "";
private Country country = Country.UNKNOWN;
public enum Country {
UNKNOWN,
GERMANY,
ENGLAND,
ITALY,
USA
}
public Customer(String firstName, String lastName, String company, Country country) {
setFirstName(firstName);
setLastName(lastName);
setCompany(company);
setCountry(country);
}
public Customer(String firstName, String lastName, String company) {
this(firstName, lastName, company, Country.UNKNOWN);
}
public Customer(String firstName, String lastName) {
this(firstName, lastName, "");
}
public Customer(String firstName) {
this(firstName, "");
}
public Customer() {
}
public void setFirstName(String newName) {
firstName = newName;
}
public String getFirstName() {
return firstName;
}
public void setLastName(String newName) {
lastName = newName;
}
public String getLastName() {
return lastName;
}
public void setCompany(String newCompany) {
company = newCompany;
}
public String getCompany() {
return company;
}
public void setCountry(Country newCountry) {
country = newCountry;
}
public Country getCountry() {
return country;
}
public Long getId() {
return id;
}
}
Tutustu Jakarta Bean Validation -rajoitteiden viittaukseen saadaksesi täydellisen listan validoitavista, tai opi lisää webforJ Jakarta Validation -artikkelista.
Kenttien sitominen
Käyttääksesi validointitarkistuksia Customer-luokassa käyttöliittymässä FormView-komponentissa, sinun täytyy luoda BindingContext tietojen sitomista varten. Ennen tietojen sitomista jokainen FormView-kenttä tarvitsi tapahtumakuuntelijan synkronoimaan manuaalisesti Spring-entiteetin Customer kanssa. BindingContext-luokan luominen FormView:ssä sitoo ja synkronoi automaattisesti Customer-tietomallin käyttöliittymäkomponenttien kanssa.
BindingContext-luokan luominen
BindingContext-instanssi tarvitsee Spring-beanin, jonka kanssa sidonta synkronoidaan. FormView:ssä määrittele BindingContext, käyttäen Customer-entiteettiä:
public class FormView extends Composite<Div> implements WillEnterObserver {
private final CustomerService customerService;
private BindingContext<Customer> context;
Customer customer = new Customer();
Sitten, jotta käyttöliittymän komponentit sitoutuvat automaattisesti bean-ominaisuuksiin nimien perusteella, käytä BindingContext.of() seuraavilla parametreilla:
this: Aiemmin määrittelitcontext-muuttujanBindingContext-luokkana. Ensimmäinen parametri määrittää, mikä objekti sisältää sidottavat komponentit.Customer.class: Toinen parametri on sidottavan beanin luokka.true: Kolmas parametri aktivoi Jakarta validoinnin, jolloin konteksti voi käyttää määrittämiäsi validointejaCustomer-luokassa. Tämän tekeminen muuttaa virheellisten komponenttien tyyliä ja näyttää asetetut viestit.
Kaikki yhdessä näyttää seuraavalta koodiriviltä:
context = BindingContext.of(this, Customer.class, true);
Lomakkeen responsiivisuuden lisääminen
Tietojen sitomisen ansiosta sovelluksesi suorittaa nyt automaattisesti validointitarkistuksia. Lisäämällä tapahtumakuuntelijan tarkistuksiin voit estää käyttäjiä lähettämästä virheellistä lomaketta. Lisää seuraava koodi, jotta lähetä-nappi on aktiivinen vain, kun lomake on voimassa:
context = BindingContext.of(this, Customer.class, true);
context.onValidate(e -> submit.setEnabled(e.isValid()));
Tapahtumakuuntelijoiden poistaminen komponenteista
Jokainen käyttöliittymän muutos synkronoidaan nyt automaattisesti BindingContext-luokan kanssa. Tämä tarkoittaa, että voit nyt poistaa tapahtumakuuntelijat jokaiselta kentältä:
Ennen
// Ilman tietojen sitomista
TextField firstName = new TextField("Etunimi", e -> customer.setFirstName(e.getValue()));
TextField lastName = new TextField("Sukunimi", e -> customer.setLastName(e.getValue()));
TextField company = new TextField("Yritys", e -> customer.setCompany(e.getValue()));
ChoiceBox country = new ChoiceBox("Maa",
e -> customer.setCountry(Country.valueOf(e.getSelectedItem().getText())));
Jälkeen
// Tietojen sitomisen kanssa
TextField firstName = new TextField("Etunimi");
TextField lastName = new TextField("Sukunimi");
TextField company = new TextField("Yritys");
ChoiceBox country = new ChoiceBox("Maa");
Sitominen ominaisuuden nimien mukaan
Koska jokaisen komponentin nimi vastaa tietomallia, webforJ sovelsi Automatic Binding. Jos nimet eivät vastanneet, voit käyttää @UseProperty-annotaatiota kartuttaaksesi niitä.
@UseProperty("firstName")
TextField firstNameField = new TextField("Etunimi");
Datan lukeminen fillForm()-metodissa
Aiemmin fillForm()-metodissa alustit jokaisen komponentin arvon manuaalisesti hakemalla tietoja Customer-kopiosta. Mutta nyt, kun käytät BindingContext-luokkaa, voit käyttää read()-metodia. Tämä metodi täyttää jokaisen sidotun komponentin siihen liittyvällä ominaisuudella Customer-kopiosta.
fillForm()-metodissa voit korvata setValue()-metodit read()-metodilla:
public void fillForm(Long customerId) {
customer = customerService.getCustomerByKey(customerId);
context.read(customer);
}
Validoinnin lisääminen submitCustomer()
Viimeinen muutos FormView-komponentille tässä vaiheessa on lisätä suojaus submitCustomer()-metodiin. Ennen muutosten sitomista H2-tietokantaan, sovellus suorittaa lopullisen validoinnin sidotun kontekstiin palautettavien tulosten käyttämiseksi write()-metodilla.
write()-metodi päivittää beanin ominaisuuksia käyttäen sidottuja käyttöliittymäkomponentteja BindingContext-luokassa ja palauttaa ValidationResult-arvon.
Käytä write()-metodia kirjoittaaksesi Customer-kopioon käyttäen FormView:ssä sidottuja komponentteja. Jos palautettu ValidationResult on voimassa, päivitä H2-tietokanta kirjoitetuilla tiedoilla.
private void submitCustomer() {
ValidationResult results = context.write(customer);
if (results.isValid()) {
if (customerService.doesCustomerExist(customerId)) {
customerService.updateCustomer(customer);
} else {
customerService.createCustomer(customer);
}
navigateToMain();
}
}
Valmis FormView
Näiden muutosten myötä tässä on miltä FormView näyttää. Sovelluksesi tukee nyt tietojen sitomista ja validointia käyttäen Spring Bootia ja webforJ:tä. Lomakekentät on automaattisesti synkronoitu mallin kanssa ja tarkistettu validointisääntöjen mukaan.
Seuraava vaihe
Seuraavassa vaiheessa, Integrating an App Layout, keskitytään käyttämään AppLayout-komponenttia, joka lisää sivuvalikon, joka on käytettävissä asiakas-taulukko- ja asiakas-lomakesivuilla. Opit myös toisesta asettelutyökalusta, FlexLayout-komponentista.