1. Programação livre de XML : Desenvolvimento de
servidor e cliente em Java sem <>
Stephen Chin
Java Evangelist, Oracle
stephen.chin@oracle.com Translation By:
tweet: @steveonjava Marcelo Quinta @mrquinta
2. Nosso plano
> Rápida (Engraçada) história dos colchetes <>
> Programação livre de XML
1. Configuração dentro no código
2. Transferência de dados modela o domínio
3. Design de linguagem de programação para humanos
> Aplicação dos palestrantes do JavaOne <Demo>
2
3. Figura A – Os <> vistos na Virginia, 1922
Fonte: Library of Congress, Prints and Photographs Collection – Public Domain
http://www.flickr.com/photos/pingnews/434444310/
3
4. Figura B - Tri-Angle Brackets das Bermudas
Fonte: NOAA National Ocean Service – CC licensed
http://www.flickr.com/photos/usoceangov/4276194691/sizes/o/in/photostream/
4
5. Figura C – Tim Bray, Co-Fundador do XML
Fonte: Linux.com
http://www.linux.com/archive/feature/133149
5
6. História do XML
> Baseado no Standard Generalized Markup Language (SGML)
> Criado por um grupo de trabalho da W3C com onze membros
Histórico de versões:
XML 1.0 (1998) – Largamente adotado, com 5 revisões subsequentes
XML 1.1 (2004) – Adoção limitada
6
7. Objetivos do projeto XML (a.k.a. problemas com SGML)
1. Utilizável na internet
2. Suportar uma larga variedade de aplicações
3. Compatível com SGML
4. Facilidade de escrever programas para processar documentos XML
5. Mínimo número de funcionalidades opcionais
6. Documentos devem ser legíveis por humanos e razoavelmente
limpos
7. Projeto deve ser preparado rapidamente
8. Projeto deve ser formal e conciso
9. Documentos devem ser fáceis de criar
10. Concisão na marcação é de importância mínima 7
8. Metas do projeto por aplicação
Publicação Configuração Transferência de dados Programação
Utilizável via internet Importante N/A Importante N/A
Larga variedade de apps Aceitável Negativo N/A N/A
Compatível com SGML Importante Negativo Negativo Negativo
Processável por computador Importante Importante Importante Importante
Sem funcionalidades opcionais Importante Importante Importante Importante
Legível por humanos Importante Importante Aceitável Importante
Projeto rápido Importante N/A N/A N/A
Espec formal e concisa Importante Importante Important N/A
Fácil criar documentos Importante Importante N/A Importante
Marcação verbosa Negativo Negativo Negativo Negativo
8
10. Deixar o XML é difícil!
Isso não é entendido como uma substituição ao formato de XML
do Spring
Rod Johnson sobre Configurações do Spring baseadas em annotations
“A Java configuration option for Spring,” 11/28/06
10
11. <web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>myservlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
...
</web-app>
web.xml
@WebServlet(“/hello”)
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest req
HttpServletResponse res) {
...
}
13. Anotações do Java EE 6
> @Stateless
> @Path
> @WebServlet
> @Inject
> @Named
> @Entity
13
14. Mas há esperança!
Você pode ter uma DSL Groovy… ela é tão curta quanto possível
Dierk Koenig no Canoo Web Test
“Interview with Dierk Koenig,” ThirstyHead.com 6/3/2009
14
18. <xs:schema targetNamespace="http://schemas.xmlsoap.org/soap/envelope/">
<!-- Envelope, header and body --><xs:element name="Envelope" type="tns:Envelope"/>
<xs:complexType name="Envelope"><xs:sequence>
<xs:element ref="tns:Header" minOccurs="0"/>
<xs:element ref="tns:Body" minOccurs="1"/>
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/
</xs:sequence><xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType><xs:element name="Header" type="tns:Header"/>
<xs:complexType name="Header"><xs:sequence>
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/
</xs:sequence><xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType><xs:element name="Body" type="tns:Body"/>
<xs:complexType name="Body"><xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence><xs:anyAttribute namespace="##any" processContents="lax">
<xs:annotation><xs:documentation>
Prose in the spec does not specify that attributes are allowed on the Body element
</xs:documentation></xs:annotation></xs:anyAttribute></xs:complexType>
<!-- Global Attributes. The following attributes are intended to be usable via
qualified attribute names on any complex type referencing them. -->
…
19. JavaScript Object Notation (JSON)
> Combina estruturas relacionais/orientadas a objetos
> Fácil de ler e escrever
> Simples para análise (parse) e geração
> Familiar aos programadores de linguagens baseadas em C:
C, C++, C#, Java, JavaScript, Perl, Python, etc.
> Especificação muito simples.
19
20. Sintaxe do JSON em um slide
Images courtesy: http://www.json.org/
20
21. Amostra do JAX-RS
@Stateless @GET
@Path("sezzion") @Produces({"application/json", "application/xml"})
public class SezzionFacadeREST extends public List<Sezzion> findAll() {
AbstractFacade<Sezzion> { return super.findAll();
@PersistenceContext }
private EntityManager em;
@GET
@POST @Path("{from}/{to}")
@Consumes({"application/json", "application/xml"}) @Produces({"application/xml", "application/json"})
public void create(Sezzion entity) { public List<Sezzion> findRange(@PathParam("from") Integer
super.create(entity); from, @PathParam("to") Integer to) {
} return super.findRange(new int[]{from, to});
}
21
26. Equivalente em Java
class Replace {
public String replace(String input, String from, String to) {
StringBuilder result = new StringBuilder();
int last = 0;
int index = 0;
while ((index = input.indexOf(from, last)) != -1) {
result.append(input.substring(last, index));
result.append(to);
last = index + from.length()
}
result.append(input.substring(last));
return result.toString();
}
}
26
28. JavaFX 2.0
> Gráficos, animação e trato com mídia poderosos
> Roda no navegador ou no desktop
> Inclui construtores para desenvolvimento declarativo
> Linguagens alternativas também podem ser usadas para criação de
interfaces mais simples
GroovyFX
ScalaFX
Visage
28
29. Hello JavaOne (Versão Java)
public class HelloJavaOne extends Application {
public static void main(String[] args) {
launch(HelloJavaOne.class, args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello JavaOne");
Group root = new Group();
Scene scene = new Scene(root, 400, 250, Color.ALICEBLUE);
Text text = new Text();
text.setX(105);
text.setY(120);
text.setFont(new Font(30));
text.setText("Hello JavaOne");
root.getChildren().add(text);
primaryStage.setScene(scene);
primaryStage.show();
}
}
29
32. Hello JavaOne (Versão ScalaFX)
object HelloJavaOne extends JFXApp {
stage = new Stage {
title = "Hello JavaFX"
width = 400
height = 250
scene = new Scene {
fill = BLUE
Text {
x = 105
y = 120
text = "Hello JavaOne"
font = Font(size: 30)
}
}
}
}
32
33. Hello JavaOne (Versão Visage)
Stage {
title: "Hello JavaOne"
width: 400
height: 250
scene: Scene {
fill: BLUE
content: Text {
x: 105
y: 120
text: "Hello JavaOne"
font: Font {size: 30pt}
}
}
}
33
34. Aplicação dos palestrantes do JavaOne
> Aplicação fim-a-fim sem XML
> Servidor desenvolvidos com anotações do Java 6
> Transferência de dados usa JSON
> Cliente escrito em JavaFX 2.0
34
36. Dê suporte a petição “Liberdade do XML” </>
http://steveonjava.com/freedom-from-xml/
Prover alternativas não-XML para:
> Programação declarativa
> Configuração
> Transferência de dados
Assine a petição hoje!
36
37. Obrigado!
Stephen Chin
stephen.chin@oracle.com
tweet: @steveonjava
Desconto especial de 40% para o JustJava.
Entre em apress.com e digite o código PJVF73
37