Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MVC 1.0 - by Example @ JavaLand 2016

MVC 1.0 - by Example @ JavaLand 2016

MVC 1.0, as specified by JSR 371, is targeted for the upcoming Java EE 8 release. In this session I will go through the fundamentals of this specification and explain the core concepts. The session will include lots of code samples and tips to where to get started using this awesome technology.

ivargrimstad

March 09, 2016
Tweet

More Decks by ivargrimstad

Other Decks in Programming

Transcript

  1. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    MVC 1.0 - by Example
    Ivar Grimstad
    Principal Consultant, Cybercom Sweden
    JCP Expert Group Member (JSRs 368, 371, 375)
    JSR 371

    View Slide

  2. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @ivar_grimstad
    https://github.com/ivargrimstad
    https://www.linkedin.com/in/ivargrimstad
    http://lanyrd.com/profile/ivargrimstad/

    View Slide

  3. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Why?

    View Slide

  4. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    https://java.net/downloads/javaee-spec/JavaEE8_Community_Survey_Results.pdf

    View Slide

  5. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    http://glassfish.org/survey

    View Slide

  6. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    JSR 371 Expert Group

    View Slide

  7. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Action-based MVC

    View Slide

  8. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    Model View
    Request
    Update
    Update

    View Slide

  9. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    Model View
    Request
    Update
    Update

    View Slide

  10. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    Model View
    Request
    Update
    Update

    View Slide

  11. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Comparable Frameworks
    • Spring MVC
    • around since 2005
    • “Real World” since 2008 (Spring 2.5 onward)
    • today’s leader in Action-Land
    • Struts 2
    • around since 2004 (WebWork 2)
    • “Real World” since 2007 (Struts 2.0.9 onward)
    • still widely adopted

    View Slide

  12. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Existing Java EE
    Technologies

    View Slide

  13. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Key Decisions

    View Slide

  14. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Key Decisions

    View Slide

  15. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Build MVC 1.0 on top
    of JAX-RS

    View Slide

  16. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controllers

    View Slide

  17. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    public class HelloController {
    }

    View Slide

  18. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    @Path(“hello”)
    public class HelloController {
    }

    View Slide

  19. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Controller
    @Controller
    @Path(“hello”)
    public class HelloController {
    }

    View Slide

  20. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Views

    View Slide

  21. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @Controller
    @Path(“hello”)
    public class HelloController {
    }

    View Slide

  22. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public String hello() {
    return “hello.jsp”;
    }
    }

    View Slide

  23. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public Viewable hello() {
    return new Viewable(“hello.jsp”);
    }
    }

    View Slide

  24. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public Response hello() {
    return Response.status(OK).entity(“hello.jsp”).build();
    }
    }

    View Slide

  25. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @Controller
    @Path(“hello”)
    public class HelloController {
    @View(“hello.jsp”)
    @GET
    public void hello() {
    }
    }

    View Slide

  26. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View
    @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }

    View Slide

  27. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Models

    View Slide

  28. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }

    View Slide

  29. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    @Named(“greeting”)
    @RequestScoped
    public class Greeting {
    private String message;
    public void setMessate(String message) {
    this.message = message;
    }
    public void getMessage() { return message; }
    }

    View Slide

  30. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @Inject
    private Greeting greeting;
    @GET
    public void hello() {
    greeting.setMessage(“Hello JavaLand!”);
    }
    }

    View Slide

  31. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    pageEncoding="UTF-8"%>



    MVC 1.0 Hello Demo


    Hello ${greeting.message}


    View Slide

  32. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }

    View Slide

  33. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @Inject
    private Models model;
    @GET
    public void hello() {
    model.put(“message”, “Hello JavaLand!”);
    }
    }

    View Slide

  34. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    pageEncoding="UTF-8"%>



    MVC 1.0 Hello Demo


    Hello ${message}


    View Slide

  35. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Validation

    View Slide

  36. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @Controller
    @Path("form")
    public class FormController {
    @POST
    public Response formPost(@Valid @BeanParam FormDataBean f) {
    return Response.status(OK).entity(“data.jsp”).build();
    }
    }
    Validation
    ConstraintValidationException
    @Min, @NotNull
    etc.

    View Slide

  37. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Validation
    public class FormViolationMapper implements
    ExceptionMapper
    {
    public Response toResponse(ConstraintViolationException e) {
    Set> s =e.getConstraintViolations();
    // process violations ...
    return Response.status(BAD_REQUEST)
    .entity(“error.jsp”).build();
    }
    }

    View Slide

  38. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @Controller
    @Path("form")
    public class FormController {
    @Inject private BindingResult br;
    @POST
    public Response formPost(@Valid @BeanParam FormDataBean f) {
    if (br.isFailed()) {
    return Response.status(BAD_REQUEST)
    .entity(“error.jsp”).build();
    }
    return Response.status(OK).entity(“data.jsp”).build();
    }
    }
    Validation
    Allows for MVC Error Handling

    View Slide

  39. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Show me the CODE !

    View Slide

  40. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    ReservationCtl
    Update
    confirmation
    reservation
    OK
    Browser
    POST

    View Slide

  41. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Model
    ReservationCtl
    Access
    Update
    ConfirmationCtl
    GET
    confirmation
    reservation
    OK
    Redirect
    Browser
    POST

    View Slide

  42. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Scopes

    View Slide

  43. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @RedirectScoped
    @Named(“greeting”)
    @RedirectScoped
    public class Greeting {
    private String message;
    public void setMessate(String message) {
    this.message = message;
    }
    public void getMessage() { return message; }
    }

    View Slide

  44. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @Controller
    public class HelloController {
    @Inject
    private Greeting greeting;
    @POST
    @Path(“from”)
    public String hello() {
    greeting.setMessage(“Hello JavaLand!”);
    return “redirect:/to“;
    }
    }
    @RedirectScoped
    @RedirectScoped
    @RequestScoped

    View Slide

  45. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    @RedirectScoped
    Same Bean
    @Controller
    public class HelloController {
    @Inject
    private Greeting greeting;
    @POST
    @Path(“to”)
    public String hello() {
    return “here.jsp“;
    }
    }

    View Slide

  46. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Security

    View Slide

  47. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Cross Site Request Forgery
    @Controller
    @Path(“csrf”)
    public class HelloController {
    @CsrfValid
    @POST
    public Response post(@FormParam(“greeting") String greet {
    }
    }

    View Slide

  48. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Cross Site Request Forgery




    MVC 1.0 Hello Demo




    value="${mvc.csrf.token}"/>



    View Slide

  49. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View Engines

    View Slide

  50. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Bring Your Own View
    Engine

    View Slide

  51. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    ViewEngine
    public interface ViewEngine {
    boolean supports(String view);
    void processView(ViewEngineContext context)
    throws ViewEngineException;
    }

    View Slide

  52. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    View Engine Conflicts
    @Priority(OUTRAGEOSLY_HIGH)

    @ApplicationScoped

    public class FreemarkerViewEngine extends ViewEngineBase {

    }

    View Slide

  53. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Events

    View Slide

  54. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    BeforeControllerEvent
    AfterControllerEvent
    BeforeProcessViewEvent
    AfterProcessViewEvent
    ControllerRedirectEvent

    View Slide

  55. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Events Example
    @ApplicationScoped
    public class EventObserver {
    void onBeforeController(@Observes BeforeControllerEvent e) {
    println("URI: " + e.getUriInfo().getRequestURI());
    }
    void onAfterController(@Observes AfterControllerEvent e) {
    println("Controller: " +
    e.getResourceInfo().getResourceMethod());
    }
    }

    View Slide

  56. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Summary

    View Slide

  57. @chkal @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Project Page
    https://java.net/projects/mvc-spec
    GitHub
    https://github.com/mvc-spec
    Reference Implementation
    https://ozark.java.net

    View Slide

  58. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    Samples
    https://github.com/ivargrimstad/mvc-samples
    Blog
    http://www.agilejava.eu/

    View Slide

  59. @ivar_grimstad
    MVC 1.0 - JavaLand 2016
    cybercom.com

    View Slide