Escolar Documentos
Profissional Documentos
Cultura Documentos
About Me
Software Architect
http://integritastech.com
JUG Leader do GUJavaSC
http://gujavasc.org
Twitter
@rcandidosilva
Contatos
http://rodrigocandido.me
Agenda
Arquitetura Rich Client
RESTful Web Services
Java EE 7
JAX-RS
WebSocket
JSON-P
AngularJS
Demo
servidor
Mais stateful
Fraca escalabilidade
Client-side
Complexo e dinmico
Mais stateless
Maior escalabilidade
Asceno do Javascript
O debate cliente leve' vs cliente pesado' antigo
Frameworks web server-side mandaram por um tempo
estado
Server responsvel pela lgica de negcio, modelo de
domnio, persistncia
Web/HTTP a cola que conecta client e server
Protocolos de comunicao comuns
REST na maioria dos casos
WebSocket quando precisa de comunicao full-duplex
Ferramentas Javascript suportam REST muito bem, mas
ainda no WebSocket
O formato comum (talvez ideal?) de troca de dados JSON
Arquitetura REST
Arquitetura REST
Caractersticas:
Protocolo cliente/servidor sem estado (HTTP)
Operaes bem definidas (GET, POST, PUT)
Sintaxe universal para identificao de recursos
(URL)
Transferncia de informaes em formato padro
(XML, HTML, JSON)
Web Services que seguem a arquitetura REST so
denominados RESTful
HATEOAS
Hypermedia As The Engine of Application State
Clientes somente precisam saber a URI root da aplicao e os media
types utilizados
Descrevem o estado atual da aplicao e como navegar para o
prximo estado
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$Prole$
$
Servlet 3,
EJB 3.1 Lite
!
Web$Prole$
$
JAX-RS 2
!
Java EE 7
Java EE + JavaScript
JavaScript/HTML5
JAX-RS
JAXB
Bean Validation
Servlet
EJB 3
JPA
CDI
JMS
JTA
JCA
JAX-RS
Suporte a RESTful em Java
API padronizada
Programao declarativa
Abstraes para implementao no server e client
Servios implementados via POJO
Configurao via anotaes
@Path, @GET, @POST, @PUT, @DELETE, @PathParam,
Plugvel e extensvel
Providers, filters, interceptors, validators
Suporte a processamento assncrono
Integrado com as tecnologias do Java EE
JAX-RS
@Path
@GET
@POST
@PUT
@DELETE
@HEAD
@PathParam
@QueryParam
@Consumes
@Produces
@Provider
@ApplicationPath
Manipulao de Parmetros
Alm do @PathParam h outras cinco anotaes que
@FormParam
Extrai dados de um formulrio (applicaton/x-www-form-urlencoded)
@CookieParam
Extrai dados de cookies (pares nome=valor)
@HeaderParam
Extrai dados de cabealhos HTTP
@MatrixParam
Extrai dados de segmentos de URL
Validao de Dados
Os dados enviados para mtodos em classes de resource
Converso de Dados
ParamConverterProvider pode ser utilizado para gerenciar a
Tratamento de Excees
Gerao e lanamento da exceo customizada
@Path("items/{itemid}/")
public Item getItem(@PathParam("itemid") String itemid) {
Item i = getItems().get(itemid);
if (i == null) {
throw new CustomNotFoundException("Item, " +
itemid + ", is not found");
}
return i;
}
Filtros e Interceptadores
Filtros
Filtros podem ser server side e/ou client side
ContainerRequestFilter, ContainerResponseFilter
ClientRequestFilter, ClientResponseFilter
public class AuthorizationRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
final SecurityContext securityContext =
requestContext.getSecurityContext();
if (securityContext == null ||
!securityContext.isUserInRole("privileged")) {
requestContext.abortWith(Response.status(
Response.Status.UNAUTHORIZED)
.entity("User cannot access the resource.").build());
}
}
}
Interceptadores
Existem dois tipos de interceptors (Reader e Writer)
// @Compress annotation is the name binding annotation
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Compress {}
@Path("helloworld")
public class HelloWorldResource {
@GET @Path("too-much-data")
@Compress
public String getVeryLongString() {...}
}
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException
{...}
}
@Context
@Context pode ser utilizado para injetar diversos objetos
@Context
Request request;
@Context
UriInfo uriInfo;
@PUT
public metodo(@Context HttpHeaders headers) {
String m = request.getMethod();
URI ap
= uriInfo.getAbsolutePath();
Map<String, Cookie> c = headers.getCookies();
}
@GET @Path("auth")
public login(@Context SecurityContext sc) {
String userid =
sc.getUserPrincipal().getName();
if (sc.isUserInRole("admin")) { ... }
}
Hypermedia Support
JAX-RS oferece um modelo para suportar HATEOAS por
Cache Control
JAX-RS suporta configuraes para controle de caching de
@GET
@Path("{id}")
public Response read(@PathParam("id") int id) {
Article article = articleDao.findById(id);
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(60);
return Response.ok(article)
.cacheControl(cacheControl)
.build();
}
Chamadas Assncronas
Possibilita o processamento multithread no servidor,
WebSocket
Oferece comunicao bi-direcional (full-duplex) atravs
WebSocket
Connected !
open
open
message
Client
message
error
message
Server
message
close
Disconnected
WebSocket
Client
Remote
Endpoint
Session
Message
Handler
Remote
Endpoint
Internet
Session
Message
Handler
Client
Remote
Endpoint
Session
WebSocket
Endpoint
Client
Message
Handler
JSON
JavaScript Object Notation
{id:123, cidade:Paris, voos:[M344,J919]}
JSON)
Existem vrias implementaes que fazem mapeamento (binding)
objeto-JSON automtico (no so parte do Java EE)
MOXy, Jettison, Jersey, Jackson, etc.
pelo Java EE
Object Model API - javax.json
Anlogo a DOM: estrutura em rvore; I/O streaming via
decorators
JsonObject: representa um objeto JSON
JsonArray: representa um array JSON
Leitura e gravao usando JsonReader e JsonWriter
JSON Streaming API - javax.json.stream
Anlogo a SAX: leitura sequencial (baixo nvel)
JsonParser: permite ler um stream JSON e capturar eventos
JsonGenerator: mtodos para criar uma estrutura JSON
[
{
.add(Json.createObjectBuilder()
.add("type", "home")
"type": "home ,
},
.add(Json.createObjectBuilder()
.add("type", "fax")
"type": "fax ,
)
.build();
// START_OBJECT
event = parser.next();
// KEY_NAME
event = parser.next();
// VALUE_STRING
// "John
JAXB
JAXB beans permitem reutilizar o mesmo JavaBean
AngularJS
Framework JavaScript MVW* client-side para
AngularJS
Google Trends
AngularJS
Jobs Trends
indeed.com
dice.com
AngularJS
Diferenciais
Organizao da baguna no client-side
Views, modules, controllers, services, providers, etc
Reutilizao de cdigo e modularidade (DRY)
Killer Features
Two-way data binding
Dependency Injection
Controllers, Services
Directives, Filters, Templates, etc
Integrao natural com REST, SOA, SOFEA
tima testabilidade
AngularJS
Two-way data binding
AngularJS
Dependency Injection
AngularJS
Controllers
AngularJS
Services
var services = angular.module(
"myApp.services", ["ngResource"]);
services.factory("LoginService",
function($resource) {
return $resource(":action", {},
{
authenticate: {
method: "POST",
params: {"action":
"authenticate"},
headers: {Content-Type":
"application/json"}}
}
);
});
JavaScript Tools
Demo
Java EE + AngularJS
https://github.com/rcandidosilva/javaee-javascript
Concluses
Clientes Javascript/HTML5 esto conquistando
desenvolvedores
Comunicao entre cliente e servidor em JSON via REST
ou WebSocket
Java EE funciona muito bem como backend para clientes
ricos em Javascript, especialmente JAX-RS, Java API
para WebSockets, e JSON-P
Enjoy it ;)
Perguntas
Muito obrigado!
@rcandidosilva
rodrigocandido.me