Java EE 7 In Action
Rodrigo Cândido da Silva
@rcandidosilva
http://about.me/rcandidosilva
Agenda
!   Plataforma Java EE
!   Java EE 7
!   Web Socket API 1.0
!   Batch API 1.0
!   Concurrency Utilities
!   JSON API 1.0
!   JAX-RS 2.0
!   Java Message Service 2.0
!   JavaServer Faces 2.2
!   Bean Validation 1.1
!   Java Persistence API 2.1
!   Outras APIs
Plataforma Java
!   Java SE
!   Java ME
!   Java EE
Java Enterprise Edition
!   Suporte ao desenvolvimento de aplicações
“enterprise”
!   Aplicações distribuídas, seguras, escaláveis, de alta
disponibilidade e com baixo custo de manutenção

!   Plataforma para desenvolvimento de software de
pequeno, médio e grande porte em múltiplas
camadas de componentes
!   Componentes “rodam” em um servidor Java EE
Java Enterprise Edition
Java Enterprise Edition
!   Serviços oferecidos pelos containeres Java EE:
!
!
!
!
!
!
!
!
!

  Gestão de memória, ciclo de vida de objetos
  Conexões, Transações, Serviço de nomes
  Segurança
  Tolerância a falhas
  Integração
  WebServices
  Clustering
  Alta disponibilidade
  Confiabilidade...
Java EE History
Java EE 7
	
  

Java EE 6
Java EE 5

J2EE 1.4
J2EE 1.3
CMP,
Connector
Architecture

Web
Services
Mgmt,
Deployment,
Async
Connector

Ease of
Development,
EJB 3, JPA,
JSF, JAXB,
JAX-WS,
StAX, SAAJ

Pruning,
Extensibility
Ease of Dev,
CDI, JAX-RS

JMS 2,
Batch, TX,
Concurrency,
Interceptor,
WebSocket,
JSON	
  

JAX-RPC, CMP/
BMP, JSR 88

Web	
  Profile	
  
	
  
Servlet 3,
EJB 3.1 Lite
	
  

Web	
  Profile	
  
	
  
JAX-RS 2
	
  
Top 10 no Java EE 6
!
!
!
!
!
!
!
!
!
!

 
 
 
 
 
 
 
 
 
 

EJB packaging no WAR
Type-safe deployment injection
Deployment descriptors opcionais (web.xml, etc)
Padronização do Facelets no JSF
EJB em apenas uma classe
Extensibilidade para Servlets e CDI
CDI events
EJBContainer API
@Schedule baseado no modelo Cron
Web Profile
Java EE 7 Themes
Java EE 7 Overview
JSP 2.2

JSF 2.2

JAX-RS
2.0

EL 3.0

Concurrency Utilities
(JSR 236)

Servlet 3.1
Common
Annotations
1.1

Interceptors 1.1

Managed Beans 1.0
Connector
1.6
New

EJB 3.2

JPA 2.1

Major
Release

CDI 1.1

JTA 1.2

Updated

JMS 2.0

Bean Validation 1.1

Portable
Extensions

Batch Applications
(JSR 352)

Java API for JSON
(JSR 353)

Java API for WebSocket
(JSR 356)
WebSocket 1.0
!   Web Socket
!   Modelo de mensagem bi-direcional, full-duplex, TCP
!   Definido pelo W3C

!   Web Socket API 1.0
!   Modelo de programação para Web Sockets da
plataforma Java
!  Anotações (@ServerEndpoint, @ClientEndpoint)

!   Lifecycle callback handlers
!   Permite empactá-los em aplicações Java EE
WebSocket 1.0
Connected !

open

open

message

Client

message

error
message

Server
message

close

Disconnected
WebSocket 1.0

Client

Remote
Endpoint

Session

Message
Handler

Remote
Endpoint

Internet

Session

Message
Handler

Client

Remote
Endpoint

Session

WebSocket
Endpoint

Client

Message
Handler
WebSocket 1.0
Connection Lifecycle
@ServerEndpoint(”/chat”)
public class ChatServer {
Set<Session> peers = ...
@OnOpen
public void onOpen(Session peer) {
peers.add(peer);
}
@OnClose
public void onClose(Session peer) {
peers.remove(peer);
}
...
WebSocket 1.0
WebSocket Communication
...
@OnMessage
public void message(String message, Session client)
throws IOException {
for (Session session : peers) {
if (!session.equals(client)) {
session.getRemote().sendObject(message);
}
}
}
}
Batch API 1.0
!   Serve para executar tarefas não-iterativas e
processos longos
!   Processamento computacional intensivo
!   Pode ser executado em sequencial ou paralelo
!   Pode ser inicializado com:
!   Chamada adhoc
!   Agendado
!  Não há uma API de agendamento incluída
Batch API 1.0
!
!
!
!

  Job: um processo a ser executado
  Step: uma fase do job a ser executada
  JobOperator: gerencia o ciclo do processamento
  JobRepository: metadados dos jobs
Batch API 1.0
Step Example
@Named(“accountReader")
...implements ItemReader... {
public Account readItem() {
// read account using JPA

<step id=”sendStatements”>
<chunk reader=”accountReader”
processor=”accountProcessor”
writer=”emailWriter”
item-count=”10” />
</step>
@Named(“accountProcessor")
...implements ItemProcessor... {
Public Statement processItems(Account account) {
// read Account, return Statement
@Named(“emailWriter")
...implements ItemWriter... {
public void writeItems(List<Statements> statements) {
// use JavaMail to send email
Concurrency Utilities
!   Define uma API simples e padronizada para
utilização de concorrência, sem comprometer a
integridade do container
Concurrency Utilities
Managed Task Executor
public class TestServlet extends HTTPServlet {
@Resource(name=“concurrent/MyExecutorService”)
ManagedExecutorService executor;
Future future = executor.submit(new MyTask());
class MyTask implements Runnable {
public void run() {
... // Task logic
}
}
}
JSON API 1.0
!
!
!
!

  API para parser e geração JSON
  Streaming API
  Object Model API
  Realiza o binding de JSON para objetos Java
JSON API 1.0
Writing JSON (Object Model API)
JsonArray value =
Json.createArrayBuilder()

[
{

.add(Json.createObjectBuilder()
.add("type", "home")

"type": "home ,

.add("number", "212 555-1234")

"number": "212 555-1234"

)

},

.add(Json.createObjectBuilder()

{

.add("type", "fax")

"type": "fax ,

.add("number", "646 555-4567")

"number": "646 555-4567"
}

)
.build();

]
JSON API 1.0
Reading JSON (Streaming API)
{
"firstName": "John", "lastName": "Smith", "age": 25,
"phoneNumber": [
{ "type": "home", "number": "212 555-1234" },
{ "type": "fax", "number": "646 555-4567" }
]
}
Event event = parser.next();

// START_OBJECT

event = parser.next();

// KEY_NAME

event = parser.next();

// VALUE_STRING

String name = parser.getString();

// "John”
JAX-RS 2.0
!
!
!
!
!
!

  Definição de APIs para cliente
  Validar parâmetros via Bean Validation
  Processamento assíncrono (server-side)
  Possível definir filtros e interceptadores
  Content negociation (server-side)
  Suporte a Hypermedia (processar links)
JAX-RS 2.0
Client API
// Get instance of Client
Client client = ClientBuilder.newClient();
// Get customer name for the shipped products
String name = client.target(“../orders/{orderId}/customer”)
.pathParam(”orderId", ”10”)
.queryParam(”shipped", ”true”)
.request()
.get(String.class);
JAX-RS 2.0
Logging Filter
public class RequestLoggingFilter
implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) {
log(requestContext);
// Non-wrapping => returns without invoking next filter
}
...
}
Java Message Service 2.0
  Menos verboso
  Redução de “boilerplate code”
  Suporte a injeção de dependência
  Connection, Session e outros objetos são
automaticamente finalizados (obj.close())
!   Simplificação na API do Java SE e EE
!
!
!
!
Java Message Service 2.0
Old Client API
Java Message Service 2.0
Simplified API
@Inject
private JMSContext context;
@Resource(mappedName = "jms/inboundQueue")
private Queue inboundQueue;
public void sendMessage (String payload) {
context.createProducer().send(inboundQueue, payload);
}
JavaServer Faces 2.2
  Suporte ao Flow Faces
  Integração com HTML 5
  Utilização filas para múltiplas requisições Ajax
  Injeção em todos os artefatos JSF (lifecycle +
converters + validators)
!   Novos componentes: FileUpload & BackButton
!   Mais simples:
!
!
!
!

!   Tag Handler não é mais necessário
!   URLs compactas para mapear TagLibraries
JavaServer Faces 2.2
Pass-Through HTML 5 Components
<html>
...
<input type=“color” jsf:value=“#{colorBean.color2}” />
<input type=“date” jsf:value=“#{calendarBean.date1}” />
...
</html>
JavaServer Faces 2.2
Faces Flow
@Named
@FlowScoped(id="flow-a")
public class FlowABean implements Serializable {
public String getName() {
return "FlowABean";
}
public String getReturnValue() {
return "/return1";
}
@Produces
public Flow getFlow(FlowBuilder builder) {
builder.startNode("router1");
builder.flowReturn("success").fromOutcome("/complete");
builder.flowReturn("errorOccurred").fromOutcome("error");
builder.switchNode("router1")
.navigationCase().condition("#{facesFlowScope.customerId == null}")
.fromOutcome("create-customer")
.defaultOutcome("view-customer");
builder.viewNode("create-customer");
builder.viewNode("maintain-customer-record");
builder.methodCall("upgrade-customer")
.method("#{maintainCustomerBean.upgradeCustomer}").defaultOutcome("view-customer");
builder.initializer("#{maintainCustomerBean.initializeFlow}");
builder.finalizer("#{maintainCustomerBean.cleanUpFlow}");
return builder.getFlow();
}
}
Bean Validation 1.1
!
!
!
!

  Integração com outras especificações
  Validação em parâmetros e/ou retorn de métodos
  Validação elementos de uma coleção
  Constraint composition com OR
Bean Validation 1.1
Method Level Constraints
public void placeOrder(
@NotNull String productName,
@NotNull @Max(“10”) Integer quantity,
@Customer String customer) {
. . .
}
@Future
public Date getAppointment() {
. . .
}
Java Persistence API 2.1
!
!
!
!
!

  Schema generation
  Persistence Contexts não sincronizados
  Bulk update/delete using Criteria API
  User-defined functions using FUNCTION
  Stored Procedure Query
Java Persistence API 2.1
Schema Generation Properties
!   javax.persistence.schema-generation.[database|scripts].action
!   “none”, “create”, “drop-and-create”, “drop”
!   javax.persistence.schema-generation.scripts.[create|drop]-target
!   javax.persistence.schema-generation.[create|drop]-script-source
!   javax.persistence.sql-load-script-source
!   javax.persistence.schema-generation.[create|drop]-source
!   “metadata”, “script”, “metadata-then-script”, “script-thenmetadata”
Java Persistence API 2.1
Stored Procedures
@Entity
@NamedStoredProcedureQuery(name="topGiftsStoredProcedure”,
procedureName="Top10Gifts")
public class Product {
StoredProcedreQuery query = EntityManager.createNamedStoredProcedureQuery(
"topGiftsStoredProcedure");
query.registerStoredProcedureParameter(1, String.class,
ParameterMode.INOUT);
query.setParameter(1, "top10");
query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN);
query.setParameter(2, 100);
. . .
query.execute();
String response = query.getOutputParameterValue(1);
Outros APIs
!   Servlet 3.1
!   Non-blocking I/O, upgrade to WebSocket, security…

!   CDI 1.1
!   Global enablement, @AroundConstruct, @Vetoed…

!   EL 3.0
!   Lambda expressions, collections, operators, standalone API

!   EJB 3.2
!   Truncating CMP/BMP…
Demonstração
Java EE 8
!
!
!
!
!
!
!
!
!
!
!

 
 
 
 
 
 
 
 
 
 
 

JSON-B
JCache
More CDI/EJB alignment
CDI.next()
Cloud, PaaS, multitenancy/SaaS
JMS.next()?
JAX-RS.next()?
Security?
Modularity?
NoSQL?
Action-oriented Web framework/HTML 5?
Perguntas e Respostas

?

GUJavaSC - Java EE 7 In Action

  • 1.
    Java EE 7In Action Rodrigo Cândido da Silva @rcandidosilva http://about.me/rcandidosilva
  • 2.
    Agenda !   PlataformaJava EE !   Java EE 7 !   Web Socket API 1.0 !   Batch API 1.0 !   Concurrency Utilities !   JSON API 1.0 !   JAX-RS 2.0 !   Java Message Service 2.0 !   JavaServer Faces 2.2 !   Bean Validation 1.1 !   Java Persistence API 2.1 !   Outras APIs
  • 3.
    Plataforma Java !  Java SE !   Java ME !   Java EE
  • 4.
    Java Enterprise Edition !  Suporte ao desenvolvimento de aplicações “enterprise” !   Aplicações distribuídas, seguras, escaláveis, de alta disponibilidade e com baixo custo de manutenção !   Plataforma para desenvolvimento de software de pequeno, médio e grande porte em múltiplas camadas de componentes !   Componentes “rodam” em um servidor Java EE
  • 5.
  • 6.
    Java Enterprise Edition !  Serviços oferecidos pelos containeres Java EE: ! ! ! ! ! ! ! ! !   Gestão de memória, ciclo de vida de objetos   Conexões, Transações, Serviço de nomes   Segurança   Tolerância a falhas   Integração   WebServices   Clustering   Alta disponibilidade   Confiabilidade...
  • 7.
    Java EE History JavaEE 7   Java EE 6 Java EE 5 J2EE 1.4 J2EE 1.3 CMP, Connector Architecture Web Services Mgmt, Deployment, Async Connector Ease of Development, EJB 3, JPA, JSF, JAXB, JAX-WS, StAX, SAAJ Pruning, Extensibility Ease of Dev, CDI, JAX-RS JMS 2, Batch, TX, Concurrency, Interceptor, WebSocket, JSON   JAX-RPC, CMP/ BMP, JSR 88 Web  Profile     Servlet 3, EJB 3.1 Lite   Web  Profile     JAX-RS 2  
  • 8.
    Top 10 noJava EE 6 ! ! ! ! ! ! ! ! ! !                     EJB packaging no WAR Type-safe deployment injection Deployment descriptors opcionais (web.xml, etc) Padronização do Facelets no JSF EJB em apenas uma classe Extensibilidade para Servlets e CDI CDI events EJBContainer API @Schedule baseado no modelo Cron Web Profile
  • 9.
    Java EE 7Themes
  • 10.
    Java EE 7Overview JSP 2.2 JSF 2.2 JAX-RS 2.0 EL 3.0 Concurrency Utilities (JSR 236) Servlet 3.1 Common Annotations 1.1 Interceptors 1.1 Managed Beans 1.0 Connector 1.6 New EJB 3.2 JPA 2.1 Major Release CDI 1.1 JTA 1.2 Updated JMS 2.0 Bean Validation 1.1 Portable Extensions Batch Applications (JSR 352) Java API for JSON (JSR 353) Java API for WebSocket (JSR 356)
  • 11.
    WebSocket 1.0 !  Web Socket !   Modelo de mensagem bi-direcional, full-duplex, TCP !   Definido pelo W3C !   Web Socket API 1.0 !   Modelo de programação para Web Sockets da plataforma Java !  Anotações (@ServerEndpoint, @ClientEndpoint) !   Lifecycle callback handlers !   Permite empactá-los em aplicações Java EE
  • 12.
  • 13.
  • 14.
    WebSocket 1.0 Connection Lifecycle @ServerEndpoint(”/chat”) publicclass ChatServer { Set<Session> peers = ... @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ...
  • 15.
    WebSocket 1.0 WebSocket Communication ... @OnMessage publicvoid message(String message, Session client) throws IOException { for (Session session : peers) { if (!session.equals(client)) { session.getRemote().sendObject(message); } } } }
  • 16.
    Batch API 1.0 !  Serve para executar tarefas não-iterativas e processos longos !   Processamento computacional intensivo !   Pode ser executado em sequencial ou paralelo !   Pode ser inicializado com: !   Chamada adhoc !   Agendado !  Não há uma API de agendamento incluída
  • 17.
    Batch API 1.0 ! ! ! !  Job: um processo a ser executado   Step: uma fase do job a ser executada   JobOperator: gerencia o ciclo do processamento   JobRepository: metadados dos jobs
  • 18.
    Batch API 1.0 StepExample @Named(“accountReader") ...implements ItemReader... { public Account readItem() { // read account using JPA <step id=”sendStatements”> <chunk reader=”accountReader” processor=”accountProcessor” writer=”emailWriter” item-count=”10” /> </step> @Named(“accountProcessor") ...implements ItemProcessor... { Public Statement processItems(Account account) { // read Account, return Statement @Named(“emailWriter") ...implements ItemWriter... { public void writeItems(List<Statements> statements) { // use JavaMail to send email
  • 19.
    Concurrency Utilities !  Define uma API simples e padronizada para utilização de concorrência, sem comprometer a integridade do container
  • 20.
    Concurrency Utilities Managed TaskExecutor public class TestServlet extends HTTPServlet { @Resource(name=“concurrent/MyExecutorService”) ManagedExecutorService executor; Future future = executor.submit(new MyTask()); class MyTask implements Runnable { public void run() { ... // Task logic } } }
  • 21.
    JSON API 1.0 ! ! ! !  API para parser e geração JSON   Streaming API   Object Model API   Realiza o binding de JSON para objetos Java
  • 22.
    JSON API 1.0 WritingJSON (Object Model API) JsonArray value = Json.createArrayBuilder() [ { .add(Json.createObjectBuilder() .add("type", "home") "type": "home , .add("number", "212 555-1234") "number": "212 555-1234" ) }, .add(Json.createObjectBuilder() { .add("type", "fax") "type": "fax , .add("number", "646 555-4567") "number": "646 555-4567" } ) .build(); ]
  • 23.
    JSON API 1.0 ReadingJSON (Streaming API) { "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } Event event = parser.next(); // START_OBJECT event = parser.next(); // KEY_NAME event = parser.next(); // VALUE_STRING String name = parser.getString(); // "John”
  • 24.
    JAX-RS 2.0 ! ! ! ! ! !   Definiçãode APIs para cliente   Validar parâmetros via Bean Validation   Processamento assíncrono (server-side)   Possível definir filtros e interceptadores   Content negociation (server-side)   Suporte a Hypermedia (processar links)
  • 25.
    JAX-RS 2.0 Client API //Get instance of Client Client client = ClientBuilder.newClient(); // Get customer name for the shipped products String name = client.target(“../orders/{orderId}/customer”) .pathParam(”orderId", ”10”) .queryParam(”shipped", ”true”) .request() .get(String.class);
  • 26.
    JAX-RS 2.0 Logging Filter publicclass RequestLoggingFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { log(requestContext); // Non-wrapping => returns without invoking next filter } ... }
  • 27.
    Java Message Service2.0   Menos verboso   Redução de “boilerplate code”   Suporte a injeção de dependência   Connection, Session e outros objetos são automaticamente finalizados (obj.close()) !   Simplificação na API do Java SE e EE ! ! ! !
  • 28.
    Java Message Service2.0 Old Client API
  • 29.
    Java Message Service2.0 Simplified API @Inject private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); }
  • 30.
    JavaServer Faces 2.2  Suporte ao Flow Faces   Integração com HTML 5   Utilização filas para múltiplas requisições Ajax   Injeção em todos os artefatos JSF (lifecycle + converters + validators) !   Novos componentes: FileUpload & BackButton !   Mais simples: ! ! ! ! !   Tag Handler não é mais necessário !   URLs compactas para mapear TagLibraries
  • 31.
    JavaServer Faces 2.2 Pass-ThroughHTML 5 Components <html> ... <input type=“color” jsf:value=“#{colorBean.color2}” /> <input type=“date” jsf:value=“#{calendarBean.date1}” /> ... </html>
  • 32.
    JavaServer Faces 2.2 FacesFlow @Named @FlowScoped(id="flow-a") public class FlowABean implements Serializable { public String getName() { return "FlowABean"; } public String getReturnValue() { return "/return1"; } @Produces public Flow getFlow(FlowBuilder builder) { builder.startNode("router1"); builder.flowReturn("success").fromOutcome("/complete"); builder.flowReturn("errorOccurred").fromOutcome("error"); builder.switchNode("router1") .navigationCase().condition("#{facesFlowScope.customerId == null}") .fromOutcome("create-customer") .defaultOutcome("view-customer"); builder.viewNode("create-customer"); builder.viewNode("maintain-customer-record"); builder.methodCall("upgrade-customer") .method("#{maintainCustomerBean.upgradeCustomer}").defaultOutcome("view-customer"); builder.initializer("#{maintainCustomerBean.initializeFlow}"); builder.finalizer("#{maintainCustomerBean.cleanUpFlow}"); return builder.getFlow(); } }
  • 33.
    Bean Validation 1.1 ! ! ! !  Integração com outras especificações   Validação em parâmetros e/ou retorn de métodos   Validação elementos de uma coleção   Constraint composition com OR
  • 34.
    Bean Validation 1.1 MethodLevel Constraints public void placeOrder( @NotNull String productName, @NotNull @Max(“10”) Integer quantity, @Customer String customer) { . . . } @Future public Date getAppointment() { . . . }
  • 35.
    Java Persistence API2.1 ! ! ! ! !   Schema generation   Persistence Contexts não sincronizados   Bulk update/delete using Criteria API   User-defined functions using FUNCTION   Stored Procedure Query
  • 36.
    Java Persistence API2.1 Schema Generation Properties !   javax.persistence.schema-generation.[database|scripts].action !   “none”, “create”, “drop-and-create”, “drop” !   javax.persistence.schema-generation.scripts.[create|drop]-target !   javax.persistence.schema-generation.[create|drop]-script-source !   javax.persistence.sql-load-script-source !   javax.persistence.schema-generation.[create|drop]-source !   “metadata”, “script”, “metadata-then-script”, “script-thenmetadata”
  • 37.
    Java Persistence API2.1 Stored Procedures @Entity @NamedStoredProcedureQuery(name="topGiftsStoredProcedure”, procedureName="Top10Gifts") public class Product { StoredProcedreQuery query = EntityManager.createNamedStoredProcedureQuery( "topGiftsStoredProcedure"); query.registerStoredProcedureParameter(1, String.class, ParameterMode.INOUT); query.setParameter(1, "top10"); query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN); query.setParameter(2, 100); . . . query.execute(); String response = query.getOutputParameterValue(1);
  • 38.
    Outros APIs !  Servlet 3.1 !   Non-blocking I/O, upgrade to WebSocket, security… !   CDI 1.1 !   Global enablement, @AroundConstruct, @Vetoed… !   EL 3.0 !   Lambda expressions, collections, operators, standalone API !   EJB 3.2 !   Truncating CMP/BMP…
  • 39.
  • 40.
    Java EE 8 ! ! ! ! ! ! ! ! ! ! !                       JSON-B JCache MoreCDI/EJB alignment CDI.next() Cloud, PaaS, multitenancy/SaaS JMS.next()? JAX-RS.next()? Security? Modularity? NoSQL? Action-oriented Web framework/HTML 5?
  • 41.