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
  2. @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
  3. @ivar_grimstad MVC 1.0 - JavaLand 2016 View @Controller @Path(“hello”) public

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

    class HelloController { @GET public Viewable hello() { return new Viewable(“hello.jsp”); } }
  5. @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(); } }
  6. @ivar_grimstad MVC 1.0 - JavaLand 2016 View @Controller @Path(“hello”) public

    class HelloController { @View(“hello.jsp”) @GET public void hello() { } }
  7. @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; } }
  8. @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!”); } }
  9. @ivar_grimstad MVC 1.0 - JavaLand 2016 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>
  10. @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!”); } }
  11. @ivar_grimstad MVC 1.0 - JavaLand 2016 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>
  12. @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.
  13. @ivar_grimstad MVC 1.0 - JavaLand 2016 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(); } }
  14. @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
  15. @ivar_grimstad MVC 1.0 - JavaLand 2016 Model ReservationCtl Access Update

    ConfirmationCtl GET confirmation reservation OK Redirect Browser POST
  16. @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; } }
  17. @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
  18. @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“; } }
  19. @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 { } }
  20. @ivar_grimstad MVC 1.0 - JavaLand 2016 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>
  21. @ivar_grimstad MVC 1.0 - JavaLand 2016 ViewEngine public interface ViewEngine

    { boolean supports(String view); void processView(ViewEngineContext context) throws ViewEngineException; }
  22. @ivar_grimstad MVC 1.0 - JavaLand 2016 View Engine Conflicts @Priority(OUTRAGEOSLY_HIGH)


    @ApplicationScoped
 public class FreemarkerViewEngine extends ViewEngineBase { … }
  23. @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()); } }
  24. @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