63
MVC 1.0 Das neue Webframework in Java EE 8 / Christian Kaltepoth @chkal

MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC 1.0Das neue Webframework

in Java EE 8 / Christian Kaltepoth @chkal

Page 2: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Christian KaltepothSenior Developer @ ingenit

/ [email protected] @chkal

http://blog.kaltepoth.de

Page 3: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

WarumMVC 1.0?

Page 4: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Java EE 8 Community Survey

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

Page 5: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JavaServer Facesvs.

MVC 1.0

Page 6: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JavaServer Faces=

Component Oriented

Page 7: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC 1.0=

Action Oriented

Page 8: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Component Orientedvs.

Action Oriented

Page 9: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Das MVCEntwurfsmuster

Page 10: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 11: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 12: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 13: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 14: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 15: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8
Page 16: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC 1.0basiert auf

Java EE 8

Page 17: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC im Kontext

Page 18: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JAX-RS(in < 3 Minuten)

Page 19: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JAX-RS Fakten"Java API for RESTful Web Services"Erstes Release 2008Seit 1.1 Bestandteil von Java EE 6JAX-RS 2.1 -> JSR 370 -> Java EE 8

Page 20: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JAX-RS Beispiel@Path("/hello")public class HelloResource

@GET public String greet() return "Hello world";

Page 21: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JAX-RS Beispiel@Path("/hello")public class HelloResource

@GET public String greet( @QueryParam("name") String name ) return "Hello " + name;

Page 22: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Hello Worldmit

MVC 1.0

Page 23: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Controller@Controller@Path("/hello")public class HelloController

@GET public String render() return "helloworld.jsp";

Page 24: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

View/WEB-INF/views/helloworld.jsp

<!DOCTYPE html><html> <head> <title>MVC Demo</title> </head> <body> <h1>Hello world</h1> </body></html>

Page 25: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Controller@Controller@Path("/hello")public class HelloController

@GET @View("helloworld.jsp") public void render() // ...

Page 26: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Das Modelljavax.mvc.ModelsBasierend auf CDI

Page 27: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

javax.mvc.Models@Controller@Path("/hello")public class HelloController

@Inject private Models models;

@GET public String greet() models.put( "message", "Hello world!" ); return "helloworld.jsp";

Page 28: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

javax.mvc.Models/WEB-INF/views/helloworld.jsp

<!DOCTYPE html><html> <head> <title>MVC Demo</title> </head> <body> <h1>$message</h1> </body></html>

Page 29: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CDI Models@Named@RequestScopedpublic class Greeting

private String message;

public String getMessage() return message;

public void setMessage( String message ) this.message = message;

Page 30: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CDI Models@Controller@Path("/hello")public class HelloController

@Inject private Greeting greeting;

@GET public String greet() greeting.setMessage( "Hello world!" ); return "helloworld.jsp";

Page 31: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CDI Models/WEB-INF/views/helloworld.jsp

<!DOCTYPE html><html> <head> <title>MVC Demo</title> </head> <body> <h1>$greeting.message</h1> </body></html>

Page 32: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Views in MVC 1.0JavaServer PagesFacelets

Page 33: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JSP als View Technologiemodels.put( "messages", Arrays.asList( "Hello W­JAX 2015", "MVC 1.0 rocks") );

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:if test="$not empty messages"> <ul> <c:forEach var="message" items="$messages"> <li>$message</li> </c:forEach> </ul></c:if>

Page 34: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

ViewEngine SPI

Page 35: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Custom ViewEnginesThymeleafFreeMarkerVelocityHandlebarsMustache

StringTemplateJadeAsciiDocJSR223React

Page 36: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Beispiel:Thymeleaf

Page 37: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Thymeleaf@Controller@Path("/thymeleaf")public class ThymeleafController

@Inject private Models models;

@GET public String render()

models.put( "messages", Arrays.asList( "Text #1", "Text #2", "Text #3" ) );

return "thymeleaf.html";

Page 38: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Thymeleaf/WEB-INF/views/thymeleaf.html

<!­­ ... ­­>

<table> <tr th:each="msg: $messages"> <td th:text="$msg"> Some text </td> </tr></table>

<!­­ ... ­­>

<table> <tr> <td>Text #1</td> </tr> <tr> <td>Text #2</td> </tr> <tr> <td>Text #3</td> </tr></table>

Page 39: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Formulare

Page 40: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Einfache Forms/WEB-INF/views/form.jsp

<form action="./form" method="POST">

Bitte geben Sie Ihren Namen ein: <input type="text" name="name"/>

<input type="submit" value="Absenden"/>

</form>

Page 41: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Einfache Forms/WEB-INF/views/form.jsp

<form action="$mvc.basePath/form" method="POST">

Bitte geben Sie Ihren Namen ein: <input type="text" name="name"/>

<input type="submit" value="Absenden"/>

</form>

Page 42: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Einfache Forms@Controller@Path("/form")public class FormController

@Inject private Models models;

@POST public String post( @FormParam("name") String name )

models.put( "message", "Hello " + name ); return "form.jsp";

Page 43: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Komplexe Formspublic class HelloForm

@FormParam("name") private String name;

@FormParam("age") private Integer age;

@FormParam("address") private String address;

/* getter + setter */

Page 44: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Komplexe Forms@Controller@Path("/form")public class FormController

@Inject private Models models;

@POST public String post( @BeanParam HelloForm form )

models.put( "message", "Hello " + form.getName() ); return "form.jsp";

Page 45: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Validation

Page 46: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

JSR 303Bean Validation

Page 47: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Validierungpublic class HelloForm

@FormParam("name") @Size(min = 3, message = "Geben Sie Ihren Namen ein") private String name;

@FormParam("age") @NotNull(message = "Geben Sie Ihr Alter ein") @Min(value = 18, message = "Sie müssen 18 Jahre sein") private Integer age;

/* getter + setter */

Page 48: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Validierung@Controller@Path("/form")public class FormController

@Inject private BindingResult bindingResult;

@POST public String post( @BeanParam @Valid HelloForm form )

if( bindingResult.isFailed() ) models.put( "messages", bindingResult.getAllMessages() ); return "form.jsp";

// Verarbeitung des Forms...

Page 49: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Security

Page 50: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CSRFCross Site Request Forgery

Page 51: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CSRF Beispielhttps://www.example.com/tweet

<form action="/tweet" method="POST">

Bitte geben Sie einen Text ein: <input type="text" name="status"/>

<input type="submit" value="Absenden"/>

</form>

Page 52: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CSRF Beispielhttp://www.bad-guys.com/

<form id="form" style="display: none;" method="POST" action="https://www.example.com/tweet"> <input type="text" name="status" value="PHP ist die beste Sprache der Welt!"/></form>

<a href="javascript:void(0)" onclick="document.getElementById('form').submit();"> Gratis iPhone</a>

Page 53: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Page Token PatternServer erstellt geheimes TokenToken wird in Hidden-Field gerendertPrüfung des Token bei Submit

Page 54: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC 1.0 CSRF ModesOFF Kein Prüfung (Default)

EXPLICIT Prüfung des Tokens mit @CsrfValid

IMPLICIT Prüfung bei jedem POST-Request

Page 55: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

CSRF Beispiel<form action="/tweet" method="POST">

<!­­ CSRF Page Token ­­> <input type="hidden" name="$mvc.csrf.name" value="$mvc.csrf.token"/>

Bitte geben Sie einen Text ein: <input type="text" name="status"/>

<input type="submit" value="Absenden"/>

</form>

Page 56: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Prüfung mit @CsrfValid@Controller@Path("/tweet")public class TweetController

/* ... */

@POST @CsrfValid public String post( @FormParam("status") String s )

/* ... */

Page 57: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

EmpfehlungIMPLICIT verwenden!

Page 58: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC kann mehr...Einfache Redirects aus ControllerCDI Scope: @RedirectScopedMvcContext / #mvcCDI EventsViewEngine SPIHTML/JS Encoding/Escaping

Page 59: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Vollständiges Beispielhttps://github.com/chkal/todo-mvc/

Page 60: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

MVC 1.0 TODOInternationalisierung / LokalisierungTypsicheres Erstellen von URLs...

Page 61: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

ZeitplanQ3 2014 Expert Group formedQ1 2015 Early DraftQ4 2015 Early Draft 2Q1 2016 Public ReviewQ3 2016 Proposed Final DraftH1 2017 Final Release

Page 62: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Feedback erwünschtMailinglist

JIRA

Ozark (RI)

https://java.net/projects/mvc-spec/lists

http://java.net/jira/browse/MVC_SPEC

https://ozark.java.net/

Page 63: MVC 1 - chkal.github.io · JAX-RS Fakten "Java API for RESTful Web Services" Erstes Release 2008 Seit 1.1 Bestandteil von Java EE 6 JAX-RS 2.1 -> JSR 370 -> Java EE 8

Danke!Fragen?

https://github.com/chkal/wjax15-mvchttps://github.com/chkal/todo-mvc

/ Christian Kaltepoth @chkal