MVC 1.0 - Now Even Better!

MVC 1.0 - Now Even Better!

MVC 1.0, as specified by JSR 371, may not be targeted for the upcoming Java EE 8 release, but the specification is still going on as a standalone specification. It is already possible to use the technology in a Java EE 7 environment and as Java EE 8 and 9 evolves, MVC 1.0 will be kept aligned to take advantage of the features provided by the platform.

This session will go through the fundamentals of this specification and explain the core concepts. We will show lots of code samples showing how to use the framework to build MVC 1.0 applications.

There will even be a demo of tooling support available and tips’n’tricks on how to extend the framework. After this session you will have everything you need to get started using the technology to quickly build secure, flexible, localized MVC Web applications.

B489790e1a844284d7cd1fa2cd6e021f?s=128

ivargrimstad

March 08, 2017
Tweet

Transcript

  1. @ivar_grimstad jDays 2017 - #JSR371 MVC 1.0 - Now Even

    Better! Ivar Grimstad Principal Consultant, Cybercom Sweden
  2. @ivar_grimstad jDays 2017 - #JSR371 @ivar_grimstad https://github.com/ivargrimstad https://www.linkedin.com/in/ivargrimstad http://lanyrd.com/profile/ivargrimstad/

  3. @ivar_grimstad jDays 2017 - #JSR371 JSR 371 Status MVC 1.0

    Demo and Samples
  4. @ivar_grimstad jDays 2017 - #JSR371 JSR 371 Status

  5. @ivar_grimstad jDays 2017 - #JSR371

  6. @ivar_grimstad jDays 2017 - #JSR371

  7. @ivar_grimstad jDays 2017 - #JSR371

  8. @ivar_grimstad jDays 2017 - #JSR371 @Controller to the Community !

  9. @ivar_grimstad jDays 2017 - #JSR371 January 2017 Transfer
 Ballot August

    2014 First Proposal September 2014 Approved by JCP Executive Committee September 2014 Expert Group starts discussions March 2015 EDR 1 October 2016 October 2015 EDR 2 JavaOne Past Activities
  10. @ivar_grimstad jDays 2017 - #JSR371 Current Activities Transfer approved by

    the Executive Committee
 Thanks! Finalize Transfer
 Oracle Legal is working on the final details New Infrastructure Setup
 Started Licensing
 Investigating
  11. @ivar_grimstad jDays 2017 - #JSR371 Future Activities Formally move infrastructure

    from java.net 
 Bring in Christian Kaltepoth as co spec-lead
 Revise the Schedule
 Adopt-a-JSR

  12. @ivar_grimstad jDays 2017 - #JSR371 Infrastructure Move

  13. @ivar_grimstad jDays 2017 - #JSR371 Infrastructure Setup Changes Code
 java.net

    -> GitHub (https://github.com/mvc-spec) Issue Tracker
 java.net -> GitHub (https://github.com/mvc-spec/mvc-spec/issues) Mailing Lists
 java.net -> Google Groups (jsr371-users@googlegroups.com) Web Site
 java.net -> GitHub Pages (http://www.mvc-spec.org/)
  14. @ivar_grimstad jDays 2017 - #JSR371 Adopt-a-JSR

  15. @ivar_grimstad jDays 2017 - #JSR371 Write Code! Blog Tweet Give

    us Feedback Create a Logotype
  16. @ivar_grimstad jDays 2017 - #JSR371 MVC 1.0 Talks DEVNEXUS (http://devnexus.com/)


    Atlanta, USA - February 22-24 jDays (http://www.jdays.se/)
 Gothenburg, Sweden - Mars 7-8 JavaLand (https://www.javaland.eu/)
 Brühl, Germany - Mars 28-30 Developer Week (http://www.developer-week.de/)
 Nürnberg, Germany - June 26-29
  17. @ivar_grimstad jDays 2017 - #JSR371 MVC 1.0

  18. @ivar_grimstad jDays 2017 - #JSR371 Action-based MVC

  19. @ivar_grimstad jDays 2017 - #JSR371 Controller Model View Request Update

    Update
  20. @ivar_grimstad jDays 2017 - #JSR371 Controller Model View Request Update

    Update
  21. @ivar_grimstad jDays 2017 - #JSR371 Controller Model View Request Update

    Update
  22. @ivar_grimstad jDays 2017 - #JSR371 Existing Java EE Technologies

  23. @ivar_grimstad jDays 2017 - #JSR371 Key Decisions

  24. @ivar_grimstad jDays 2017 - #JSR371 Key Decisions

  25. @ivar_grimstad jDays 2017 - #JSR371 Build MVC 1.0 on top

    of JAX-RS
  26. @ivar_grimstad jDays 2017 - #JSR371 Controllers

  27. @ivar_grimstad jDays 2017 - #JSR371 Controller public class HelloController {

    }
  28. @ivar_grimstad jDays 2017 - #JSR371 Controller @Path(“hello”) public class HelloController

    { }
  29. @ivar_grimstad jDays 2017 - #JSR371 Controller @Controller @Path(“hello”) public class

    HelloController { }
  30. @ivar_grimstad jDays 2017 - #JSR371 Views

  31. @ivar_grimstad jDays 2017 - #JSR371 View @Controller @Path(“hello”) public class

    HelloController { }
  32. @ivar_grimstad jDays 2017 - #JSR371 View @Controller @Path(“hello”) public class

    HelloController { @GET public String hello() { return “hello.jsp”; } }
  33. @ivar_grimstad jDays 2017 - #JSR371 View @Controller @Path(“hello”) public class

    HelloController { @GET public Viewable hello() { return new Viewable(“hello.jsp”); } }
  34. @ivar_grimstad jDays 2017 - #JSR371 View @Controller @Path(“hello”) public class

    HelloController { @GET public Response hello() { return Response.status(OK).entity(“hello.jsp”).build(); } }
  35. @ivar_grimstad jDays 2017 - #JSR371 View @Controller @Path(“hello”) public class

    HelloController { @View(“hello.jsp”) @GET public void hello() { } }
  36. @ivar_grimstad jDays 2017 - #JSR371 View @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @GET public void hello() { } }
  37. @ivar_grimstad jDays 2017 - #JSR371 Models

  38. @ivar_grimstad jDays 2017 - #JSR371 Model @Named(“greeting”) @RequestScoped public class

    Greeting { private String message; public void setMessage(String message) { this.message = message; } public void getMessage() { return message; } }
  39. @ivar_grimstad jDays 2017 - #JSR371 Model @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @GET public void hello() { } }
  40. @ivar_grimstad jDays 2017 - #JSR371 Model @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @Inject private Greeting greeting; @GET public void hello() { greeting.setMessage(“Hello Atlanta!”); } }
  41. @ivar_grimstad jDays 2017 - #JSR371 Model <%@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>
  42. @ivar_grimstad jDays 2017 - #JSR371 Model @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @GET public void hello() { } }
  43. @ivar_grimstad jDays 2017 - #JSR371 Model @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @Inject private Models model; @GET public void hello() { model.put(“message”, “Hello Atlanta!”); } }
  44. @ivar_grimstad jDays 2017 - #JSR371 Model <%@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>
  45. @ivar_grimstad jDays 2017 - #JSR371 Validation

  46. @ivar_grimstad jDays 2017 - #JSR371 @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.
  47. @ivar_grimstad jDays 2017 - #JSR371 Validation public class FormViolationMapper implements

    ExceptionMapper<ConstraintViolationException> { public Response toResponse(ConstraintViolationException e) { Set<ConstraintViolation<?>> s= e.getConstraintViolations(); // process violations ... return Response.status(BAD_REQUEST) .entity(“error.jsp”).build(); } }
  48. @ivar_grimstad jDays 2017 - #JSR371 @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
  49. @ivar_grimstad jDays 2017 - #JSR371 BindingResult

  50. @ivar_grimstad jDays 2017 - #JSR371 View Engines

  51. @ivar_grimstad jDays 2017 - #JSR371 Bring Your Own View Engine

  52. @ivar_grimstad jDays 2017 - #JSR371 ViewEngine public interface ViewEngine {

    boolean supports(String view); void processView(ViewEngineContext context) throws ViewEngineException; }
  53. @ivar_grimstad jDays 2017 - #JSR371 View Engine Conflicts @Priority(OUTRAGEOSLY_HIGH)
 @ApplicationScoped


    public class FreemarkerViewEngine extends ViewEngineBase { … }
  54. @ivar_grimstad jDays 2017 - #JSR371 Events

  55. @ivar_grimstad jDays 2017 - #JSR371 Controller Model View Request BeforeControllerEvent

    AfterControllerEvent BeforeProcessViewEvent AfterProcessViewEvent ControllerRedirectEvent
  56. @ivar_grimstad jDays 2017 - #JSR371 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()); } }
  57. @ivar_grimstad jDays 2017 - #JSR371 Security

  58. @ivar_grimstad jDays 2017 - #JSR371 Cross Site Request Forgery @Controller

    @Path(“csrf”) public class HelloController { @CsrfValid @POST public Response post(@FormParam(“greeting") String greet { } }
  59. @ivar_grimstad jDays 2017 - #JSR371 Cross Site Request Forgery <%@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>
  60. @ivar_grimstad jDays 2017 - #JSR371 Internationalization

  61. @ivar_grimstad jDays 2017 - #JSR371 Controller @Controller @Path(“hello”) public class

    HelloController { @Inject private MvcContext mvc; @GET public String get() { Locale locale = mvc.getLocale(); } }
  62. @ivar_grimstad jDays 2017 - #JSR371 Scopes

  63. @ivar_grimstad jDays 2017 - #JSR371 Model ReservationCtl Update confirmation reservation

    OK Browser POST
  64. @ivar_grimstad jDays 2017 - #JSR371 Model ReservationCtl Access Update ConfirmationCtl

    GET confirmation reservation OK Redirect Browser POST
  65. @ivar_grimstad jDays 2017 - #JSR371 Tired of slides?

  66. @ivar_grimstad jDays 2017 - #JSR371 Show me the CODE !

  67. @ivar_grimstad jDays 2017 - #JSR371 Summary

  68. @ivar_grimstad jDays 2017 - #JSR371 Action-based MVC

  69. @ivar_grimstad jDays 2017 - #JSR371 Existing Java EE Technologies

  70. @ivar_grimstad jDays 2017 - #JSR371 Build MVC 1.0 on top

    of JAX-RS
  71. @ivar_grimstad jDays 2017 - #JSR371 Tool Support

  72. @ivar_grimstad jDays 2017 - #JSR371 JPA Modeler jpamodeler.github.io Gaurav Gupta

    @jGauravGupta
  73. @ivar_grimstad jDays 2017 - #JSR371 Project Page https://www.mvc-spec.org GitHub https://github.com/mvc-spec

    Reference Implementation https://ozark.java.net
  74. @ivar_grimstad jDays 2017 - #JSR371 Samples https://github.com/ivargrimstad/mvc-samples Blog http://www.agilejava.eu/

  75. @ivar_grimstad jDays 2017 - #JSR371 cybercom.com