14.4. Model-Binding

We now introduce a useful technique to auto-create model instances, called model binding. Model binding takes place when a whole model object is created by the Spring framework on form submission. This saves us the effort, and the code, needed to pass in each form field to a controller.

Model binding reduces the amount of code we need to write to create an object and it helps with validation (which we’ll explore further in the next section). Because we use the @ModelAttribute annotation, Spring Boot will create an Event object for us when it gets the POST request from /create.

14.4.1. How to Use Model-Binding - Video

Note

The starter code for this video is found at the delete-events branch. of the coding-events-demo repo. The final code presented in this video is found on the model-binding branch. As always, code along to the videos on your own coding-events project.

14.4.2. How to Use Model-Binding - Text

With the Event model in place, we can incorporate another annotation, @ModelAttribute. When submitting the event creation information, rather than passing in each field used to instantiate a model, we can instead pass in @ModelAttribute Event newEvent as a parameter of the controller method.

Revised processCreateEventForm in EventController:

32
33
34
35
36
@PostMapping("create")
public String processCreateEventForm(@ModelAttribute Event newEvent) {
   EventData.add(newEvent);
   return "redirect:";
}

This is the essence of model binding. The model instance is created on form submission. With only two fields needed to create an event, the value of this data binding may not be particularly apparent right now. You can imagine, though, with a larger form and class, that @ModelAttribute is quite an efficient annotation.

For binding to take place, we must use the model field names as the form field names. So back in the create form HTML, we update the form fields to match the event fields.

events/create.html:

 9
10
11
12
13
14
15
16
17
<div class="form-group">
   <label>Name
      <input type="text" name="name" class="form-control">
   </label>
   <label>
      Description
      <input type="text" name="description"  class="form-control">
   </label>
</div>

If a form field name does NOT match up with a model field, then binding will fail for that piece of data. It is critically important to ensure these names match up.

14.4.3. Check Your Understanding

Question

Complete this sentence: Model binding …

  1. requires an @ModelAttribute annotation.

  2. helps with form validation.

  3. reduces controller code.

  4. is useful for all of the reasons above.

Question

In coding-events, we add an additional private field, numberOfAttendees, to the Event class. What other change must we make to ensure the user of our application can determine this value? (Assume we are using model binding to process form submission.)

  1. Pass in a numberOfAttendees parameter to the form submission handler.

  2. Add another input element to the create event form with a name=numberOfAttendees attribute.

  3. Add a getAttendees method to EventData.

  4. All of the above.