76
Web Development in Java Part I Vítor E. Silva Souza ([email protected] ) http://www.inf.ufes.br/ ~ vitorsouza Department of Informatics Federal University of Espírito Santo (Ufes), Vitória, ES – Brazil

Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Embed Size (px)

Citation preview

Page 1: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Web Development in Java Part I

Vítor E. Silva Souza

([email protected]) http://www.inf.ufes.br/~ vitorsouza

Department of Informatics

Federal University of Espírito Santo (Ufes),

Vitória, ES – Brazil

Page 2: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

License'for'use'and'distribu0on'•  This'material'is'licensed'under'the'Crea0ve'Commons''

license'A9ribu0on:ShareAlike'4.0'Interna0onal;'•  You'are'free'to'(for'any'purpose,'even'commercially):'

–  Share:'copy'and'redistribute'the'material'in'any''medium'or'format;'

–  Adapt:'remix,'transform,'and'build'upon'the'material;'•  Under'the'following'terms:'

–  A9ribu0on:'you'must'give'appropriate'credit,'provide'a'link'to'the'license,'and'indicate'if'changes'were'made.'You'may'do'so'in'any'reasonable'manner,'but'not'in'any'way'that'suggests'the'licensor'endorses'you'or'your'use;'

–  ShareAlike:'if'you'remix,'transform,'or'build'upon'the'material,'you'must'distribute'your'contribu0ons'under'the'same'license'as'the'original.'

February'2014' Web'Development'in'Java' 2'

More information can be found at: http://creativecommons.org/licenses/by-sa/4.0/

Page 3: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Outline'of'part'I'

•  Basic'concepts:'what'are'Web'Applica0ons?'

•  History'&'evolu0on'of'WebApps;'

– Quick'demonstra0ons;'

•  Java'EE'Web'Profile;'

•  Tools'for'Java'EE'Web'Profile'development;'

•  Learning'in'prac0ce'–'the'Java'Hostel'demo:'

– Decora0on'with'Facelets;'–  Pages'and'controllers'in'JSF;'– Wiring'components'with'CDI;'

–  Persistence'with'JPA.'

February'2014' Web'Development'in'Java' 3'

Page 4: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

So'you’ve'mastered'Java…'

•  What'about…'

February'2014' Web'Development'in'Java' 4'

AWT/Swing, SWT, JavaFX?

Android, Java ME, Java Card?

Servlets, JSP, JSF, Facelets, CDI… Java EE!

Our focus: Java + Web

Page 5: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

What'is'a'Web'Applica0on?'

•  A'distributed'system;'

•  Access'via'a'Web'browser:'

– HyperText'Transfer'Protocol'(HTTP);'– HTML,'JavaScript,'CSS,'…;'

–  Popular'and'ubiquitous'user'client.'•  Similarity'to'“vanilla”'(non:Web,'regular)'applica0ons:'

–  Composed'of'GUI,'business'rules,'domain'data,'persistence'media,'etc.;'

–  Can'range'from'a'“Hello,'world!”'to'very'complex,'millions:of:users,'MLOCs'systems.'

February'2014' Web'Development'in'Java' 5'

According to http://www.informationisbeautiful.net/visualizations/million-lines-of-code/, Facebook has ~ 60 MLOCs (including backend)

Page 6: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

It'started'with'the'(sta0c)'Web'

•  Born'in'1989'as'a'more'effec0ve'communica0on'system'for'CERN'(European'Organiza0on'for'Nuclear'Research).'

February'2014' Web'Development'in'Java' 6'

Tim Berners-Lee,

creator of the WWW

HTTP Request

HTTP Response

GET /index.html HTTP/1.0 Host: www.site.com [...]

HTTP/1.1 200 OK Date: Fri, 15 Apr 2005 22:12:30 GMT Server: Apache/1.3.26 [...] Last-Modified: Wed, 23 Mar 2005 00:43:22 GMT Content-Length: 11379 Content-Type: text/html [...]

Looks for index.html file, merges with headers and sends back

Page 7: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Soon'enough'pages'were'built'dynamically'

February'2014' Web'Development'in'Java' 7'

HTTP Request

HTTP Response

GET /index.cgi HTTP/1.0 Host: www.site.com [...]

HTTP/1.1 200 OK Date: Fri, 15 Apr 2005 22:12:30 GMT Server: Apache/1.3.26 [...] Last-Modified: Wed, 23 Mar 2005 00:43:22 GMT Content-Length: 11379 Content-Type: text/html [...]

1: Runs a program associated with index.cgi; 2: Program returns text contents in HTML 3: Merges the result with HTTP headers and sends it back to client.

Page 8: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Web'Development'was'born'

•  Web'Development'consists'in'wri0ng'programs'that'respond'to'requests'using'HTTP'and'produce'results'in'a'browser:compa0ble'language'(not'just'HTML!);'

•  Many'components'involved:'

–  The'Web'server;'

–  The'Web'pages,'style'sheets,'scripts,'images,'etc.;'

–  Code'in'a'programming'language;'

–  Exis0ng'APIs,'frameworks,'libraries.'

February'2014' Web'Development'in'Java' 8'

Page 9: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Evolu0on'of'Web'technologies'

•  1993:'CGI'–'Common'Gateway'Interface'–'C,'C++,'Fortran,'Perl,'etc.;'

•  1994:'Macromedia'Coldfusion,'PHP;'

•  1995:'Microsoq'ASP;'

•  1996:'Java'Servlets;'•  1999:'JavaServer'Pages'(JSP);'•  …'•  Today:'Rich'Internet'Applica0ons'

– AJAX;'–  Flash'Ac0onScript;'– HTML5,'etc.'

February'2014' Web'Development'in'Java' 9'

Page 10: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

A'brief'word'on'AJAX'

February'2014' Web'Development'in'Java' 10'

•  AJAX'='Asynchronous'JavaScript'and'XML;'

•  S0ll'request:response,'that'hasn’t'changed!'•  JavaScript'makes'a'smaller'request,'using'an'object'called'XMLHttpRequest;'

•  Small'XML'chunks'are'exchanged'between'browser'and'server,'with'par0al'data;'

•  The'webpage’s'Document'Object'Model'(DOM)'is'manipulated;'

•  Only'parts'of'the'(X)HTML'page'are'changed'as'result.'

We will see how to do this in Java!

Page 11: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Evolu0on'of'Java'Web'technologies'

•  1995:'official'launch,'in'the'beginning'was'the'Applet;'

•  1996:'Java'Servlets;'•  1999:'JavaServer'Pages'(JSP);'•  1999:'J2EE'plauorm'(1.3'in'2001,'1.4'in'2003);'

•  2000:'Apache'Struts,'pioneer'MVC'framework;'

•  2004:'JavaServer'Faces;'•  2006:'Java'EE'5;'•  2009:'Java'EE'6;'•  2013:'Java'EE'7.'

February'2014' Web'Development'in'Java' 11'

Page 12: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Java'Servlets'

February'2014' Web'Development'in'Java' 12'

HTTP Response

HTTP Request

GET /hello

Servlet Container

web.xml

1) Read configuration: which class responds to this request?

Servlet

2) Instantiates the Servlet and calls the appropriate method.

Business Logic

3) The method produces an appropriate response,

to send back to client.

Hello, World! The time now is …

Page 13: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Container???'

•  A'container'is'a'soqware'that'manages'components'with'a'very'specific'lifecycle;'

•  A'Servlet'(one'of'many'such'components):'

–  Is'created'when'its'URL'is'requested;'–  Executes'a'method'that'corresponds'to'the'request;'

–  Is'collected'by'the'GC'aqer'the'response.'•  Combined'with'a'soqware'that'“talks”'in'HTTP'through'a'port'(80,'8080,'etc.),'you'get'a'Java'Web'Server.'

February'2014' Web'Development'in'Java' 13'

Page 14: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Back'to'Servlets…'

•  Not'necessarily'for'the'Web;'

•  The'Web'Servlet,'the'most'used'one,'implements'javax.servlet.http.HttpServlet:'

–  doGet(),'doPost(),'etc.;'–  init(),'destroy();'–  HttpServletRequest/Response;'–  response:'setContentType(),'getWriter().'

February'2014' Web'Development'in'Java' 14'

Page 15: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Java'Servlets'

February'2014' Web'Development'in'Java' 15'

Live Demo

Page 16: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Comple0ng'the'Web'Applica0on'

•  A'default'index.html'webpage;'

•  A'form'in'the'page'sends'data'to'the'Servlet:'name'of'the'visitor;'

•  The'Servlet'now'says'“Hello,'<visitor’s'name>”'instead.'

February'2014' Web'Development'in'Java' 16'

Page 17: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

GET'and'POST'requests'

February'2014' Web'Development'in'Java' 17'

Known as “query string”, this is how a GET request sends data. Let’s try sending it via POST instead…

Page 18: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Fast'forward'to'Servlets'3.1…'

•  Annota0ons'for'URL'mapping;'

•  Asynchronous'requests;'•  Non:blocking'I/O;'•  HTTP'upgrade'protocol;'•  Security'upgrades'against'session'fixa0on'a9acks;'•  Etc.'

February'2014' Web'Development'in'Java' 18'

Page 19: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Servlets'are'annoying'

•  Wri0ng'an'en0re'page'with'a'PrintWriter:'

'

•  Map'Servlets'to'URLs:'

February'2014' Web'Development'in'Java' 19'

try (PrintWriter out = resp.getWriter()) { out.write("<html><head><title>Hello!</title></head><body>"); out.write("<h1>Hello, " + req.getParameter("visitor") + "!</h1>"); out.write("<p>The time now is " + new Date() + "</p>"); out.write("</body></html>");

}

@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})

(Also, remember that initially Servlets had to be mapped in web.xml!)

Page 20: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JavaServer'Pages'(JSP)'

February'2014' Web'Development'in'Java' 20'

HTTP Response

HTTP Request

GET/POST /helloWorld.jsp

Servlet Container

Transformed Servlet

2) Automatically transforms the JSP in a Servlet and calls it

Business Logic

3) The response looks like the execution of the page as a

script (like PHP)

Hello, visitor! The time now is …

1) Looks for the helloWorld.jsp file

Web pages

Page 21: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JSP'Standard'Tag'Library'

•  Tag'Libraries'provide'tags'that'encapsulate'func0onality'common'to'many'JSP'applica0ons;'

•  JSTL'defines'a'standard'set'of'tags'that'all'Java'Web'Servers'must'implement'(standardiza0on'effort):'

–  Core:'variable'support,'flow'control,'URL'management,'miscellaneous;'

–  XML:'XML'transforma0on'and'other'func0ons;'

–  I18N:'locale'se{ng,'message'forma{ng,'number/date'forma{ng;'

–  SQL:'database'opera0ons;'–  Func0ons:'collec0on'length,'string'manipula0on.'

February'2014' Web'Development'in'Java' 21'

Page 22: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JSP'Standard'Tag'Library'

•  Examples:'

February'2014' Web'Development'in'Java' 22'

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:forEach var="item" items="${sessionScope.cart.items}"> ... </c:forEach> <c:set var="bookId" value="${param.Remove}"/> <jsp:useBean id="bookId" type="java.lang.String" /> <% cart.remove(bookId); %> <sql:query var="books" dataSource="${applicationScope.bookDS}"> select * from PUBLIC.books where id = ? <sql:param value="${bookId}" /> </sql:query> <c:url var="url" value="/catalog" > <c:param name="Add" value="${bookId}" /> </c:url> <p><strong><a href="${url}">

Page 23: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Something'wrong'with'this'model…'

•  Not'the'ideal'place'for'business'logic:'

February'2014' Web'Development'in'Java' 23'

<html> [...] <% Connection conn; PreparedStatement stmt; conn = Database.connect(); stmt = conn.prepareStatement("SQL"); ResultSet rs = stmt.executeQuery(); // Business logic here... stmt = conn.prepareStatement("SQL"); stmt.executeUpdate(); %> [...] </html>

Page 24: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

February'2014' Web'Development'in'Java' 24'

HTTP Response

HTTP Request

GET/POST /hello.action

Servlet Container

some.xml

1) Read configuration: which class responds

to this request?

Action class

2) Instantiates and executes the action class.

Business Logic

Front Controller

*.action

Model'2'or'MVC'

3) Depending on the response, chooses the appropriate view and

sends it back to the client

Hello, visitor! The time now is …

Page 25: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Model:View:Controller'

•  Born'in'the'1970s'for'Smalltalk'in'the'Xerox'PARC;'

•  Originally'for'GUIs'(Swing'also'based'on'it);'•  But'also'well:suited'for'the'Web:'

– Web'pages'and'other'Web'resources'are'the'view:'focus'on'presenta0on;'

–  Your'business'logic'is'the'model:'informa0on'and'func0onality,'independent'of'presenta0on;'

–  The'framework'and'your'ac0on'classes'are'the'controller:'mediator'between'model'and'view.'

February'2014' Web'Development'in'Java' 25'

Page 26: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Example'in'Struts2'

February'2014' Web'Development'in'Java' 26'

<s:form namespace="/examples" action=”calculateAge" method="post"> <s:textfield label=”Name" name=”name" /> <s:textfield label=”Birth date" name=”birthDate" /> <s:submit value=”Calculate Age" />

</s:form>

public class CalculateAgeAction extends ActionSupport { private String name; private Date birthDate; private int age; // + getters and setters public String execute() throws Exception { age = calculateDifference(birthDate, new Date()); return SUCCESS; }

}

<p>Hello ${name}, you are ${age} years old.</p>

From the Struts2 tag library, by the way…

This, instead, is FreeMarker…

Page 27: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Further'room'for'improvement…'

•  Low'produc0vity'due'to'lack'of'reusable'components;'

•  Vast'range'of'frameworks,'no'standard;'

•  Lack'of'good'IDE'support'(related'to'previous'issues);'•  Separa0on'of'roles'could'be'further'improved.'

February'2014' Web'Development'in'Java' 27'

Page 28: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JavaServer'Faces'

•  Standard'specifica0on:'1.0,'1.1'in'2004,'1.2'in'2006'(Java'EE'5),'2.0'in'2008'(Java'EE'6);'

–  Currently'in'version'2.2,'part'of'Java'EE'7;'•  Builds'on'the'idea'of'reusable'components;'

•  Similar'to'an'MVC'framework:'

–  Component:based'instead'of'ac0on:based;'

–  Represents'UI'components'and'manages'their'state;'

–  Event'handling;'– Naviga0on'control;'–  Component'tag'library.'

February'2014' Web'Development'in'Java' 28'

Page 29: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JSF'component'libraries'

February'2014' Web'Development'in'Java' 29'

Page 30: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JSF'component'libraries'

February'2014' Web'Development'in'Java' 30'

Page 31: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JavaServer'Faces'

February'2014' Web'Development'in'Java' 31'

Live Demo

Page 32: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Java'Edi0ons'

•  Standard'Edi0ons:'–  Java'1.0'(1996);'–  Java'1.1'(1997);'–  J2SE'1.2'(1998);'–  J2SE'1.3'(2000);'–  J2SE'1.4'(2002);'–  Java'1.5'/'Java'5'(2004);'–  Java'SE'6'(2006);'–  Java'SE'7'(2011);'–  Java'SE'8'(expected'2014);'–  Java'SE'9'(expected'2016).'

•  Enterprise'Edi0ons:'

–  JPE'project'(1998);'–  J2EE'1.2'(1999);'–  J2EE'1.3'(2001);'–  J2EE'1.4'(2003);'–  Java'EE'5'(2006);'–  Java'EE'6'(2009);'–  Java'EE'7'(2013).'

February'2014' Web'Development'in'Java' 32'

Page 33: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Java'for'the'enterprise'

•  Sun'Microsystems'started'with'extensions'for'enterprise'Java'customers.'Examples:'

–  JNDI:'Java'Naming'and'Directory'Interface;'

–  JTS:'Java'Transac0ons'Service;'•  Loose'extensions'were'confusing'at'first,'so'eventually'Sun'joined'them'together'in'a'plauorm:'J2EE;'

•  Sun'provided'the'spec,'a'reference'implementa0on'and'a'compa0bility'test'suite'to'cer0fy'applica0on'servers;'

•  [Applica0on'Programming'|'Service'Provider]'Interface:'

–  Programmers'write'code'to'the'API;'

– Vendors'implement'the'API'via'SPIs.'

February'2014' Web'Development'in'Java' 33'(In theory)

Page 34: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Remember'containers?'

•  Java'EE'applica0on'servers'are'also'containers'to:'–  Servlets;'–  Enterprise'Java'Beans;'–  Transac0ons;'–  Etc.'

February'2014' Web'Development'in'Java' 34'

J2EE 1.2 JDBC Standard Extension API 2.0 Java Naming and Directory Interface Specification (JNDI)

1.2

RMI-IIOP 1.0 Java Servlets 2.2 JavaServer Pages (JSP) 1.1 Enterprise JavaBeans (EJB) 1.1 Java Message Service API (JMS) 1.0 Java Transaction API (JTA) 1.0 JavaMail API 1.1 JavaBeans Activation Framework (JAF) 1.0

Page 35: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Enterprise'Java'Beans'

•  At'the'core'of'J2EE:'–  Session'EJBs'provided'func0onality;'–  En0ty'EJBs'represented'domain'concepts'and'provided'persistence;'

– Message:driven'EJBs'respond'to'events.'

•  Unfortunately,'it'suffered'a'lot'of'problems:'

– Very'complex'API,'driqed'away'from'OO;'

–  Persistence'of'En0ty'EJBs'was'terrible;'–  Poor'performance.'

•  Got'eventually'replaced'by'“lightweight”'frameworks,'such'as'Hibernate'and'Spring'Framework.'

February'2014' Web'Development'in'Java' 35'

Trivia: EJB-OSS

! JBOSS

! JBoss

Page 36: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

De'facto'vs.'de'jure'

•  Popularity'of'frameworks'led'to'a'major'change'of'standards;'

•  Beginning'in'Java'EE'5,'many'of'its'technologies'were'“inspired”'by'frameworks:'

–  JPA'is'just'like'Hibernate'(Gavin'King'led'the'spec);'–  CDI'uses'dependency'injec0on,'like'Spring;'–  Facelets'provides'decora0on'like'Sitemesh/Tiles;'

–  JSF'has'MVC:like'behavior.'

February'2014' Web'Development'in'Java' 36'

If you can’t win…

Page 37: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Java'EE'6:'pruning'and'Web'Profile'

February'2014' Web'Development'in'Java' 37'

Java EE 6 Web Profile Bean Validation Common Annotations for the Java

Platform

CDI (Contexts and Dependency Injection) for the Java EE Platform

EJB (Enterprise Java Beans) Lite

EL (Expression Language) Entity Beans

JACC (Java Authorization Service Provider Contract for Containers)

Interceptors

Java EE Deployment API JASPIC (Java Authentication Service Provider Interface for Containers)

JavaMail Java EE Management API

JAX-RS (Java API for RESTful Web Services) JAX-RPC (Java API for XML-based RPC)

JAXR (Java API for XML Registries) JAXB (Java Architecture for XML Binding)

JMS (Java Messaging Service) JCA (Java EE Connector Architecure)

JSF (JavaServer Faces) JPA (Java Persistence API)

JSTL (Standard Tag Library for JavaServer Pages)

JSP (JavaServer Pages)

Managed Beans JTA (Java Transaction API)

Web Services Metadata for the Java Platform Servlet

Page 38: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

My'proposed'architecture'

February'2014' Web'Development'in'Java' 38'

Web pages

Managed Beans

Entities

Session Beans DAOs

JSF JPA

Facelets Primefaces

CDI

Page 39: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Tools/for/Java/EE/development/Installing'and'configuring'the'database,'IDE'and'applica0on'server'

February'2014' Web'Development'in'Java' 39'

Page 40: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Vast'assortment'of'tools'

February'2014' Web'Development'in'Java' 40'

Application Servers

Database Management Systems

IDEs

And these are just some examples…

Page 41: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Our'choice'for'this'tutorial'

February'2014' Web'Development'in'Java' 41'

WildFly 8 CR1 (formerly JBoss Application Server) http://wildfly.org

Eclipse IDE 4.3.1 (Kepler) http://www.eclipse.org

MySQL Community Server 5 http://www.mysql.com

Page 42: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Eclipse'4.3.1'

February'2014' Web'Development'in'Java' 42'

Page 43: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Eclipse'4.3.1'

•  Download'Eclipse'IDE'for'Java'EE'Developers;'– Make'sure'you'check'the'OS'version;'

•  Unpack;'•  Execute.'

February'2014' Web'Development'in'Java' 43'

Page 44: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

WildFly'8'CR1'

February'2014' Web'Development'in'Java' 44'

Page 45: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

WildFly'8'CR1'

•  Download;'•  Unpack;'•  Manual'opera0on:'

–  Start'it'via'scripts'inside'bin/'folder;'– Deploy'applica0ons'by'copying'them'to'standalone/deployments/'folder;'

•  Alterna0vely,'integrate'with'Eclipse'with…'

February'2014' Web'Development'in'Java' 45'

Page 46: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

…'JBoss'Tools'

•  Integrate'Eclipse'&'WildFly:'

– Help'>'Install'New'Soqware…;'– Work'with:'h9p://download.jboss.org/jbosstools/updates/stable/kepler/;'

–  Install'JBoss'Web'and'Java'EE'Development''>'JBossAS'Tools,'restart'Eclipse;'

–  File'>'New'>'Other…'>'Server'>'Server;'–  Select'WildFly'and'point'to'the'server’s'directory.'

•  Deploy/undeploy,'start/stop'the'server'from'Eclipse.'

February'2014' Web'Development'in'Java' 46'

Page 47: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

MySQL'Community'Server'5'

February'2014' Web'Development'in'Java' 47'

Page 48: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

MySQL'Community'Server'5'

•  Run'installer:'– MacOS'DMG,'Windows'MSI,'Debian'DEB,'etc.;'

•  Also'install'the'MySQL'WorkBench:'

–  h9p://dev.mysql.com/downloads/tools/workbench/'

•  You'will'also'need'MySQL'Connector/J:'

–  h9p://dev.mysql.com/downloads/connector/j/'

•  Make'sure'the'MySQL'server'is'running'for'the'tutorial'(instruc0ons'depend'on'opera0ng'system).'

February'2014' Web'Development'in'Java' 48'

Page 49: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Giving'WildFly'a'way'to'connect'to'MySQL'

February'2014' Web'Development'in'Java' 49'

Page 50: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Giving'WildFly'a'way'to'connect'to'MySQL'

•  Contents'of'module.xml:'

February'2014' Web'Development'in'Java' 50'

<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-5.1.29-bin.jar"/> </resources> <dependencies> <module name="javax.api"/> </dependencies> </module>

Folder structure

Name of the JAR file inside modules/com/mysql/main MySQL Connector/J depends

on basic Java EE APIs

Page 51: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

The/Java/Hostel/tutorial/Developing'a'Java'EE'Web'Profile'applica0on'from'scratch.'An'overview'of'basic'Java'EE'6'Web'Profile'technologies.'

February'2014' Web'Development'in'Java' 51'

Page 52: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Learn'by'example'

•  Overview'of'some'of'the'main'Java'EE'(Web'Profile)'technologies:'JSF,'Facelets,'CDI,'JPA;'

•  Development'of'a'simple'but'real'applica0on:'the'website'for'a'hostel;'

•  Detailed'instruc0ons'(a'bit'outdated)'in'my'blog:'

–  h9p://www.inf.ufes.br/~vitorsouza/blog/developing:a:java:ee:6:web:profile:applica0on:from:scratch'

•  Other'resources:'–  h9ps://github.com/feees/Sigme/wiki/Como:obter:e:executar:o:Sigme'(in'Portuguese);'

–  h9ps://github.com/nemo:ufes/nemo:u0ls/wiki.'

February'2014' Web'Development'in'Java' 52'

Page 53: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

We'need'a'database'and'user'

February'2014' Web'Development'in'Java' 53'

Page 54: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

We'need'a'database'and'user'

February'2014' Web'Development'in'Java' 54'

Database: javahostel User: javahostel Password: javahostel

Page 55: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

We'also'need'a'data'source'in'WildFly'

•  Change'standalone/configura0on/standalone.xml:'

February'2014' Web'Development'in'Java' 55'

<subsystem xmlns="urn:jboss:domain:datasources:2.0"> <datasources> <datasource jndi-name="java:jboss/datasources/JavaHostel" pool-

name="javaHostelPool" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url> jdbc:mysql://localhost:3306/javahostel </connection-url> <driver>mysql</driver> <security> <user-name>javahostel</user-name> <password>javahostel</password> </security> </datasource>

<drivers> <driver name="mysql" module="com.mysql"/> </drivers> </datasources>

Page 56: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Ready!'What’s'the'plan?'

•  Create'the'project'with'the'appropriate'configura0on;'

•  Apply'a'decorator'so'it'looks'good'right'away;'

•  Write'domain'classes'and'create'the'DB'schema;'

•  Implement'the'guest'registra0on'feature.'

February'2014' Web'Development'in'Java' 56'

JSF

JPA

Facelets

CDI JPA

Page 57: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

1':'Ini0al'project'configura0on'

•  Some'Java'EE'technologies'require'configura0on:'

•  JSF:''– WEB:INF/faces:config.xml;'

–  Resource'bundles,'locale,'naviga0on'rules,'etc.;'– Not'used'in'JavaHostel;'

•  JPA:'– META:INF/persistence.xml;'

– Data'source,'persistence'provider'and'its'proper0es.'

February'2014' Web'Development'in'Java' 57'

Page 58: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

•  Mul0ple'JPA'providers:'

–  The'container'has'one'(or'more)'implementa0on(s):'WildFly'"'Hibernate,'GlassFish'"'EclipseLink;'

–  You'can'add'your'favorite'one'to'the'container;'•  JPA'Providers'are'not'standard'(persistence.xml'is):'

– Hibernate:'hibernate.hbm2ddl.auto'='create;'

–  EclipseLink:'eclipselink.ddl:genera0on'='create:tables;'•  Once'JPA'is'configured,'the'container'is'ready'to'provide'us'with'an'En0ty'Manager,'which'can'perform'ORM'opera0ons'(we’ll'get'there);'

•  JSF'just'needs'the'configura0on'file'to'be'there…'

February'2014' Web'Development'in'Java' 58'

Page 59: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

2':'Let’s'decorate'with'Facelets'

•  Download'an'exis0ng'template'(or'make'your'own):'

–  h9p://www.templatemo.com/preview/templatemo_104_hotel;'

•  Create'a'decorator'file:'HTML'file'with'placeholders''for'parts'of'the'page;'

•  Apply'the'decorator'to'all'pages;'•  You'can'have'different'decorators'for'different'sec0ons,'different'users/roles,'etc.;'

•  We'will'use'XHTML'(HTML'+'XML)'from'now'on.'Trust'me,'it’s'be9er.'

February'2014' Web'Development'in'Java' 59'

Page 60: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

•  Facelets'is'based'on'JSF:'

•  The'decorator'is'a'standard'(X)HTML'page,'but:'

–  <h:body>'and'<h:head>'allow'JSF'features'to'work;'–  Tags'in'the'decorator'show'where'content'goes:'

February'2014' Web'Development'in'Java' 60'

xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"

<ui:insert name="title" /> <ui:insert name="contents">Blank page.</ui:insert>

Default value if page doesn’t provide contents for a specific section.

Page 61: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

•  Pages'that'use'the'decorator'are'not'HTML'documents,'but'Facelets'composi0ons:'

•  Pages'only'need'to'worry'about'their'contents.'No'need'to'repeat'layout'code:'

•  CSS'also'helps'a'lot…'February'2014' Web'Development'in'Java' 61'

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/resources/decorator.xhtml">

<ui:define name="title">Welcome</ui:define> <ui:define name="contents"> <h1>Welcome to JavaHostel</h1> <p>Under development.</p> </ui:define>

Page 62: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

3':'Let’s'talk'about'the'domain'

•  Implement'the'following'domain'classes,'plus'tell'JPA'how'to'map'them'to'rela0onal'database'tables:'

February'2014' Web'Development'in'Java' 62'

Page 63: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

•  Each'class'that'maps'to'the'RDB'is'called'an'En0ty:'

•  Although'not'mandatory,'en00es'should'have'ar0ficial'IDs'to'serve'as'PKs'(again,'trust'me,'it’s'be9er):'

•  Simple'a9ributes'need'no'annota0on'(but'if'must,'you'can'use'@Basic):'

February'2014' Web'Development'in'Java' 63'

@Entity public class ...

@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;

@Basic private String name;

Page 64: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

•  Dates'can'store'date:only,'0me:only'and'date/0me:'

•  Associa0ons'can'be'one:to:many,'many:to:one'and'many:to:many.'Use'standard'collec0ons:'

•  Bi:direc0onal'associa0ons'need'to'be'connected'with'the'other'side'(or'there'will'be'2'associa0ons!):'

February'2014' Web'Development'in'Java' 64'

@Temporal(TemporalType.DATE) private Date birthDate;

@ManyToOne private Guest guest; @OneToMany private Set<Bed> beds;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "room") private Set<Bed> beds;

Page 65: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

4':'We'need'to'create'the'DB'tables…'

•  Do'we'really?'

February'2014' Web'Development'in'Java' 65'

Page 66: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

How'does'it'work?'

February'2014' Web'Development'in'Java' 66'

<property name="hibernate.hbm2ddl.auto" value="create"/>

For even the very wise cannot see all

ends.

Page 67: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

5':'Let’s'actually'DO'something…'

•  Guest'registra0on:'– Guest'enters'her'name,'birthDate,'email'and'password;'

–  If'guest'is'underage,'display'a'message'explaining'minors'cannot'register;'

– Otherwise,'save'the'informa0on'in'the'database'and'display'a'success'message.'

February'2014' Web'Development'in'Java' 67'

Page 68: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

February'2014' Web'Development'in'Java' 68'

Page 69: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

@Named public class RegistrationController implements Serializable { ... Guest getGuest() ... ... String register() ...

... getName() ...

... setName() ...

... getBirthDate() ...

... setBirthDate() ...

How'(the'****)'does'it'work?'

February'2014' Web'Development'in'Java' 69'

JSF Page

JSF Expression Language / CDI

<h:inputText id="name" value="#{registrationController.guest.name}" size="30" /> <h:inputText id="birthDate" value="#{registrationController.guest.birthDate}" size="10"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> <h:commandButton action="#{registrationController.register}" value="Register" />

JSF Controller

Guest.java

JSF Converters!

Page 70: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

JSF'page'<:>'controller'communica0on'

•  Whenever'a'JSF'page'is'rendered,'EL'is'interpreted:'

–  I.e.,'#{registra0onController.guest.name}'becomes'registra0onController.getGuest().getName();'

–  The'registra0onController'object'is'created'for'you;'•  When'you'send'the'next'request'to'the'server,'JSF'will'update'the'state'of'the'components'at'the'controller:'

–  I.e.,'registra0onController.getGuest().setName(n)'is'called,'where'n'='contents'of'the'field;'

–  This'happens'in'any'request,'not'only'the'ones'that'call'registra0onController.someMethod()!'

•  If'the'field'has'a'forma9er,'it'parses/formats'the'data.'

February'2014' Web'Development'in'Java' 70'

Page 71: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Enters'CDI'

•  Why'is'this'par0cular'class'instan0ated'when'the'EL'refers'to'registra0onController?'

– @Named'creates'a'default'EL'reference;'

–  You'can'change'the'default:'@Name("regCtrl");'

•  When'is'this'object'created?'How'many'are'created?'

– @SessionScoped'='one'per'session'(client);'

–  There'are'other'scopes:'request,'conversa0on,'applica0on,'flash'(this'last'one'is'JSF,'not'CDI);'

•  There'is'much'more'to'CDI…'

February'2014' Web'Development'in'Java' 71'

Page 72: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

CDI'meets'EJBs'

February'2014' Web'Development'in'Java' 72'

@Stateless @LocalBean public class RegistrationService ... @PersistenceContext private EntityManager

entityManager; entityManager.persist(guest);

JSF Controller

@EJB private RegistrationService

registrationService; registrationService.register(guest);

RegistrationService EJB

CDI everywhere

Inject

Entity Manager provided by the application server

(WildFly provides Hibernate)

Page 73: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

EJB'stuff'

February'2014' Web'Development'in'Java' 73'

•  @Stateless'='no'state'='no'object'a9ributes;'

–  The'container'can'have'a'share'pool'of'instances;'–  To'store'state,'use'@Stateful,'then'give'it'a'scope;'

– An'EJB'can'also'be'@Singleton'now;'

•  @LocalBean'means'the'EJB'is'not'split'between'interface'and'implementa0on;'

– Now'that'I'think'about'it,'it'should'have'been…'

–  Remote'vs.'local'interface.'

Page 74: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Back'to'JSF'

•  Where'to'go'aqer'the'controller'executes?'

–  Returning'null'or'void,'the'same'page'is'reloaded;'

–  You'can'also'have'naviga0on'rules'in'faces:config.'•  Data'from'the'controller'is'shown'in'the'result'page:'

February'2014' Web'Development'in'Java' 74'

catch (UnderAgeGuestException e) { age = e.getAge(); return "/registration/underage.xhtml";

} return "/registration/success.xhtml";

<p>Dear <h:outputText value="#{registrationController.guest.name}”/>, unfortunately underage people are not allowed to register as guests and, according to your birth date, you have only <h:outputText value="#{registrationController.age}" /> years.</p> <p>Dear <h:outputText value="#{registrationController.guest.name}”/>, welcome to JavaHostel.</p>

Page 75: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

Next'

•  More'on'JSF:'AJAX'support,'converters,'forma9ers,'i18n,'Facelets'components,'etc.;'

•  More'on'CDI:'scopes,'producers,'qualifiers,'interceptors,'decorators,'events,'etc.;'

•  More'on'JPA:'element'collec0ons,'bean'valida0on,'JPQL,'criteria'API,'etc.;'

•  More'on'EJBs:'authoriza0on,'local/remote'interfaces,'singleton'EJBs,'asynchronous'invoca0ons,'etc.;'

•  Use'a'JSF'component'library'(e.g.,'PrimeFaces).'

February'2014' Web'Development'in'Java' 75'

Page 76: Web Development in Java Part I - Informáticavitorsouza/wp-content/uploads/java-en... · Web Development in Java Part I ... • Learning'in'prac0ce'–'the'Java'Hostel'demo:

h9p://nemo.inf.ufes.br/'

February'2014' Web'Development'in'Java' 76'