Data Transfer from Controller to View
Spring MVC provides multiple mechanisms to pass data from controllers to views. Here are four primary approaches:
1. ModelAndView Approach
Handler methods returning ModelAndView objects can directly add model attributes:
@GetMapping("/model-view-example")
public ModelAndView modelViewExample() {
String targetView = "displayPage";
ModelAndView mav = new ModelAndView(targetView);
UserProfile userProfile = new UserProfile();
userProfile.setUsername("jdoe");
userProfile.setPassword("secure123");
userProfile.setRegistrationDate(LocalDate.now());
mav.addObject("displayName", "John");
mav.addObject("user", userProfile);
return mav;
}
2. Model/Map/ModelMap Approach
Handler methods can accept Model, ModelMap, or Map parameters:
@GetMapping("/model-example")
public String modelExample(Model model) {
UserProfile user = new UserProfile();
user.setUsername("jsmith");
user.setPassword("modelPass");
user.setRegistrationDate(LocalDate.now());
model.addAttribute("displayName", "Jane");
model.addAttribute("user", user);
return "displayPage";
}
@GetMapping("/map-example")
public String mapExample(Map<String, Object> dataMap) {
UserProfile user = new UserProfile();
user.setUsername("rbrown");
user.setPassword("mapPass");
user.setRegistrationDate(LocalDate.now());
dataMap.put("displayName", "Robert");
dataMap.put("user", user);
return "displayPage";
}
View template access example:
<!-- displayPage.jsp -->
<div>
Username: ${user.username}<br>
Password: ${user.password}<br>
Registered: ${user.registrationDate}<br>
Display Name: ${displayName}
</div>
3. @SessionAttributes Annotation
Persist model attributes across requests using session storage:
@SessionAttributes({"user"})
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/session-example")
public String sessionExample(Model model) {
UserProfile user = new UserProfile();
user.setUsername("sessionUser");
user.setPassword("sessionPass");
model.addAttribute("user", user);
return "displayPage";
}
}
Accessing session attributes in views:
Session User: ${sessionScope.user.username}
4. @ModelAttribute Annotation
Bind method parametesr to model attributes or execute pre-handler methods:
Parameter Binding
@GetMapping("/attribute-param")
public String attributeParameter(@ModelAttribute("user") UserProfile user,
@ModelAttribute("name") String displayName,
Model model) {
user.setUsername("attributeUser");
user.setPassword("paramPass");
displayName = "Attribute Example";
model.addAttribute("name", displayName);
return "displayPage";
}
Pre-handler Methods
@ModelAttribute("preloadData")
public Map<String, Object> preloadModel() {
UserProfile user = new UserProfile();
user.setUsername("preloadUser");
user.setPassword("preloadPass");
Map<String, Object> modelData = new HashMap<>();
modelData.put("displayName", "Preloaded");
modelData.put("user", user);
return modelData;
}
@GetMapping("/preload-example")
public String preloadExample() {
return "displayPage";
}
Accessing preloaded data:
Preloaded Name: ${preloadData.displayName}