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

MVC 1.0 - Now Even Better!

ivargrimstad
February 24, 2017

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.

ivargrimstad

February 24, 2017
Tweet

More Decks by ivargrimstad

Other Decks in Programming

Transcript

  1. @ivar_grimstad Devnexus 2017 - #JSR371 MVC 1.0 - by Example

    Ivar Grimstad Principal Consultant, Cybercom Sweden
  2. @ivar_grimstad Devnexus 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
  3. @ivar_grimstad Devnexus 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
  4. @ivar_grimstad Devnexus 2017 - #JSR371 Future Activities Formally move infrastructure

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

  5. @ivar_grimstad Devnexus 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 ([email protected]) Web Site
 java.net -> GitHub Pages (http://www.mvc-spec.org/)
  6. @ivar_grimstad Devnexus 2017 - #JSR371 Upcoming 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
  7. @ivar_grimstad Devnexus 2017 - #JSR371 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 UPDATE !!
  8. @ivar_grimstad Devnexus 2017 - #JSR371 View @Controller @Path(“hello”) public class

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

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

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

    HelloController { @View(“hello.jsp”) @GET public void hello() { } }
  12. @ivar_grimstad Devnexus 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; } }
  13. @ivar_grimstad Devnexus 2017 - #JSR371 Model @View(“hello.jsp”) @Controller @Path(“hello”) public

    class HelloController { @Inject private Greeting greeting; @GET public void hello() { greeting.setMessage(“Hello Atlanta!”); } }
  14. @ivar_grimstad Devnexus 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>
  15. @ivar_grimstad Devnexus 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!”); } }
  16. @ivar_grimstad Devnexus 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>
  17. @ivar_grimstad Devnexus 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.
  18. @ivar_grimstad Devnexus 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(); } }
  19. @ivar_grimstad Devnexus 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
  20. @ivar_grimstad Devnexus 2017 - #JSR371 ViewEngine public interface ViewEngine {

    boolean supports(String view); void processView(ViewEngineContext context) throws ViewEngineException; }
  21. @ivar_grimstad Devnexus 2017 - #JSR371 Controller Model View Request BeforeControllerEvent

    AfterControllerEvent BeforeProcessViewEvent AfterProcessViewEvent ControllerRedirectEvent
  22. @ivar_grimstad Devnexus 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()); } }
  23. @ivar_grimstad Devnexus 2017 - #JSR371 Cross Site Request Forgery @Controller

    @Path(“csrf”) public class HelloController { @CsrfValid @POST public Response post(@FormParam(“greeting") String greet { } }
  24. @ivar_grimstad Devnexus 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>
  25. @ivar_grimstad Devnexus 2017 - #JSR371 @RedirectScoped @Named(“greeting”) @RedirectScoped public class

    Greeting { private String message; public void setMessage(String message) { this.message = message; } public void getMessage() { return message; } }
  26. @ivar_grimstad Devnexus 2017 - #JSR371 @Controller public class HelloController {

    @Inject private Greeting greeting; @POST @Path(“from”) public String hello() { greeting.setMessage(“Hello Atlanta!”); return “redirect:/to“; } } @RedirectScoped @RedirectScoped @RequestScoped
  27. @ivar_grimstad Devnexus 2017 - #JSR371 @Controller public class HelloController {

    @Inject private Greeting greeting; @POST @Path(“to”) public String hello() { return “here.jsp“; } } @RedirectScoped Same Bean
  28. @ivar_grimstad Devnexus 2017 - #JSR371 Controller @Controller @Path(“hello”) public class

    HelloController { @Inject private MvcContext mvc; @GET public String get() { Locale locale = mvc.getLocale(); } }