The following are some of the common types of responses returned from controllers:
- An instance of
ModelAndView
- Using
@ResponseBody
ModelAndView
is a container object to hold both Model and View. With ModelAndView
as a return object, the controller returns the both model and view as a single return value. The model is a map object which makes it possible to store key-value pairs. The following code sample represents the usage of ModelAndView
in a Controller:
@Controller @RequestMapping("/account/*") public class UserAccountController { @PostMapping("/signup/process") public ModelAndView processSignup(ModelMap model, @RequestParam("nickname") String nickname, @RequestParam("emailaddress") String emailAddress, @RequestParam("password") String password) { model.addAttribute("login", true); model.addAttribute("nickname", nickname); model.addAttribute("message", "Have a great day ahead."); return new ModelAndView("index", model); } }
The following code samples represent the different ways in which an instance of ModelAndView
is returned with different sets of information:
// Will result in display of index.jsp page return new ModelAndView("index"); // Will result in display of index.jsp page. //The JSP page could consist of code such as "Hello ${name}" //which will get displayed as "Hello Calvin Hobbes" return new ModelAndView("index", "name", "Calvin Hobbes"); // Will result in display of index.jsp page. // The JSP page could consist of code such as //"Hello ${model.firstName} ${model.lastName}" //which will get displayed as "Hello Calvin Hobbes" UserInfo userInfo = new UserInfo(); userInfo.setFirstName("Calvin"); userInfo.setLastName("Hobbes"); return new ModelAndView("index", "model", userInfo); // Will result in display of index.jsp page. // The JSP page could consist of code such as "Hello ${name}" // which will get displayed as "Hello Calvin Hobbes" Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "Calvin Hobbes"); return new ModelAndView("index", map);
This section represents the concepts related to the usage of the @ResponseBody
annotation for returning a response to the client request.
The @ResponseBody
annotation can be applied both at the class level and the method level. When @ResponseBody
is applied at the class level along with the @Controller
annotation, another annotation such as @RestController
can be used instead.
The @ResonseBody
annotation represents the fact that the value returned by the method will form the body of the response. When the value returned is an object, the object is converted into an appropriate JSON or XML format by HttpMessageConverters
. The format is decided based on the value of the produce
attribute of the @RequestMapping
annotation, and also the type of content that the client accepts. Take a look at the following example:
@Controller public class RestDemoController { @RequestMapping(value="/hello", method=RequestMethod.POST, produces="application/json") @ResponseBody public HelloMessage getHelloMessage(@RequestBody User user) { HelloMessage helloMessage = new HelloMessage(); String name = user.getName(); helloMessage.setMessage( "Hello " + name + "! How are you doing?"); helloMessage.setName(name); return helloMessage; } }