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

MVC 1.0 - by Example @ GIDS 2016

MVC 1.0 - by Example @ GIDS 2016

Model-view-controller, or MVC for short, is a common pattern in web frameworks. MVC frameworks can be categorized as action-based or component-based. In a component-based framework, the HTTP requests are grouped and typically handled by framework components with little or no interaction with application code. In an action-based framework, on the other hand, the HTTP requests are routed to controllers and turned into actions by application code.

The Java EE platform does not currently have support for action based MVC, but this is about to change. MVC 1.0, as specified by JSR 371, is targeted for the upcoming Java EE 8 release.

This session provides an introduction to the action-based MVC 1.0 API and will include lots of code samples and tips to where to get started using this awesome technology.

ivargrimstad

April 28, 2016
Tweet

More Decks by ivargrimstad

Other Decks in Programming

Transcript

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

    View Slide

  2. @ivar_grimstad
    https://github.com/ivargrimstad
    https://www.linkedin.com/in/ivargrimstad
    http://lanyrd.com/profile/ivargrimstad/

    View Slide

  3. MVC

    View Slide

  4. Why?

    View Slide

  5. https://java.net/downloads/javaee-spec/JavaEE8_Community_Survey_Results.pdf

    View Slide

  6. http://glassfish.org/survey

    View Slide

  7. JSR 371 - MVC 1.0

    View Slide

  8. JSR 371 Expert Group

    View Slide

  9. Action-based MVC

    View Slide

  10. Controller
    Model View
    Request
    Update
    Update
    Get

    View Slide

  11. Controller
    Model View
    Request
    Update
    Update
    Get
    Component-based MVC

    View Slide

  12. Controller
    Model View
    Request
    Update
    Update
    Get
    Action-based MVC

    View Slide

  13. 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

  14. Existing Java EE
    Technologies

    View Slide

  15. Key Decisions

    View Slide

  16. Key Decisions

    View Slide

  17. Build MVC 1.0 on top of
    JAX-RS

    View Slide

  18. Controllers

    View Slide

  19. public class HelloController {
    }
    Controller

    View Slide

  20. @Path(“hello”)
    public class HelloController {
    }
    Controller

    View Slide

  21. @Controller
    @Path(“hello”)
    public class HelloController {
    }
    Controller

    View Slide

  22. Views

    View Slide

  23. @Controller
    @Path(“hello”)
    public class HelloController {
    }
    View

    View Slide

  24. @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public String hello() {
    return “hello.jsp”;
    }
    }
    View

    View Slide

  25. @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public Viewable hello() {
    return new Viewable(“hello.jsp”);
    }
    }
    View

    View Slide

  26. @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public Response hello() {
    return Response.status(OK).entity(“hello.jsp”).build();
    }
    }
    View

    View Slide

  27. @Controller
    @Path(“hello”)
    public class HelloController {
    @View(“hello.jsp”)
    @GET
    public void hello() {
    }
    }
    View

    View Slide

  28. @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }
    View

    View Slide

  29. Models

    View Slide

  30. @Named(“greeting”)
    @RequestScoped
    public class Greeting {
    private String message;
    public void setMessage(String message) {
    this.message = message;
    }
    public void getMessage() { return message; }
    }
    Model

    View Slide

  31. @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }
    Model

    View Slide

  32. @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @Inject
    private Greeting greeting;
    @GET
    public void hello() {
    greeting.setMessage(“Hello GIDS 2016!”);
    }
    }
    Model

    View Slide

  33. <%@page contentType=“text/html" pageEncoding="UTF-8"%>



    MVC 1.0 Hello Demo


    Hello ${greeting.message}


    Model

    View Slide

  34. @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @GET
    public void hello() {
    }
    }
    Model

    View Slide

  35. @View(“hello.jsp”)
    @Controller
    @Path(“hello”)
    public class HelloController {
    @Inject
    private Models model;
    @GET
    public void hello() {
    model.put(“message”, “Hello GIDS 2016!”);
    }
    }
    Model

    View Slide

  36. <%@page contentType=“text/html" pageEncoding="UTF-8"%>



    MVC 1.0 Hello Demo


    Hello ${message}


    Model

    View Slide

  37. Validation

    View Slide

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

    View Slide

  39. public class FormViolationMapper implements
    ExceptionMapper
    {
    public Response toResponse(ConstraintViolationException e) {
    // process violations …
    return Response.status(BAD_REQUEST)
    .entity(“error.jsp”).build();
    }
    }
    Validation

    View Slide

  40. @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();
    }
    }
    Allows for MVC Error Handling
    Validation

    View Slide

  41. Security

    View Slide

  42. @Controller
    @Path(“csrf”)
    public class HelloController {
    @CsrfValid
    @POST
    public Response post(@FormParam(“greeting") String greet {
    }
    }
    Cross Site Request Forgery

    View Slide

  43. <%@page contentType=“text/html" pageEncoding="UTF-8"%>



    MVC 1.0 Hello Demo


    charset="utf-8">

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



    Cross Site Request Forgery

    View Slide

  44. Scopes

    View Slide

  45. @Named(“greeting”)
    @RedirectScoped
    public class Greeting {
    private String message;
    public void setMessage(String message) {
    this.message = message;
    }
    public void getMessage() { return message; }
    }
    @RedirectScoped

    View Slide

  46. @Controller
    public class HelloController {
    @Inject
    private Greeting greeting;
    @POST
    @Path(“from”)
    public String hello() {
    greeting.setMessage(“Hello GIDS 2016!”);
    return “redirect:to“;
    }
    }
    @RedirectScoped
    @RequestScoped
    @RedirectScoped

    View Slide

  47. @Controller
    public class HelloController {
    @Inject
    private Greeting greeting;
    @POST
    @Path(“to”)
    public String hello() {
    return “here.jsp“;
    }
    }
    Same Bean
    @RedirectScoped

    View Slide

  48. Tired of slides?

    View Slide

  49. Show me the real
    CODE !

    View Slide

  50. Model
    ReservationCtl
    Update
    confirmation
    reservation
    OK
    Browser
    POST

    View Slide

  51. Model
    ReservationCtl
    Access
    Update
    ConfirmationC
    tl
    GET
    confirmation
    reservation
    OK
    Redirect
    Browser
    POST

    View Slide

  52. View Engines

    View Slide

  53. Bring Your Own View
    Engine

    View Slide

  54. public interface ViewEngine {
    boolean supports(String view);
    void processView(ViewEngineContext context)
    throws ViewEngineException;
    }
    ViewEngine

    View Slide

  55. @Priority(OUTRAGEOSLY_HIGH)

    @ApplicationScoped

    public class FreemarkerViewEngine extends ViewEngineBase {

    }
    ViewEngine

    View Slide

  56. Events

    View Slide

  57. BeforeControllerEvent
    AfterControllerEvent
    BeforeProcessViewEvent
    AfterProcessViewEvent
    ControllerRedirectEvent

    View Slide

  58. @ApplicationScoped
    public class EventObserver {
    void onBeforeController(@Observes BeforeControllerEvent e) {
    }
    void onAfterController(@Observes AfterControllerEvent e) {
    }
    }
    Events Example

    View Slide

  59. Tool Support

    View Slide

  60. JPA Modeler
    http://jpamodeler.github.io/
    Gaurav Gupta
    @jGauravGupta

    View Slide

  61. Summary

    View Slide

  62. Action-based MVC

    View Slide

  63. Existing Java EE
    Technologies

    View Slide

  64. Build MVC 1.0 on top of
    JAX-RS

    View Slide

  65. Project Page
    https://java.net/projects/mvc-spec
    GitHub
    https://github.com/mvc-spec
    Reference Implementation
    https://ozark.java.net

    View Slide

  66. Samples
    https://github.com/ivargrimstad/mvc-samples
    Blog
    http://www.agilejava.eu/

    View Slide

  67. @ivar_grimstad
    @greatindiandev #GIDS2016
    cybercom.com

    View Slide