Spring dispone di molti View Resolver, che hanno lo scopo di renderizzare il model in browser. Noi analizzeremo solo l'InternalResourceViewResolver che è che suppota Servlet e jsp.
Come visto in precendenza ogni controller restituisce il nome logico di una view che viene risolta attraverso il view resolver, nel nostro caso la view finale è una jsp. Per configurare l'InternalResourceViewResolver bastano le seguenti righe nel [dispatcherservlet]-servlet.xml:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
Attraverso questa configurazione, quando dal controller restituiamo una stringa del tipo /path/result il nostro View Resolver farà un forward alla jsp /WEB-INF/jsp/path/result.jsp. Se invce si ha bisogno di fare una redirect, basta anteporre alla stringa di ritorno del controller "redirect:".
Una volta configurato in nostro View Resolver, non ci resta che renderizzare i dati che sono stati messi dal controller nel Model. Usando le jsp si possono usare le JSTL per renderizzare i dati. Per la costruzione di form, Spring contiene la spring-form.tld, vediamo i tag contenuti:
- form – tag principale, tutti i tag della library devono essere contenuti in questo tag per funzionare correttamente. Questo tag si occupa anche di aggiugere gli oggetti del model nel PageContext della jsp in modo che i tag figli vi possano accedere.
- input – tag che renderizza un input con type 'text'.
- checkbox – tag che renderizza una checkbox. Questo tag si riferisce all'attibuto di un bean che può essere una collection, un boolean o un object.
- checkboxes – tag che renderizza una serie di checkbox. Questo tag si riferisce all'attibuto di un bean che è una lista di possibili valori.
- radiobutton – tag che renderizza un radiobutton.
- radiobuttons – tag che renderizza una serie di radiobuttons che si riferiscono ad un solo attributo di un bean.
- password – tag che renderizza un input con type 'password'.
- select – tag che renderizza una select.
- option – tag che renderizza una option.
- options – tag che renderizza una lista di option.
- textarea – tag che renderizza una textarea.
- hidden – tag che renderizza un input con type 'hidden'.
- errors – tag che renderizza uno span contenente gli errori di validazione del form.
Vediamo un esempio completo di tutti i tag:
@Controller
public class FormController {
@RequestMapping("formExample")
public String viewForm(Model model) {
// aggiungo in mio bean al model
FormBean formBean = new FormBean();
formBean.setHidden("hiddenValue");
model.addAttribute("formBean", formBean);
Collection<String> checkBoxes = new ArrayList<String>();
checkBoxes.add("1");
checkBoxes.add("2");
checkBoxes.add("3");
model.addAttribute("checkBoxes", checkBoxes);
Collection<String> radiobuttons = new ArrayList<String>();
radiobuttons.add("1");
radiobuttons.add("2");
radiobuttons.add("3");
model.addAttribute("radiobuttons", checkBoxes);
Collection<OptionForm> options = new ArrayList<OptionForm>();
OptionForm option1 = new OptionForm();
option1.setLabel("option1");
option1.setValue("1");
options.add(option1);
OptionForm option2 = new OptionForm();
option2.setLabel("option2");
option2.setValue("2");
options.add(option2);
model.addAttribute("options", options);
// definisco il view resolver
return "form/example";
}
@RequestMapping(value="submit", method=RequestMethod.POST)
public String viewForm(FormBean b) {
// definisco il view resolver
return "form/ok";
}
}
il nostro form:
<form:form commandName="formBean" action="submit">
<p>
<form:label path="input" >input</form:label>
<form:input path="input"/>
</p>
<p>
<form:label path="check1" >check1</form:label>
<form:checkbox path="check1"/>
</p>
<p>
<form:label path="check2">check2</form:label>
<form:checkbox path="check2" value="value1" label="value1"/>
<form:checkbox path="check2" value="value2" label="value2"/>
<form:checkbox path="check2" value="value3" label="value3"/>
</p>
<p>
<form:label path="check3" >check3</form:label>
<form:checkbox path="check3" value="check3"/>
</p>
<p>
<form:label path="checkboxes">checkboxes</form:label>
<form:checkboxes path="checkboxes" items="${checkBoxes}"/>
</p>
<p>
<form:label path="radiobutton">radiobutton</form:label>
<form:radiobutton path="radiobutton" value="radiobutton1" label="radiobutton1"/>
<form:radiobutton path="radiobutton" value="radiobutton2" label="radiobutton2"/>
</p>
<p>
<form:label path="radiobuttons">radiobuttons</form:label>
<form:radiobuttons path="radiobuttons" items="${radiobuttons}"/>
</p>
<p>
<form:label path="password">password</form:label>
<form:password path="password"/>
</p>
<p>
<form:label path="select">select</form:label>
<form:select path="select">
<form:option value="-1" label="-- select" />
<form:options items="${options}" itemLabel="label" itemValue="value" />
</form:select>
</p>
<p>
<form:label path="textarea">textarea</form:label>
<form:textarea path="textarea"/>
</p>
<p>
<form:label path="hidden">hidden</form:label>
<form:hidden path="hidden"/>
</p>
<input type="submit" value="submit" />
</form:form>