SlideShare une entreprise Scribd logo
1  sur  37
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
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
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
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
Figura C – Tim Bray, Co-Fundador do XML
Fonte: Linux.com
http://www.linux.com/archive/feature/133149



                                              5
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
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
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
Princípio 1



Configuração dentro do
código

                         9
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
<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) {
                   ...
           }
XML
como uma exceção
  Não uma regra
Anotações do Java EE 6
>   @Stateless
>   @Path
>   @WebServlet
>   @Inject
>   @Named
>   @Entity




                         13
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
Comparação do Canoo Web Test
                    XML                                        Groovy Builder
<project default="test">                         class SimpleTest extends WebtestCase {
 <target name="test">                             void testWebtestOnGoogle() {
  <webtest                                          webtest("Google WebTest Search") {
       name="Google WebTest Search">                 invoke "http://www.google.com/ncr"
    <invoke url="http://www.google.com/ncr" />       verifyTitle "Google"
    <verifyTitle text="Google" />                    setInputField name: "q", value: "WebTest"
    <setInputField name="q" value="WebTest" />       clickButton "I'm Feeling Lucky"
    <clickButton label="I'm Feeling Lucky" />        verifyTitle "Canoo WebTest"
    <verifyTitle text="Canoo WebTest" />            }
  </webtest>                                      }
 </target>                                       }
</project>




                                                                                           15
Princípio 2



A transferência de dados
modela o domínio

                           16
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns5="http://www.themindelectric.com/package/com.esri.is.services.glue.v2.address
xmlns:ns6="http://www.themindelectric.com/package/com.esri.is.services.common.v2/"
xmlns:ns7="http://www.themindelectric.com/package/com.esri.is.services.common.v2.geom/
  <soap:Body>
    <n:findAddressesResponse xmlns:n="v2">
      <Result href="#id0"/>
    </n:findAddressesResponse>
    <id0 id="id0" soapenc:root="0" xsi:type="ns5:AddressManagerInfo">
      <results href="#id1"/>
      <numSuccessful xsi:type="xsd:int">1</numSuccessful>
      <numUnsuccessful xsi:type="xsd:int">1</numUnsuccessful>
      <numCandidateMatches xsi:type="xsd:int">1</numCandidateMatches>
    </id0>
    <id1 id="id1" soapenc:root="0" xsi:type="soapenc:Array" soapenc:arrayType="ns6:Loc
…
<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. -->
…
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
Sintaxe do JSON em um slide




                              Images courtesy: http://www.json.org/
                                                                      20
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
Princípio 3



Projetar linguagens de
programação para humanos

                           22
Contra-exemplo – o:XML
>   Criada por Martin Klang em 2002
>   Linguagem orientada a objetos
>   Funcionalidades:
       Polimorfismo
       Sobrecarga de funções
       Tratamento de exceções        Diagram from: http://www.o-xml.org/documentation/o-xml-tool-chain.html

       Threads




                                                                                                               23
Substituição de String - o:XML vs. Java
<?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?>       class Replace {
<program>                                                           public String replace(String input, String from, String to) {
  <o:function name="ex:replace">                                      StringBuilder result = new StringBuilder();
    <o:param name="input" type="String"/>                             int last = 0;
    <o:param name="from" type="String"/>                              int index = 0;
    <o:param name="to" type="String"/>                                while ((index = input.indexOf(from, last)) != -1) {
    <o:do>                                                              result.append(input.substring(last, index));
        16 Linhas
      <o:variable name="result"/>                                           14 Linhas
                                                                        result.append(to);
      <o:while test="contains($input, $from)">                          last = index + from.length()
        461 Caracteres
        <o:set result="concat($result, substring-before($input,
$from), $to)"/>
                                                                      }     319 Caracteres
                                                                      result.append(input.substring(last));
        <o:set input="substring-after($input, $from)"/>               return result.toString();
      </o:while>                                                    }
      <o:return select="concat($result, $input)"/>                }
    </o:do>
  </o:function>
</program>




                                                                                                                                    24
Substituição de String em o:XML
<?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?>
<program>
  <o:function name="ex:replace">
    <o:param name="input" type="String"/>
    <o:param name="from" type="String"/>
    <o:param name="to" type="String"/>
    <o:do>
      <o:variable name="result"/>
      <o:while test="contains($input, $from)">
        <o:set result="concat($result, substring-before($input, $from), $to)"/>
        <o:set input="substring-after($input, $from)"/>
      </o:while>
      <o:return select="concat($result, $input)"/>
    </o:do>
  </o:function>
</program>

                                                                                  25
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
Java simples
class Replace {
  public String replace(String input, String from, String to) {
    return input.replaceAll(from, to)
  }
}




                                                                  27
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
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
Hello JavaOne (Versão Builder)
public void start(Stage primaryStage) {
  primaryStage.setTitle("Hello JavaOne");
  primaryStage.setScene(SceneBuilder.create()
    .width(400)
    .height(250)
    .fill(Color.ALICEBLUE)
    .root(
      GroupBuilder.create().children(
      TextBuilder.create()
        .x(105)
        .y(120)
        .text("Hello JavaOne")
        .font(new Font(30))
        .build()
      ).build()
    )
  .build());
  primaryStage.show();
}
                                                30
Hello JavaOne (Versão GroovyFX )
GroovyFX.start { primaryStage ->
  def sg = new SceneGraphBuilder()
  sg.stage(
    title: 'Hello JavaOne',
    show: true) {
      scene(
        fill: aliceblue,
        width: 400,
        height: 250) {
          text(
             x: 105,
             y: 120,
             text: "Hello JavaOne"
             font: "30pt")
        }
    }
}
                                     31
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
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
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
Aplicação finalizada



                       35
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
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

Contenu connexe

Tendances

Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Rafael Ponte
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
Java JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDBJava JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDBRicardo Terra
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infowayLucas Aquiles
 
Java 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemJava 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemPetronio Candido
 

Tendances (20)

Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)
 
Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
PHP 7
PHP 7PHP 7
PHP 7
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Java JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDBJava JDBC: Aplicação Java que acessa um SGDB
Java JDBC: Aplicação Java que acessa um SGDB
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infoway
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Java 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemJava 8 - A Evolução da Linguagem
Java 8 - A Evolução da Linguagem
 

En vedette

XML-Free Programming
XML-Free ProgrammingXML-Free Programming
XML-Free ProgrammingStephen Chin
 
Hacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and VisageHacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and VisageStephen Chin
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Stephen Chin
 
Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Stephen Chin
 
JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java WorkshopStephen Chin
 

En vedette (6)

XML-Free Programming
XML-Free ProgrammingXML-Free Programming
XML-Free Programming
 
Crazy JSRs
Crazy JSRsCrazy JSRs
Crazy JSRs
 
Hacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and VisageHacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and Visage
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
 
Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)
 
JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java Workshop
 

Similaire à XML livre de programação

HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSRodrigo Branas
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no androidAlexandre Antunes
 
Javascript levado a serio
Javascript levado a serioJavascript levado a serio
Javascript levado a serioJaydson Gomes
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereJuliano Martins
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...WeOp - The Operations Summit
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )João Moura
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com GrailsWanderson Oliveira
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemRodrigo Valerio
 

Similaire à XML livre de programação (20)

HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJS
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
 
Javascript levado a serio
Javascript levado a serioJavascript levado a serio
Javascript levado a serio
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
Mini Curso Mashup Coreu
Mini Curso Mashup CoreuMini Curso Mashup Coreu
Mini Curso Mashup Coreu
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Web Sphere
Web SphereWeb Sphere
Web Sphere
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com Grails
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 

Plus de Stephen Chin

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2Stephen Chin
 
10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java CommunityStephen Chin
 
Java Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideJava Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideStephen Chin
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java DevelopersStephen Chin
 
Java Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCJava Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCStephen Chin
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleStephen Chin
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)Stephen Chin
 
Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Stephen Chin
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopStephen Chin
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Stephen Chin
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistStephen Chin
 
Internet of Things Magic Show
Internet of Things Magic ShowInternet of Things Magic Show
Internet of Things Magic ShowStephen Chin
 
Zombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadZombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadStephen Chin
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids WorkshopStephen Chin
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and DevicesStephen Chin
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi LabStephen Chin
 
Java 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosJava 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosStephen Chin
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopStephen Chin
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Stephen Chin
 

Plus de Stephen Chin (20)

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2
 
10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community
 
Java Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideJava Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive Guide
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java Developers
 
Java Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCJava Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJC
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming Console
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)
 
Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego Workshop
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile Methodologist
 
Internet of Things Magic Show
Internet of Things Magic ShowInternet of Things Magic Show
Internet of Things Magic Show
 
Zombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadZombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the Undead
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids Workshop
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and Devices
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi Lab
 
Java 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosJava 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and Legos
 
DukeScript
DukeScriptDukeScript
DukeScript
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO Workshop
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
 

XML livre de programação

  • 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) { ... }
  • 12. XML como uma exceção Não uma regra
  • 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
  • 15. Comparação do Canoo Web Test XML Groovy Builder <project default="test"> class SimpleTest extends WebtestCase { <target name="test"> void testWebtestOnGoogle() { <webtest webtest("Google WebTest Search") { name="Google WebTest Search"> invoke "http://www.google.com/ncr" <invoke url="http://www.google.com/ncr" /> verifyTitle "Google" <verifyTitle text="Google" /> setInputField name: "q", value: "WebTest" <setInputField name="q" value="WebTest" /> clickButton "I'm Feeling Lucky" <clickButton label="I'm Feeling Lucky" /> verifyTitle "Canoo WebTest" <verifyTitle text="Canoo WebTest" /> } </webtest> } </target> } </project> 15
  • 16. Princípio 2 A transferência de dados modela o domínio 16
  • 17. <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns5="http://www.themindelectric.com/package/com.esri.is.services.glue.v2.address xmlns:ns6="http://www.themindelectric.com/package/com.esri.is.services.common.v2/" xmlns:ns7="http://www.themindelectric.com/package/com.esri.is.services.common.v2.geom/ <soap:Body> <n:findAddressesResponse xmlns:n="v2"> <Result href="#id0"/> </n:findAddressesResponse> <id0 id="id0" soapenc:root="0" xsi:type="ns5:AddressManagerInfo"> <results href="#id1"/> <numSuccessful xsi:type="xsd:int">1</numSuccessful> <numUnsuccessful xsi:type="xsd:int">1</numUnsuccessful> <numCandidateMatches xsi:type="xsd:int">1</numCandidateMatches> </id0> <id1 id="id1" soapenc:root="0" xsi:type="soapenc:Array" soapenc:arrayType="ns6:Loc …
  • 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
  • 22. Princípio 3 Projetar linguagens de programação para humanos 22
  • 23. Contra-exemplo – o:XML > Criada por Martin Klang em 2002 > Linguagem orientada a objetos > Funcionalidades:  Polimorfismo  Sobrecarga de funções  Tratamento de exceções Diagram from: http://www.o-xml.org/documentation/o-xml-tool-chain.html  Threads 23
  • 24. Substituição de String - o:XML vs. Java <?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?> class Replace { <program> public String replace(String input, String from, String to) { <o:function name="ex:replace"> StringBuilder result = new StringBuilder(); <o:param name="input" type="String"/> int last = 0; <o:param name="from" type="String"/> int index = 0; <o:param name="to" type="String"/> while ((index = input.indexOf(from, last)) != -1) { <o:do> result.append(input.substring(last, index)); 16 Linhas <o:variable name="result"/> 14 Linhas result.append(to); <o:while test="contains($input, $from)"> last = index + from.length() 461 Caracteres <o:set result="concat($result, substring-before($input, $from), $to)"/> } 319 Caracteres result.append(input.substring(last)); <o:set input="substring-after($input, $from)"/> return result.toString(); </o:while> } <o:return select="concat($result, $input)"/> } </o:do> </o:function> </program> 24
  • 25. Substituição de String em o:XML <?xml-stylesheethref="../xsl/default.xsl" type="text/xsl"?> <program> <o:function name="ex:replace"> <o:param name="input" type="String"/> <o:param name="from" type="String"/> <o:param name="to" type="String"/> <o:do> <o:variable name="result"/> <o:while test="contains($input, $from)"> <o:set result="concat($result, substring-before($input, $from), $to)"/> <o:set input="substring-after($input, $from)"/> </o:while> <o:return select="concat($result, $input)"/> </o:do> </o:function> </program> 25
  • 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
  • 27. Java simples class Replace { public String replace(String input, String from, String to) { return input.replaceAll(from, to) } } 27
  • 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
  • 30. Hello JavaOne (Versão Builder) public void start(Stage primaryStage) { primaryStage.setTitle("Hello JavaOne"); primaryStage.setScene(SceneBuilder.create() .width(400) .height(250) .fill(Color.ALICEBLUE) .root( GroupBuilder.create().children( TextBuilder.create() .x(105) .y(120) .text("Hello JavaOne") .font(new Font(30)) .build() ).build() ) .build()); primaryStage.show(); } 30
  • 31. Hello JavaOne (Versão GroovyFX ) GroovyFX.start { primaryStage -> def sg = new SceneGraphBuilder() sg.stage( title: 'Hello JavaOne', show: true) { scene( fill: aliceblue, width: 400, height: 250) { text( x: 105, y: 120, text: "Hello JavaOne" font: "30pt") } } } 31
  • 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