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

MVC 1.0 - by Example @ Devoxx Belgium 2015

MVC 1.0 - by Example @ Devoxx Belgium 2015

Joint presentation with René Gielen

ivargrimstad

November 12, 2015
Tweet

More Decks by ivargrimstad

Other Decks in Programming

Transcript

  1. @rgielen / @ivar_grimstad #Devoxx #JSR371 Action vs. Component Component based

    Complex Stateful Components Abstract away Request-Response Action based Abstract away Technical Details of HTTP Stateless Embrace Request-Response
  2. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Controller @Path(“hello”) public class HelloController

    { @GET public Viewable hello() { return new Viewable(“hello.jsp”); } } View
  3. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Controller @Path(“hello”) public class HelloController

    { @GET public Response hello() { return Response.status(OK).entity(“hello.jsp”).build(); } } View
  4. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Named(“greeting”) @RequestScoped public class Greeting

    { private String message; public void setMessate(String message) { this.message = message; } public void getMessage() { return message; } } Model
  5. @rgielen / @ivar_grimstad #Devoxx #JSR371 @View(“hello.jsp”) @Controller @Path(“hello”) public class

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

    HelloController { @Inject private Models model; @GET public void hello() { model.put(“message”, “Hello Devoxx!”); } } Model
  8. @rgielen / @ivar_grimstad #Devoxx #JSR371 <%@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
  9. @rgielen / @ivar_grimstad #Devoxx #JSR371 public interface ViewEngine { boolean

    supports(String view); void processView(ViewEngineContext context) throws ViewEngineException; } ViewEngine
  10. @rgielen / @ivar_grimstad #Devoxx #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.
  11. @rgielen / @ivar_grimstad #Devoxx #JSR371 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(); } } Validation
  12. @rgielen / @ivar_grimstad #Devoxx #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
  13. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Named(“greeting”) @RedirectScoped public class Greeting

    { private String message; public void setMessate(String message) { this.message = message; } public void getMessage() { return message; } } @RedirectScoped
  14. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Controller public class HelloController {

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

    @Inject private Greeting greeting; @POST @Path(“to”) public String hello() { return “here.jsp“; } } @RedirectScoped Same Bean
  16. @rgielen / @ivar_grimstad #Devoxx #JSR371 @Controller @Path(“csrf”) public class HelloController

    { @CsrfValid @POST public Response post(@FormParam(“greeting") String greet { } } Cross Site Request Forgery
  17. @rgielen / @ivar_grimstad #Devoxx #JSR371 <%@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
  18. @rgielen / @ivar_grimstad #Devoxx #JSR371 @ApplicationScoped public class EventObserver {

    void onBeforeController(@Observes BeforeControllerEvent e) { println("URI: " + e.getUriInfo().getRequestURI()); } void onAfterController(@Observes AfterControllerEvent e) { println("Controller: " + e.getResourceInfo().getResourceMethod()); } } Events Example
  19. @rgielen / @ivar_grimstad #Devoxx #JSR371 Real World - Key Questions

    Common Problems Solved for Real World? On Par with comparable Servlet-based Frameworks?
  20. @rgielen / @ivar_grimstad #Devoxx #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
  21. @rgielen / @ivar_grimstad #Devoxx #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 3 Years till getting Real!
  22. @rgielen / @ivar_grimstad #Devoxx #JSR371 Let’s relax a bit… JSR

    371: „Standing on the Shoulder of Giants“ JAX-RS / Jersey CDI Bean Validation Interceptors Facelets, Thymeleaf, Freemarker, Velocity Adds on Top Lightweight Top Layer Extension Points
  23. @rgielen / @ivar_grimstad #Devoxx #JSR371 Common Real World Needs Scoped

    DI Controller Decoupling Controller Testability View Technology Flexibility VDL Expressiveness i18n / l10n Form Binding Type Conversion Declarative Validation Message Passing to View Post-Redirect-Get File Upload UI Controls and Theming AJAX Support Decorator Support Cross Cutting Concerns
  24. @rgielen / @ivar_grimstad #Devoxx #JSR371 Scoped Dependency Injection Spring MVC

    Spring DI Struts 2 Supported Containers Supported Scopes EJB Support Spring MVC Spring DI Application, Session, Request, Redirect, Custom Yes (Adapter Framework) Struts 2 Spring DI, Guice, CDI Application, Session, Request, Redirect, Custom Yes (CDI) JSR 371 / Ozark CDI Application, Session, Request, Redirect, Custom Yes
  25. @rgielen / @ivar_grimstad #Devoxx #JSR371 Controller Decoupling Spring MVC Spring

    DI Struts 2 Controllers as POJOs Coupling to Servlet API required Coupling to Servlet API supported Model Abstraction Spring MVC Yes No Yes Model Container, Return value Struts 2 Yes No Yes Controller Instance, Value Stack JSR 371 / Ozark Yes No Yes Scoped CDI Beans, Model Container
  26. @rgielen / @ivar_grimstad #Devoxx #JSR371 Controller Testing Support Spring MVC

    Spring DI Struts 2 Unit Testing Mocking Support Integration Test Framework Spring MVC Easy Easy Spring Test MVC Struts 2 Easy Easy Struts 2 Test Framework JSR 371 / Ozark Easy Easy No / presumably Jersey Test Framework
  27. @rgielen / @ivar_grimstad #Devoxx #JSR371 Supported View Technologies Spring MVC

    Spring DI Struts 2 JSP Templating DHTML Integration Others Spring MVC Yes Thymeleaf, Freemarker, Velocity, GSP Various 3rd Party Contributions JSON, XML, JasperReports Struts 2 Yes Freemarker, Velocity, Thymeleaf jQuery, Bootstrap, YUI AngularJS JSON, XML, JasperReports JSR 371 / Ozark Yes Facelets, Freemarker, Velocity, Thymeleaf Handlebars, Mustache JSON + XML (JAX-RS), AsciiDoc
  28. @rgielen / @ivar_grimstad #Devoxx #JSR371 Wrap-up: State of MVC Lightweight

    Layer on Top of well established Technologies Easy to extend Addresses most Common Needs Some Gaps and Glitches most can easily addressed by Implementations and Extensions some might be gone in the final Specifications