Почему свойства объекта команды, связанного с отправленной формой, являются нулевыми в этом приложении Spring MVC?
Я новичок в Spring MVC, и у меня возникла следующая проблема при попытке заполнить объект команды, отправив форму в метод контроллера.
Итак, у меня следующая ситуация:
У меня есть этот класс объекта команды с именем Step2Form:
public class Step2Form {
String nome;
String cognome;
int giornoNascita;
int meseNascita;
int annoNascita;
String nazioneNascita;
String regioneNascita;
String provinciaNascita;
String comuneNascita;
String sesso;
String eMail;
String confermaEmail;
String trattamentoDatiPersonali;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public int getGiornoNascita() {
return giornoNascita;
}
public void setGiornoNascita(int giornoNascita) {
this.giornoNascita = giornoNascita;
}
public int getMeseNascita() {
return meseNascita;
}
public void setMeseNascita(int meseNascita) {
this.meseNascita = meseNascita;
}
public int getAnnoNascita() {
return annoNascita;
}
public void setAnnoNascita(int annoNascita) {
this.annoNascita = annoNascita;
}
public String getNazioneNascita() {
return nazioneNascita;
}
public void setNazioneNascita(String nazioneNascita) {
this.nazioneNascita = nazioneNascita;
}
public String getRegioneNascita() {
return regioneNascita;
}
public void setRegioneNascita(String regioneNascita) {
this.regioneNascita = regioneNascita;
}
public String getProvinciaNascita() {
return provinciaNascita;
}
public void setProvinciaNascita(String provinciaNascita) {
this.provinciaNascita = provinciaNascita;
}
public String getComuneNascita() {
return comuneNascita;
}
public void setComuneNascita(String comuneNascita) {
this.comuneNascita = comuneNascita;
}
public String getSesso() {
return sesso;
}
public void setSesso(String sesso) {
this.sesso = sesso;
}
public String geteMail() {
return eMail;
}
public void seteMail(String eMail) {
this.eMail = eMail;
}
public String getConfermaEmail() {
return confermaEmail;
}
public void setConfermaEmail(String confermaEmail) {
this.confermaEmail = confermaEmail;
}
public String getTrattamentoDatiPersonali() {
return trattamentoDatiPersonali;
}
public void setTrattamentoDatiPersonali(String trattamentoDatiPersonali) {
this.trattamentoDatiPersonali = trattamentoDatiPersonali;
}
}
который отображает эту форму в виде:
<form id="reg-form" name="reg-form" action="<@spring.url '/iscrizioneStep3' />" method="post">
<fieldset>
<div class="form-group">
<label for="name">Nome <span aria-hidden="true">*</span>:</label>
<input type="text" id="name" name="name" class="form-control input-mm" placeholder="Inserisci il tuo nome" data-validation="[NOTEMPTY]" data-validation-label="nome" aria-required="true" tabindex="10">
</div>
<div class="form-group">
<label for="surname">Cognome <span aria-hidden="true">*</span>:</label>
<input type="text" id="surname" name="surname" class="form-control input-mm" placeholder="Inserisci il tuo cognome" data-validation="[NOTEMPTY]" data-validation-label="cognome" aria-required="true" tabindex="20">
</div>
<div class="form-group grouped">
<label>Data di nascita <span aria-hidden="true">*</span>:</label>
<div class="row">
<div class="col-xs-3 col-md-4">
<select id="birth-day" name="birth-day" class="form-control selectpicker select-mm" title="Giorno" data-validation="[NOTEMPTY, INTEGER]" data-validation-label="giorno di nascita" aria-label="seleziona il giorno di nascita" aria-required="true" tabindex="30">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
</select>
</div>
<div class="col-xs-5 col-md-5">
<select id="birth-month" name="birth-month" class="form-control selectpicker select-mm" title="Mese" data-validation="[NOTEMPTY, INTEGER]" data-validation-label="mese di nascita" aria-label="seleziona il mese di nascita" aria-required="true" tabindex="40">
<option value="01">Gennaio</option>
<option value="02">Febbraio</option>
<option value="03">Marzo</option>
</select>
</div>
<div class="col-xs-4 col-md-3">
<select id="birth-year" name="birth-year" class="form-control selectpicker select-mm" title="Anno" data-validation="[NOTEMPTY, INTEGER]" data-validation-label="anno di nascita" aria-label="seleziona l'anno di nascita" aria-required="true" tabindex="50">
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
</select>
</div>
</div>
</div>
<div class="form-group">
<label for="country">Nazione di nascita<span aria-hidden="true">*</span>:</label>
<select id="country" name="country" class="sel-dynamic sel-haschild form-control selectpicker select-mm" title="Seleziona la nazione" data-validation="[NOTEMPTY]" data-validation-label="nazione" aria-required="true" tabindex="60">
<option value="italy">Italia</option>
<option value="estero">Estero</option>
</select>
</div>
<div class="form-group">
<label for="region">Regione di nascita<span aria-hidden="true">*</span>:</label>
<select id="region" name="region" class="sel-dynamic sel-haschild form-control selectpicker select-mm" title="É necessario selezionare una regione..." data-validation="[NOTEMPTY]" data-validation-label="regione" data-choice="Seleziona la regione" aria-required="true" disabled tabindex="70">
<option disabled value="0"> </option>
</select>
</div>
<div class="form-group">
<label for="district">Provincia di nascita<span aria-hidden="true">*</span>:</label>
<select id="district" name="district" class="sel-dynamic sel-haschild form-control selectpicker select-mm" title="É necessario selezionare una provincia..." data-validation="[NOTEMPTY]" data-validation-label="provincia" data-choice="Seleziona la provincia" aria-required="true" disabled tabindex="80">
<option disabled value="0"> </option>
</select>
</div>
<div class="form-group clearfix">
<label for="municipality">Comune <span aria-hidden="true">*</span>: </label>
<select id="municipality" name="municipality" class="sel-dynamic form-control selectpicker select-mm" title="É necessario selezionare un comune..." data-validation="[NOTEMPTY]" data-validation-label="comune" data-choice="Seleziona un comune" aria-required="true" disabled tabindex="90">
<option disabled value="0"> </option>
</select>
</div>
<div class="form-group">
<label>Sesso <span aria-hidden="true">*</span>:</label>
<div class="genderbg clearfix">
<label id="label-gender-m" class="radio-inline pull-left">
<input id="gender-m" type="radio" name="gender" value="m" data-validation="[NOTEMPTY]" data-validation-label="sesso" aria-label="scelta sesso maschio" tabindex="100">Maschio
</label>
<label id="label-gender-f" class="radio-inline pull-right">
<input id="gender-f" type="radio" name="gender" value="f" aria-label="scelta sesso femmina" tabindex="110">Femmina
</label>
</div>
</div>
<div class="form-group">
<label for="email">Email <span aria-hidden="true">*</span>:</label>
<input type="text" id="email" name="email" class="form-control input-mm" placeholder="Esempio: nome@email.it" data-validation="[NOTEMPTY, EMAIL]" data-validation-label="email" aria-required="true" tabindex="120">
</div>
<div class="form-group">
<label for="email-confirm">Conferma Email <span aria-hidden="true">*</span>:</label>
<input type="text" id="email-confirm" name="email-confirm" class="form-control input-mm" data-validation="[NOTEMPTY, V==email]" data-validation-label="conferma email" aria-required="true" tabindex="130">
</div>
<div class="form-group">
<label>Termini e condizioni:</label>
<p class="small">Dichiaro di aver letto e di accettare le <a href="#" title="Condizioni generali del servizio" tabindex="140">condizioni generali</a></p>
<label id="label-gencond" class="radio-inline">
<input id="gencond" type="radio" name="gencond" value="y" data-validation="[NOTEMPTY]" data-validation-label="termini e condizioni" tabindex="150"><strong>Accetto</strong>
</label>
</div>
<div class="form-group">
<label>Trattamento dei dati personali:</label>
<p class="small">I dati raccolti saranno utili a soddisfare le tue richieste, a migliorare i nostri servizi e a poterti comunicare le nostre novità.<br>
Leggi l' <a href="" title="Informativa sulla privacy" tabindex="160">informativa sulla privacy</a> e, se vuoi, presta il consenso.</p>
<label id="label-privacy-y" class="radio-inline">
<input id="privacy-y" type="radio" name="privacy" value="y" data-validation="[NOTEMPTY]" data-validation-label="privacy" tabindex="170"><strong>Accetto</strong>
</label>
<label id="label-privacy-n" class="radio-inline">
<input id="privacy-n" type="radio" name="privacy" value="n" tabindex="180"><strong>Non Accetto</strong>
</label>
</div>
<button type="submit" class="btn btn-block submit-btn" aria-label="prosegui la registrazione" tabindex="190">Passaggio 3</button>
</fieldset>
</form>
В конце концов у меня есть этот метод контроллера, который обрабатывает отправку предыдущей формы:
@RequestMapping(value = "/iscrizioneStep3", method=RequestMethod.POST)
public String iscrizioneStep3(@ModelAttribute("SpringWeb")Step2Form step2Form, ModelMap model, HttpServletRequest request) {
System.out.println("INTO iscrizioneStep3()");
System.out.println("NOME: " + step2Form.getNome());
return "iscrizioneStep3";
}
Когда я отправляю форму, она входит в метод iscrizioneStep3(), но проблема заключается в том, что когда она переходит к выполнению:
System.out.println("NOME: " + step2Form.getNome());
вот что получается в моей консоли Eclipse:
19:39:00,874 INFO [stdout] (http-localhost/127.0.0.1:8080-1) NOME: null
Так что он не установил поле nome моего командного объекта.
Зачем? Что случилось? Что мне не хватает? Как я могу это исправить?
1 ответ
<input type="text" id="name" name="name" class="form-control input-mm" placeholder="Inserisci il tuo nome" data-validation="[NOTEMPTY]" data-validation-label="nome" aria-required="true" tabindex="10">
</div>
Должно быть
<input type="text" id="nome" name="nome" class="form-control input-mm" placeholder="Inserisci il tuo nome" data-validation="[NOTEMPTY]" data-validation-label="nome" aria-required="true" tabindex="10">
</div>
или я что-то здесь упускаю?
Обычно Spring отображает поля с помощью атрибута "name" в соответствующую переменную в классе (<input type="hidden" name="tester" />
следует сопоставить с переменной с именем "тестер".