SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
Cloud, REST, Scripting Languages,
             JEE6 no
        Google AppEngine

           Edgar Silva
        edgar@redhat.com


                           @jedgarsilva
CoreRest (#corerest)
Representational State Transfer
Casos de Uso

• Simplificação de Serviços

• Web (somente Web)?
• Defina suasemantica        de
  respostas (padrões XML, JSON, SEU)?
Arquiteturas baseadas em
                REST
•   Orientada de recursos (URIs)
•   Orientado a Representações
•   Sem Estado (HTTP)(*)
•   Hypermedia (Design)
•   (*) Gambis
URI (Recursos)

• URL seus recursos de serviços
     http://voos.com.br/saindo/GRU/SDU/amanha
  Serviço de Consulta Voos: Saindo de Guarulhos, chegando
                      em Stos Dummont

   – http://voos.com.br/chegando/agora
   – http://voos.com.br/status/voo/JJ1224
• “Steping Stones”/Linkability/Hypermedia
• QueryStrings: Famosos ?
REST

  • Pense em
    simplicidade
  • Não rodeie, por mais
    que você tente você
    não vai resolver tudo!
  • Lembrese:
  • Simples != Medíocre
4 Métodos para tudo resolve?

• Http
  – GET
  – POST
  – PUT
  – DELETE
Não esqueça que você já fez
     mágica também ...
• SQL
  – Select, Insert, Delete, Update
• JMS
  – Send, Receive
• Windows
  – Reboot
Design Rest
•   Get – Leitura, idempotente, seguro
•   Put – Escrita (insere/atualiza), idempontente
•   Delete – Remover, idempontente
•   Post – Não idempotente
Orientado a Representação

• O Dado pode ter representações
   – O cliente e servidor podem “negociar” um
     formato aceitável entre os dois.

     Cliente                         Server
   “Eu gostaria”                “Pra você eu tenho”
Accept (MIME type)             Content-type
 Accept-Language               header (MIME type)
 Accept-Encoding
REST e Java

• Padrão JCP: JSR 311 - JAX-RS
• Parte do JEE6
• Implementações Padrões de Mercado
  – Jersey (Sun/Oracle)
  – RestEasy (JBoss/RedHat)
REST em Java
@Path("/consulta")

    public class Consulta {

     @GET
     @Path("/sessoes")
     public String getSessoes() {

         //logica
     }

http://servidor:8080/minhaapp/consultas/sessoes



}
REST em Java
@GET
   @Path("/sessoes/{sessao}")
   public String getSessaoByID(@PathParam("sessao") String sessao) {
      // procura pela sessao
   }

    @PUT
    @Path("/sessoes/{sessao}/reservar")
    public void addBook(@PathParam("sessao") String sessao,
                        @QueryParam("email") String email) {

         //grava no banco uma reserva
     }



      http://servidor:8080/minhaapp/evento/sessoes/819

    .. minhaapp/fisl/sessoes/819/reservar?email=edgar@redhat.com



}
Visibilidade de Parametros

•   @QueryParam – Query string
•   @HeaderParam – H T T P header
•   @CookieParam – H T T P c o o k ie
•   @FormParam – Objetos de Forms
•   @PathParam – Caminho U R I
•   @MatrixParam – Lista de URIs
•
JBoss RestEasy




      http://jboss.org/resteasy
Expressões regulares nas URIs
@Path("/servico)
public class MeuServico {
   
@GET
   @Path("{var:.*}/algo")
   public String get() {...}

GET /servico/algo
GET /servico/antes/algo
GET /servico/no/meio/de/algo
Linkabilidade
@Path("/")
@Consumes({"application/xml", "application/json"})
@Produces({"application/xml", "application/json"})
public interface BookStore {

          @AddLinks
          @LinkResource(value = Book.class)
          @GET
          @Path("books")
          public Collection<Book> getBooks();



<?xml version="1.0" encoding="UTF­8" standalone="yes"?>
<book xmlns:atom="http://www.w3.org/2005/Atom" title="foo" author="bar">
 <atom:link href="http://localhost:8081/books" rel="list"/>
 <atom:link href="http://localhost:8081/books" rel="add"/>
 <atom:link href="http://localhost:8081/book/foo" rel="self"/>
 <atom:link href="http://localhost:8081/book/foo" rel="update"/>
 <atom:link href="http://localhost:8081/book/foo" rel="remove"/>
</book>
Linkabilidade
@Path("/")
@Consumes({"application/xml", "application/json"})
@Produces({"application/xml", "application/json"})
public interface BookStore {

         @AddLinks
         @LinkResource(value = Book.class)
         @GET
{        @Path("books")
 "book": public Collection<Book> getBooks();
 {
  "@title":"foo",
  "@author":"bar",
  "atom.link":
   [
    {"@href":"http://localhost:8081/books","@rel":"list"},
    {"@href":"http://localhost:8081/books","@rel":"add"},
    {"@href":"http://localhost:8081/book/foo","@rel":"self"},
    {"@href":"http://localhost:8081/book/foo","@rel":"update"},
    {"@href":"http://localhost:8081/book/foo","@rel":"remove"}
   ]
 }
}
REST Assincrono / COMET
import org.jboss.resteasy.annotations.Suspend;
import org.jboss.resteasy.spi.AsynchronousResponse;

@Path("/")
public class SimpleResource
{

    @GET
    @Path("basic")
    @Produces("text/plain")
    public void getBasic(final @Suspend(10000) AsynchronousResponse response) throws Exception
    {
       Thread t = new Thread()
       {
          @Override
          public void run()
          {
             try
             {
                Response jaxrs = Response.ok("basic").type(MediaType.TEXT_PLAIN).build();
                response.setResponse(jaxrs);
             }
             catch (Exception e)
             {
                e.printStackTrace();
             }
          }
       };
       t.start();
    }
}
Api JavaScript

@Path("orders")
public interface Orders {                     // JavaScript
 @Path("{id}")
 @GET                                         var order =
 public String                                Orders.getOrder({id: 23});
getOrder(@PathParam("id") String id){
  return "Hello "+id;
 }
}

                 // Uso do Objeto REST
                 // Change the base URL used by the API:
                 REST.apiURL = "http://api.service.com";

                 // log everything in a div element
                 REST.log = function(text){
                  jQuery("#log-div").append(text);
                 };
REST é um ótimo modelo de integração,
 quanto empregado de forma simples e
    sem burocracia, melhor ainda.

    Você ainda pode precisar de
SOAP,WSDLs, ou seja: WS Tradicionais,
  mas REST é uma ótima alternativa
Clouds:
Ambiente Elástico Computacional
JBoss PaaS
O Jeito que você programa hoje, pode ser
          o mesmo de amanha?
QA
                  (Dev e Prod)




                         c

Servidor Local

                 Servidores Produção
Apache
 Web Server
+ Mod_Cluster
QA
                                                    (Dev e Prod)


                    Red Hat PaaS
Servidor Local                                             c


                 Servidor Cloud   Servidor Cloud

                                                   Servidores Produção
Apache
 Web Server
+ Mod_Cluster
Serviço: http://corerest.appspot.com
Sources: http://github.com/edgars/corerest
CoreRest

• Um serviço de middleware que roda no
 Google AppEngine que permite a
 criação e execução de Serviços
 baseados em REST usando linguagens
 dinâmicas dentro da JVM e ambiente
 do Google.
CoreRest

Yahoo   Dados Públicos    Twitter   Facebook WebServices



                   CoreRest
                   Services




        Web     Android    IPhone     JavaFX
Tecnologias

•   JBoss RestEasy
•   Java Server Faces 2.0
•   PrettyFaces
•   Objectify
•   Groovy
•   JRuby (Ruby)
•   Java Script Engine
Arquitetura
http://corerest.appspot.com/service/forecast/usa/90210
          CoreRest                  Endpoints   Serviço              URI
                                                                /usa/{zipcode}




 1   Busca o Serviço pelo nome


      2     Identifica a Linguagem do Script


              3      Executa o Fonte do Script via Java Script Engine


                         4     Retorna o Processamento ao cliente
Tá bom!
Me mostre
código!

Hora do
DEMO
Acordem!

Hora da
Demo!
Serviço: http://corerest.appspot.com
Sources: http://github.com/edgars/corerest
Edgar Silva
edgar@redhat.com

Weitere ähnliche Inhalte

Ähnlich wie Core rest edgarsilva_v1

Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
Sergio Alonso
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest
 
Lecture exch2k7 21_10_08 - copy
Lecture exch2k7 21_10_08 - copyLecture exch2k7 21_10_08 - copy
Lecture exch2k7 21_10_08 - copy
Arcobaleno Nesta
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
Corcioli
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
Raffaele Fanizzi
 
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le webMix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Christophe Lauer
 
Glass fishjavaee6directseminar
Glass fishjavaee6directseminarGlass fishjavaee6directseminar
Glass fishjavaee6directseminar
Yoshio Terada
 

Ähnlich wie Core rest edgarsilva_v1 (20)

MS Swit 2010
MS Swit 2010MS Swit 2010
MS Swit 2010
 
Türsteher für Bohnen
Türsteher für BohnenTürsteher für Bohnen
Türsteher für Bohnen
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
 
DevInRio 2010 - NodeJS
DevInRio 2010 - NodeJSDevInRio 2010 - NodeJS
DevInRio 2010 - NodeJS
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
 
HTML5 WebSocket 발표 자료
HTML5 WebSocket 발표 자료HTML5 WebSocket 발표 자료
HTML5 WebSocket 발표 자료
 
Jetty Introduction
Jetty IntroductionJetty Introduction
Jetty Introduction
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
 
Seguridad en Servicios Web
Seguridad en Servicios WebSeguridad en Servicios Web
Seguridad en Servicios Web
 
Lecture exch2k7 21_10_08 - copy
Lecture exch2k7 21_10_08 - copyLecture exch2k7 21_10_08 - copy
Lecture exch2k7 21_10_08 - copy
 
2011 01-18 mongo-db
2011 01-18 mongo-db2011 01-18 mongo-db
2011 01-18 mongo-db
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
 
Perl para sysadmins
Perl para sysadminsPerl para sysadmins
Perl para sysadmins
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesSpring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
 
BDD no mundo real
BDD no mundo realBDD no mundo real
BDD no mundo real
 
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le webMix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
 
Glass fishjavaee6directseminar
Glass fishjavaee6directseminarGlass fishjavaee6directseminar
Glass fishjavaee6directseminar
 
IIS7.5概要 10月17日
IIS7.5概要 10月17日IIS7.5概要 10月17日
IIS7.5概要 10月17日
 

Mehr von Edgar Silva

Mehr von Edgar Silva (20)

API Methodology by Skalena
API Methodology by SkalenaAPI Methodology by Skalena
API Methodology by Skalena
 
Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1
Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1
Flyweigth - Arquitetura de Referência para Open Banking Brasil Fase 1
 
Skalena - Finance Business Unit
Skalena - Finance Business UnitSkalena - Finance Business Unit
Skalena - Finance Business Unit
 
Plataforma de Consentimento (LGDP) Skalena
Plataforma de Consentimento (LGDP) SkalenaPlataforma de Consentimento (LGDP) Skalena
Plataforma de Consentimento (LGDP) Skalena
 
Casos de Sucesso WSO2 no Governo Brasileiro
Casos de Sucesso WSO2 no Governo BrasileiroCasos de Sucesso WSO2 no Governo Brasileiro
Casos de Sucesso WSO2 no Governo Brasileiro
 
DevOps Tour SP 2019
DevOps Tour SP 2019DevOps Tour SP 2019
DevOps Tour SP 2019
 
Skalena - Overview de Soluções
Skalena - Overview de Soluções Skalena - Overview de Soluções
Skalena - Overview de Soluções
 
WSO2 Governance Registry 5.4.0 - Overview
WSO2 Governance Registry 5.4.0 - OverviewWSO2 Governance Registry 5.4.0 - Overview
WSO2 Governance Registry 5.4.0 - Overview
 
WSO2 Enterprise Integrator 6.1 - Integração na Era da Transformação
WSO2 Enterprise Integrator 6.1 - Integração na Era da TransformaçãoWSO2 Enterprise Integrator 6.1 - Integração na Era da Transformação
WSO2 Enterprise Integrator 6.1 - Integração na Era da Transformação
 
Transformação Digital de Forma Pragmatica WSO2
Transformação Digital de Forma Pragmatica WSO2Transformação Digital de Forma Pragmatica WSO2
Transformação Digital de Forma Pragmatica WSO2
 
WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017WSO2 Novo Modelo de Subscrições e Produtos 2017
WSO2 Novo Modelo de Subscrições e Produtos 2017
 
WSO2 API Manager 2.0 - Overview
WSO2 API Manager 2.0 - Overview WSO2 API Manager 2.0 - Overview
WSO2 API Manager 2.0 - Overview
 
Workshop WSO2 BPS 3.5.x - BPMN
Workshop WSO2 BPS 3.5.x - BPMN Workshop WSO2 BPS 3.5.x - BPMN
Workshop WSO2 BPS 3.5.x - BPMN
 
WSO2 Telco MCX
WSO2 Telco MCXWSO2 Telco MCX
WSO2 Telco MCX
 
Workshop MSF4J - Getting Started with Microservices and Java
Workshop MSF4J - Getting Started with Microservices and JavaWorkshop MSF4J - Getting Started with Microservices and Java
Workshop MSF4J - Getting Started with Microservices and Java
 
WSO2 API Manager : Going beyond the just API Management
WSO2 API Manager : Going beyond the just API ManagementWSO2 API Manager : Going beyond the just API Management
WSO2 API Manager : Going beyond the just API Management
 
Workshop/Tutorial WSO2 Micro Services Server
Workshop/Tutorial WSO2 Micro Services ServerWorkshop/Tutorial WSO2 Micro Services Server
Workshop/Tutorial WSO2 Micro Services Server
 
WSO2 Micro Services Server - Basic Workshop Part 1
WSO2 Micro Services Server - Basic Workshop Part 1WSO2 Micro Services Server - Basic Workshop Part 1
WSO2 Micro Services Server - Basic Workshop Part 1
 
Conectando Turismo e Viagens - Plataforma WSO2
Conectando Turismo e Viagens - Plataforma WSO2Conectando Turismo e Viagens - Plataforma WSO2
Conectando Turismo e Viagens - Plataforma WSO2
 
WSO2 Application Server como Alternativa ao Tomcat
WSO2 Application Server como Alternativa ao TomcatWSO2 Application Server como Alternativa ao Tomcat
WSO2 Application Server como Alternativa ao Tomcat
 

Core rest edgarsilva_v1

  • 1.
  • 2. Cloud, REST, Scripting Languages, JEE6 no Google AppEngine Edgar Silva edgar@redhat.com @jedgarsilva
  • 5. Casos de Uso • Simplificação de Serviços • Web (somente Web)? • Defina suasemantica de respostas (padrões XML, JSON, SEU)?
  • 6.
  • 7.
  • 8. Arquiteturas baseadas em REST • Orientada de recursos (URIs) • Orientado a Representações • Sem Estado (HTTP)(*) • Hypermedia (Design) • (*) Gambis
  • 9. URI (Recursos) • URL seus recursos de serviços http://voos.com.br/saindo/GRU/SDU/amanha Serviço de Consulta Voos: Saindo de Guarulhos, chegando em Stos Dummont – http://voos.com.br/chegando/agora – http://voos.com.br/status/voo/JJ1224 • “Steping Stones”/Linkability/Hypermedia • QueryStrings: Famosos ?
  • 10. REST • Pense em simplicidade • Não rodeie, por mais que você tente você não vai resolver tudo! • Lembrese: • Simples != Medíocre
  • 11. 4 Métodos para tudo resolve? • Http – GET – POST – PUT – DELETE
  • 12. Não esqueça que você já fez mágica também ... • SQL – Select, Insert, Delete, Update • JMS – Send, Receive • Windows – Reboot
  • 13. Design Rest • Get – Leitura, idempotente, seguro • Put – Escrita (insere/atualiza), idempontente • Delete – Remover, idempontente • Post – Não idempotente
  • 14. Orientado a Representação • O Dado pode ter representações – O cliente e servidor podem “negociar” um formato aceitável entre os dois. Cliente Server “Eu gostaria” “Pra você eu tenho” Accept (MIME type) Content-type Accept-Language header (MIME type) Accept-Encoding
  • 15. REST e Java • Padrão JCP: JSR 311 - JAX-RS • Parte do JEE6 • Implementações Padrões de Mercado – Jersey (Sun/Oracle) – RestEasy (JBoss/RedHat)
  • 16. REST em Java @Path("/consulta") public class Consulta { @GET @Path("/sessoes") public String getSessoes() { //logica } http://servidor:8080/minhaapp/consultas/sessoes }
  • 17. REST em Java @GET @Path("/sessoes/{sessao}") public String getSessaoByID(@PathParam("sessao") String sessao) { // procura pela sessao } @PUT @Path("/sessoes/{sessao}/reservar") public void addBook(@PathParam("sessao") String sessao, @QueryParam("email") String email) { //grava no banco uma reserva } http://servidor:8080/minhaapp/evento/sessoes/819 .. minhaapp/fisl/sessoes/819/reservar?email=edgar@redhat.com }
  • 18. Visibilidade de Parametros • @QueryParam – Query string • @HeaderParam – H T T P header • @CookieParam – H T T P c o o k ie • @FormParam – Objetos de Forms • @PathParam – Caminho U R I • @MatrixParam – Lista de URIs •
  • 19. JBoss RestEasy http://jboss.org/resteasy
  • 20. Expressões regulares nas URIs @Path("/servico) public class MeuServico {     @GET    @Path("{var:.*}/algo")    public String get() {...} GET /servico/algo GET /servico/antes/algo GET /servico/no/meio/de/algo
  • 21. Linkabilidade @Path("/") @Consumes({"application/xml", "application/json"}) @Produces({"application/xml", "application/json"}) public interface BookStore { @AddLinks @LinkResource(value = Book.class) @GET @Path("books") public Collection<Book> getBooks(); <?xml version="1.0" encoding="UTF­8" standalone="yes"?> <book xmlns:atom="http://www.w3.org/2005/Atom" title="foo" author="bar">  <atom:link href="http://localhost:8081/books" rel="list"/>  <atom:link href="http://localhost:8081/books" rel="add"/>  <atom:link href="http://localhost:8081/book/foo" rel="self"/>  <atom:link href="http://localhost:8081/book/foo" rel="update"/>  <atom:link href="http://localhost:8081/book/foo" rel="remove"/> </book>
  • 22. Linkabilidade @Path("/") @Consumes({"application/xml", "application/json"}) @Produces({"application/xml", "application/json"}) public interface BookStore { @AddLinks @LinkResource(value = Book.class) @GET { @Path("books")  "book": public Collection<Book> getBooks();  {   "@title":"foo",   "@author":"bar",   "atom.link":    [     {"@href":"http://localhost:8081/books","@rel":"list"},     {"@href":"http://localhost:8081/books","@rel":"add"},     {"@href":"http://localhost:8081/book/foo","@rel":"self"},     {"@href":"http://localhost:8081/book/foo","@rel":"update"},     {"@href":"http://localhost:8081/book/foo","@rel":"remove"}    ]  } }
  • 23. REST Assincrono / COMET import org.jboss.resteasy.annotations.Suspend; import org.jboss.resteasy.spi.AsynchronousResponse; @Path("/") public class SimpleResource { @GET @Path("basic") @Produces("text/plain") public void getBasic(final @Suspend(10000) AsynchronousResponse response) throws Exception { Thread t = new Thread() { @Override public void run() { try { Response jaxrs = Response.ok("basic").type(MediaType.TEXT_PLAIN).build(); response.setResponse(jaxrs); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } }
  • 24. Api JavaScript @Path("orders") public interface Orders { // JavaScript @Path("{id}") @GET var order = public String Orders.getOrder({id: 23}); getOrder(@PathParam("id") String id){ return "Hello "+id; } } // Uso do Objeto REST // Change the base URL used by the API: REST.apiURL = "http://api.service.com"; // log everything in a div element REST.log = function(text){ jQuery("#log-div").append(text); };
  • 25. REST é um ótimo modelo de integração, quanto empregado de forma simples e sem burocracia, melhor ainda. Você ainda pode precisar de SOAP,WSDLs, ou seja: WS Tradicionais, mas REST é uma ótima alternativa
  • 28. O Jeito que você programa hoje, pode ser o mesmo de amanha?
  • 29. QA (Dev e Prod) c Servidor Local Servidores Produção
  • 30. Apache Web Server + Mod_Cluster
  • 31. QA (Dev e Prod) Red Hat PaaS Servidor Local c Servidor Cloud Servidor Cloud Servidores Produção
  • 32. Apache Web Server + Mod_Cluster
  • 34. CoreRest • Um serviço de middleware que roda no Google AppEngine que permite a criação e execução de Serviços baseados em REST usando linguagens dinâmicas dentro da JVM e ambiente do Google.
  • 35. CoreRest Yahoo Dados Públicos Twitter Facebook WebServices CoreRest Services Web Android IPhone JavaFX
  • 36. Tecnologias • JBoss RestEasy • Java Server Faces 2.0 • PrettyFaces • Objectify • Groovy • JRuby (Ruby) • Java Script Engine
  • 37. Arquitetura http://corerest.appspot.com/service/forecast/usa/90210 CoreRest Endpoints Serviço URI /usa/{zipcode} 1 Busca o Serviço pelo nome 2 Identifica a Linguagem do Script 3 Executa o Fonte do Script via Java Script Engine 4 Retorna o Processamento ao cliente
  • 39.