Book Image

Building Web Apps with Spring 5 and Angular

By : Ajitesh Kumar Shukla
Book Image

Building Web Apps with Spring 5 and Angular

By: Ajitesh Kumar Shukla

Overview of this book

Spring is the most popular application development framework being adopted by millions of developers around the world to create high performing, easily testable, reusable code. Its lightweight nature and extensibility helps you write robust and highly-scalable server-side web applications. Coupled with the power and efficiency of Angular, creating web applications has never been easier. If you want build end-to-end modern web application using Spring and Angular, then this book is for you. The book directly heads to show you how to create the backend with Spring, showing you how to configure the Spring MVC and handle Web requests. It will take you through the key aspects such as building REST API endpoints, using Hibernate, working with Junit 5 etc. Once you have secured and tested the backend, we will go ahead and start working on the front end with Angular. You will learn about fundamentals of Angular and Typescript and create an SPA using components, routing etc. Finally, you will see how to integrate both the applications with REST protocol and deploy the application using tools such as Jenkins and Docker.
Table of Contents (18 chapters)
Title Page
Credits
About the Author
About the Reviewer
www.PacktPub.com
Customer Feedback
Preface

Handling Response


The following are some of the common types of responses returned from controllers:

  • An instance of ModelAndView 
  • Using @ResponseBody

Response as an instance of ModelAndView

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);

Using @ResponseBody annotation

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;
      }
    }