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.

B489790e1a844284d7cd1fa2cd6e021f?s=128

ivargrimstad

April 28, 2016
Tweet

Transcript

  1. MVC 1.0 - by Example Ivar Grimstad Principal Consultant, Cybercom

    Sweden JCP Expert Group Member (JSRs 368, 371, 375)
  2. @ivar_grimstad https://github.com/ivargrimstad https://www.linkedin.com/in/ivargrimstad http://lanyrd.com/profile/ivargrimstad/

  3. MVC

  4. Why?

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

  6. http://glassfish.org/survey

  7. JSR 371 - MVC 1.0

  8. JSR 371 Expert Group

  9. Action-based MVC

  10. Controller Model View Request Update Update Get

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

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

  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
  14. Existing Java EE Technologies

  15. Key Decisions

  16. Key Decisions

  17. Build MVC 1.0 on top of JAX-RS

  18. Controllers

  19. public class HelloController { } Controller

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

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

  22. Views

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

  24. @Controller @Path(“hello”) public class HelloController { @GET public String hello()

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

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

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

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

    hello() { } } View
  29. Models

  30. @Named(“greeting”) @RequestScoped public class Greeting { private String message; public

    void setMessage(String message) { this.message = message; } public void getMessage() { return message; } } Model
  31. @View(“hello.jsp”) @Controller @Path(“hello”) public class HelloController { @GET public void

    hello() { } } Model
  32. @View(“hello.jsp”) @Controller @Path(“hello”) public class HelloController { @Inject private Greeting

    greeting; @GET public void hello() { greeting.setMessage(“Hello GIDS 2016!”); } } Model
  33. <%@page contentType=“text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>MVC 1.0 Hello

    Demo</title> </head> <body> <h1>Hello ${greeting.message}</h1> </body> </html> Model
  34. @View(“hello.jsp”) @Controller @Path(“hello”) public class HelloController { @GET public void

    hello() { } } Model
  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
  36. <%@page contentType=“text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>MVC 1.0 Hello

    Demo</title> </head> <body> <h1>Hello ${message}</h1> </body> </html> Model
  37. Validation

  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
  39. public class FormViolationMapper implements ExceptionMapper<ConstraintViolationException> { public Response toResponse(ConstraintViolationException e)

    { // process violations … return Response.status(BAD_REQUEST) .entity(“error.jsp”).build(); } } Validation
  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
  41. Security

  42. @Controller @Path(“csrf”) public class HelloController { @CsrfValid @POST public Response

    post(@FormParam(“greeting") String greet { } } Cross Site Request Forgery
  43. <%@page contentType=“text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>MVC 1.0 Hello

    Demo</title> </head> <body> <form action="csrf" method="post" accept- charset="utf-8"> <input type="submit" value="Click here"/> <input type="hidden" name="${mvc.csrf.name}" value="${mvc.csrf.token}"/> </form> </body> </html> Cross Site Request Forgery
  44. Scopes

  45. @Named(“greeting”) @RedirectScoped public class Greeting { private String message; public

    void setMessage(String message) { this.message = message; } public void getMessage() { return message; } } @RedirectScoped
  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
  47. @Controller public class HelloController { @Inject private Greeting greeting; @POST

    @Path(“to”) public String hello() { return “here.jsp“; } } Same Bean @RedirectScoped
  48. Tired of slides?

  49. Show me the real CODE !

  50. Model ReservationCtl Update confirmation reservation OK Browser POST

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

    Redirect Browser POST
  52. View Engines

  53. Bring Your Own View Engine

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

    throws ViewEngineException; } ViewEngine
  55. @Priority(OUTRAGEOSLY_HIGH)
 @ApplicationScoped
 public class FreemarkerViewEngine extends ViewEngineBase { … }

    ViewEngine
  56. Events

  57. BeforeControllerEvent AfterControllerEvent BeforeProcessViewEvent AfterProcessViewEvent ControllerRedirectEvent

  58. @ApplicationScoped public class EventObserver { void onBeforeController(@Observes BeforeControllerEvent e) {

    } void onAfterController(@Observes AfterControllerEvent e) { } } Events Example
  59. Tool Support

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

  61. Summary

  62. Action-based MVC

  63. Existing Java EE Technologies

  64. Build MVC 1.0 on top of JAX-RS

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

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

  67. @ivar_grimstad @greatindiandev #GIDS2016 cybercom.com