MSSE SENG 5199

Course Materials for the MSSE Web Application Development Course

autoscale: true theme: Next, 3

Spring Web


Installing Spring Boot Web

Add dependency to build.gradle

dependencies {
  ...
  compile('org.springframework.boot:spring-boot-starter-web')
  ...
}

Model View Controller


inline


Java Servlets


Servlet Problems


Spring Dispatcher Servlet


Spring Controllers


Spring MVC - Server side rendering


Route Method Return Types - Controllers


Example model/view


@Controller
class PostViewController {

  @RequestMapping("/postView")
  public String postView(Model model, Pageable request) {
    Page page = postService.listPosts(new PageRequest(request.pageNumber, request.pageSize, new Sort(Sort.Direction.DESC, "createdDate")))

    //Will be available to template as Object -> page
    model.addAttribute("page", page)
    //String ties to /resources/templates/postView.html
    return "postView"
  }
}

Creating a Controller


Request Mappings


Composed RequestMappings


URI Template Patterns


Regular Expression Patterns

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
void handle(@PathVariable String version, @PathVariable String extension) {
    // ...
}

Advanced Route Mapping


Route Method Arguments


Route Method Arguments Cont.


Mapping Path and Query Variables

//http://localhost:8080/pathParam?myQueryParam=foo
@GetMapping(/{pathParam})
public Object getObject(@PathParam String pathParm, @RequestParam('myQueryParam') String myQueryParam) {

}

Serializing to/from Models


RequestBody Example

@PostMapping
User addUser(@RequestBody User user) {
  return userService.addUser(user)
}

ResponseEntity

@GetMapping('/percentage/{percent}')
ResponseEntity<Percentage> getPosts(@PathVariable int percent) {
  if (percent > 100) {
    Status error = new Status( "failed", "invalid parameter" )
    return new ResponseEntity<Status>(error, HttpStatus.BAD_REQUEST)
  }
  ...
}

RestControllers


Example RestController

@RestController
public class UserController {

  @Autowired
  UserRepository userRepository

  @GetMapping("/user/{id}")
  public User getUser(@PathVariable Long id) {
      return userRepository.findOne(id)
  }
}

Spring Data Rest

The Final Level Of Rest?


Richardson Maturity Model


inline


RMM Explained

https://martinfowler.com/articles/richardsonMaturityModel.html


HATEOS (Hypertext As The Engine Of Application State)

{
  createdDate: "2017-02-16T12:46:48.769",
  modifiedDate: "2017-02-16T12:46:48.769",
  email: "franklin@franksinternet.com",
  handle: "franklin",
    _links: {
        self: {
          href: "http://localhost:8080/users/1"
        },
        user: {
          href: "http://localhost:8080/users/1"
        },
        posts: {
          href: "http://localhost:8080/users/1/posts"
        }
      }
}

Spring Data Rest


Spring Data Rest and @RestController


Installing Spring Boot Data Rest

Add dependency to build.gradle (This can have side effects)

compile('org.springframework.boot:spring-boot-starter-data-rest')


Differences between RestController and RestRepository Approaches


Projections

@Projection(name= "emailOnly", types = { User.class})
interface EmailOnly {

  String getEmail()
}

Excerpts