In order to render a form with Spring Forms, several things must be done:
A simple model Java bean (POJO) with properties for each form field is used as a back end and to represent the form.
This is a simple example for such a backing bean:
public class MyForm { private String email; private String emailRepeat; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getEmailRepeat() { return emailRepeat; } public void setEmailRepeat(String emailRepeat) { this.emailRepeat = emailRepeat; } }
The form backing bean must be added to the model that is rendered.
To add the form backing bean to the model, add a method to the handler class, annotated with @ModelAttribute
@ModelAttribute("nameOfForm") public MyForm createMyForm() { return new MyForm(); }
To render the front end, Spring provides a tag library to create HTML forms in JSPs, accessing the form bean in the model.
This is a simple example for such a form, see Spring form tag library documentation for details on how the form taglib may be used.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <form:form method="POST" action="handlerUri" commandName="nameOfForm"> <%-- render form fields --%> <form:input path="email"/> <form:input path="emailRepeat"/> <input type="submit" value="Subscribe"/> </form:form>
Using Ids for Encoding Objects in Form Fields
Under some circumstances, you will need to write down a string representation of the identity of a bean, for example "the content bean for content 22". This is typically necessary in intermediary XML documents or when you want to refer to a bean in an HTML hidden input field.
For this purpose, the CoreMedia CAE contains a
generic ID facility that allows you to convert selected bean types to a string and back. The ID
API basically consists of two methods #getId
and #parseId
in the
class
com.coremedia.id.IdProvider.
Note that this is not an object serialization. This
facility is only useful to capture an id of a stateless object that represents an external
business entity, as outlined in Section 4.1.1.1, “Patterns For Content Beans”. The default implementation
comes with id support for content beans and blob properties. Other bean types can be supported
by writing a new implementation of
com.coremedia.id.IdScheme
and plugging it into the id resolver using a Customizer
.
In order to encode an object id into a form field in a template, as well as to decode it back
on a form submission, the CoreMedia CAE comes with
a custom tag <cm:id> as well as an implementation of the
java.beans.PropertyEditor
interface that you can use in Spring to parse form
fields back into bean references.
The following example shows how to encode the id of a bean feature
into an HTML
form:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <cm:id self="${feature}" var="id"/> <form:form method="POST" action="handlerUri" commandName="nameOfForm"> <%-- render form fields --%> <input name="feature" value="${id}" type="hidden" /> <form:input path="email"/> <form:input path="emailRepeat"/> <input type="submit" value="Subscribe"/> </form:form>
In this example, a regular <input>
field was used to render the id. Because
of this, the id will not be bound to the backing bean, but the value can be retrieved by the
controller using the command request.getParameter("feature")