Prévia do material em texto
INTRODUÇÃO AO JAVA ENTERPRISE EDITION UNIDADE 1 IINNTTRROODDUUÇÇÃÃOO AAOO JJAAVVAA EENNTTEERRPPRRIISSEE EEDDIITTIIOONN EE PPRRIINNCCIIPPAAIISS TTEECCNNOOLLOOGGIIAASS TTÓÓPPIICCOO 11 11 IINNTTRROODDUUÇÇÃÃOO O Java Enterprise Edition (JEE) inicialmente evoluiu como uma plataforma de desenvolvimento para aplicações enterprise que focava em robustez, webservices e facilidade. Continuamente moldado através do feedback fornecido pelo Java Community Process (JCP), o JEE hoje representa um padrão universal para TI empresarial, facilitando o desenvolvimento, instalação e gerenciamento de aplicações multi-tier e server-centric. O sucesso na adoção da plataforma é inegável. Em maio de 2013, os componentes JEE6 da Oracle e outros fornecedores já contabilizavam 50 milhões de downloads (ORACLE, 2014). O JCP é o mecanismo através do qual são de�nidas as especi�cações Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 1 of 17 26/06/2024, 16:23 técnicas para a tecnologia Java. Ele é aberto para a participação de qualquer pessoa. Maiores detalhes em: <jjccpp..oorrgg//>. Conforme Evans et al. (2011), o modelo de aplicação do JEE começa com a linguagem de programação Java e a Java Virtual Machine. A já conhecida e comprovada portabilidade, segurança e produtividade no desenvolvimento que ela oferece formam a base deste modelo. A plataforma JEE é projetada para suportar aplicações que possuem elevado grau de complexidade, acessando dados das mais variadas fontes e atendendo a um grande número de clientes e requisições. Sua arquitetura facilita o gerenciamento da escalabilidade, pré-requisito para ambientes corporativos de alto desempenho. Esta arquitetura divide o trabalho em duas partes: 1) A lógica de negócio e apresentação: implementadas pelo desenvolvedor.2) Os serviços-padrão que tais aplicações necessitam: ofertadas pela plataforma JEE através do servidor de aplicações. A Figura 1 apresenta uma arquitetura JEE típica: FIGURA 1 - ARQUITURA JEE TÍPICA Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 2 of 17 26/06/2024, 16:23 https://www.jcp.org/ https://www.jcp.org/ FONTE: Evans et al. (2011) Para compreender a �gura, inicialmente é necessária a compreensão do conceito de tier (camada lógica) e de layer (camada física). Tanto a tier quanto a layer podem ser de�nidas como um conjunto de tecnologias que representa um conceito que faz parte da aplicação. A tier é sempre composta por software, ou seja, é lógica. A layer é sempre composta por hardware, ou seja, é física. No caso da �gura, temos quatro tiers e três layers: 1) Client Tier: representa a camada cliente, ou seja, o que os usuários efetivamente acessam da aplicação. Perceba que a �gura a de�ne com duas tecnologias: a aplicação cliente, normalmente uma aplicação desktop desenvolvida com Swing ou JavaFX, e as páginas web, acessadas através de um navegador. Ambas as tecnologias estão no layer representado pela máquina do usuário, ou seja, o computador onde ele acessa a aplicação. 2) Web Tier: representa a camada responsável por fazer a ligação entre as páginas web e a lógica de negócio, representada aqui pela tecnologia Java Server Faces (JSF). Em alguns casos, esta camada é dispensável. Perceba que na �gura, as Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 3 of 17 26/06/2024, 16:23 aplicações clientes acessam a lógica de negócio diretamente, sem esse intermédio. Esta camada poderia ainda ser representada por tecnologias como Servlets e Java Server Pages, que não fazem parte do escopo deste caderno. Se considerarmos a layer, esta parte �ca alocada no JEEServer. 3) Business Tier: representa a lógica de negócios da aplicação, aqui implementada em Enterprise Beans individuais para a aplicação cliente e para as páginas web. Em termos de layer, ainda estamos no JEEServer. 4) Enterprise Information Server (EIS) Tier: representa as fontes de dados que as aplicações acessam através da business tier, normalmente um SGBDR. Esta fonte de dados também pode ser alguma aplicação legada já existente no ambiente corporativo. Agora estamos na layer Database Server. É importante mencionar alguns detalhes a respeito destas de�nições. A Web Tier pode ser implementada em Servlet Containers, que são uma espécie de “mini” servidores de aplicação mais leves e ágeis, entretanto não disponibilizam todos os serviços dos servidores de aplicação. O Apache Tomcat é um exemplo de Servlet Container. Em muitas situações, é mais produtivo desenvolver aplicações somente com Servlet Containers, colocando a lógica de negócio em Plain Old Java Objects (POJOs) do que acrescentar o peso de um servidor de aplicação com Enterprise Beans. É por este motivo que a layer JEEServer é dividida em Web Tier e Business Tier. Cada caso é um caso e deve ser avaliado pesando os prós e contras de cada tecnologia. É o eterno tradeo� da arquitetura de software. Outro detalhe importante é que as layers, com exceção da Client Machine, podem ser todas implementadas em uma única camada física. É possível colocar o JEEServer (com ou sem Web Tier) e o DataBase Server em um único computador, embora isso não seja recomendado. A grande premissa por trás do JEE é que o desenvolvedor pode con�ar na plataforma para facilitar a implementação destes serviços-padrão, normalmente representados por requisitos não funcionais. Como tudo na plataforma Java, o JEE é simplesmente uma especi�cação, ou seja, de�nições e documentos descrevendo como a tecnologia deve se comportar, além de padrões que devem ser obedecidos no desenvolvimento, de�nidos através do JCP. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 4 of 17 26/06/2024, 16:23 No caso do JEE, um dos componentes principais (se não o principal) é o servidor de aplicação. É este servidor de aplicação que encapsulará internamente os serviços que a plataforma oferece. Cabe ao desenvolvedor utilizá-los através das tecnologias de�nidas para tal. Como exemplos de implementações desta especi�cação podemos citar o Jboss, o WildFly e o GlassFish. O Swing e o JavaFX são tecnologias de�nidas pela Oracle para a criação de interfaces em aplicações Desktop. Maiores detalhes podem ser encontrados em: <ddooccss..oorraaccllee..ccoomm//JJaavvaa PPllaattffoorrmm,, SSttaannddaarrdd EEddiittiioonn>. Mas que serviços são estes? Com o advento e popularização da internet e das tecnologias móveis, o número de usuários aumentou exponencialmente. Para atender à estas demandas, diversos requisitos não funcionais passaram a ter uma importância ainda maior para estas aplicações. Termos como escalabilidade, segurança, gerenciamento do ciclo de vida de objetos, remotabilidade, controle de transações, entre outros, vieram a fazer parte do dia a dia dos desenvolvedores. Ou seja, se transformaram em preocupações para os desenvolvedores, que agora não escrevem código somente para lidar com a lógica de negócios e os requisitos funcionais. Algumas das tecnologias disponibilizadas pelo JEE permitem que o desenvolvedor simplesmente sinalize em seu código aspectos relacionados à segurança, remotabilidade, transações etc., e o servidor de aplicações faz todo o resto. Isto libera o desenvolvedor para fazer mais o que realmente é importante: escrever código relacionado às necessidades do usuário e a lógica do negócio. De acordo com ORACLE (2013), o modelo simpli�cado de programação do JEE faz com que os descritores de deployment em XML sejam opcionais. Ao invés disso, o desenvolvedor pode colocar uma informação diretamente no código fonte através das annotations e o servidor irá con�gurar o componente em tempo de execução. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 5 of 17 26/06/2024, 16:23 http://docs.oracle.com/javase/8/javase-clienttechnologies.htm http://docs.oracle.com/javase/8/javase-clienttechnologies.htm • Transações: A arquitetura Enterprise Java Beans (EJB) de�ne um suporte so�sticado para utilização de transações. Esse suporte é integrado com a Java Transaction API (JTA) e oferece inclusive a possibilidade de realizar transações distribuídas. • Segurança: Suporte para realizar autenticação e autorização de forma transparente. Os desenvolvedores das aplicações não precisam implementar a lógica de segurança, pois ela faz parte da arquitetura JEE. • Remotabilidade: Aplicações JEE podem ser acessadas remotamente através de diversos protocolos de comunicação. Consequentemente, é possível desenvolver aplicações clientes de diversos tipos. Por exemplo, aplicações EJB podem ser acessadas como Web Services. • Multithreading e Concorrência: A arquitetura JEE permite que as aplicações sejam acessadas por múltiplos usuários simultaneamente de maneira controlada para evitar problemas de concorrência. • Persistência: Facilidades para utilizar os serviços dos provedores de persistência que seguem a especi�cação JPA. • Gerenciamento de Objetos: Mecanismos de injeção de dependências e controle de ciclo de vida são oferecidos aos objetos de uma aplicação JEE. O mecanismo de controle de ciclo de vida pode garantir a escalabilidade de uma aplicação. • Integração: A arquitetura EJB é fortemente integrada com os componentes da plataforma Java EE. Podemos, por exemplo, facilmente integrar os recursos Estas annotations em geral servem para embutir no programa dados que serial de outra forma fornecidos em um deployment descriptor. Com as annotations, você pode colocar a especi�cação do serviço do servidor ao lado do código que será afetado por ele. Abaixo estão listados alguns dos serviços disponibilizados pelas tecnologias envolvidas na plataforma K19 (2013). Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 6 of 17 26/06/2024, 16:23 do JSF em uma aplicação EJB. • Aplicação cliente e applets que executam no cliente. • Servlets, Java Server Faces e Java Server Pages como componentes que executam no servidor. Os enterprise java beans, conhecidos como EJBs fazem parte da especi�cação JEE e fornecem boa parte dos serviços da plataforma. Estudaremos detalhadamente esta tecnologia na Unidade 3 deste Caderno de Estudos. 22 PPRRIINNCCIIPPAAIISS TTEECCNNOOLLOOGGIIAASS Como descrevemos anteriormente, o servidor de aplicação JEE tem como principal característica o oferecimento de serviços para as aplicações nele instalados. Serviços estes geralmente relacionados com requisitos não funcionais como escalabilidade, remotabilidade etc. Para cada um destes serviços existe uma ou mais tecnologias que, trabalhando individualmente ou em conjunto, abstraem o desenvolvedor de detalhes especí�cos da implementação do mesmo. A seguir faremos uma rápida introdução às principais tecnologias que compõem o JEE, conforme de�nido em ORACLE (2014), destacando as que serão abordadas neste Caderno de Estudos. CCoommppoonneenntteess JJEEEE: As aplicações JEE são feitas de componentes. Estes componentes são unidades encapsuladas de software funcionais que fazem parte das aplicações. Cada componente possui suas próprias classes e arquivos e se comunica com outros componentes. A especi�cação JEE de�ne os seguintes componentes: Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 7 of 17 26/06/2024, 16:23 • Enterprise Java Beans, como componentes de negócio que executam no servidor. Todos estes componentes são escritos na linguagem de programação Java e compilados da mesma forma como qualquer outro programa. A diferença é que estes componentes são “embutidos” dentro de aplicações que obedecem às especi�cações JEE e são, portanto, gerenciadas pelo servidor de aplicação. JJaavvaa SSeerrvveerr FFaacceess ((JJSSFF)): É um framework para a construção de aplicações web. Permite a utilização de classes Java como implementações de componentes HTML. Oferece validação de entrada, gerenciamento de eventos, conversão de dados entre componentes e objetos de domínio, con�guração de navegação, controle do ciclo de vida dos objetos e a expression language (EL), que permite que componentes da interface grá�ca conversem diretamente com o controlador. JJaavvaa PPeerrssiisstteennccee AAPPII ((JJPPAA)): Apresenta uma solução para a persistência de objetos em ambientes relacionais, usando uma estratégia de mapeamento objeto relacional. A JPA também pode ser utilizada em aplicações não JEE fora do ambiente do servidor. Consiste de uma api de persistência, uma linguagem de query e metadados para mapeamento objeto relacional. JJaavvaa TTrraannssaaccttiioonn AAPPII ((JJTTAA)): Oferece uma inferface-padrão para a demarcação de transações. A arquitetura JEE possui auto commit como default para gerenciar commits e rollbacks dentro de transações. Isso signi�ca que qualquer aplicação que está visualizando um dado que está sendo alterado verá o mesmo atualizado depois de cada operação de leitura ou escrita. Entretanto, caso sua aplicação realize duas operações de acesso a dados em bases diferentes que dependem uma da outra, você pode utilizar a JTA API para demarcar onde a transação inteira começa, termina ou mesmo execute um rollback. Nas tecnologias de bancos de dados, um rollback signi�ca que o banco de dados pode voltar a determinado estado anterior, evitando que um erro seja Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 8 of 17 26/06/2024, 16:23 propagado e mantido no mesmo. CCoonntteexxtt aanndd DDeeppeennddeennccyy IInnjjeeccttiioonn ffoorr JJaavvaa EEEE ((CCDDII)): De�ne um conjunto de serviços do JEE acessíveis via contexto. Projetado para uso com objetos que possuam estado, o CDI tem aplicações diversas, pois representa a injeção de recursos em uma classe através de annotations, garantindo a �exibilidade e o baixo acoplamento no desenvolvimento. JJaavvaa MMeessssaaggee SSeerrvviiccee AAPPII ((JJMMSS)): De�ne um padrão de mensageria que permite que os componentes das aplicações JEE criem, enviem, recebam e leiam mensagens. Permite a comunicação distribuída de forma desacoplada, con�ável e assíncrona. JJaavvaa AAuutthheennttiiccaattiioonn aanndd AAuutthhoorriizzaattiioonn SSeerrvviiccee ((JJAAAASS)): É o serviço que permite a autenticação e autorização de um usuário especí�co ou de um grupo de usuários. Oferece uma maneira desacoplada para a de�nição de aspectos de segurança em uma aplicação JEE. O modelo do JEE permite que as restrições de segurança sejam de�nidas em tempo de deployment e torna as aplicações portáveis para uma vasta gama de implementações de diferentes fornecedores. As regras de controle de acesso são declarativas e de�nidas pelo desenvolvedor. Estas regras são interpretadas quando a aplicação é instalada no servidor, protegendo os desenvolvedores da complexidade da implementação de requisitos de segurança. O JEE permite ainda a utilização de mecanismos de segurança externos, como Active Directory e LDAP, por exemplo. A mesma aplicação pode fazer uso de diversos mecanismos de segurança sem nenhuma alteração no código fonte da mesma. EEnntteerrpprriissee JJaavvaa BBeeaannss ((EEJJBB)): São componentes que possuem atributos e métodos para implementar lógica de negócios. Você pode pensar neles como um bloco de construção que pode ser utilizado individualmente ou em conjunto com outros beans para executar lógica de negócios na aplicação JEE. Os Enterprise Beans podem ser de dois tipos: Unidade1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 9 of 17 26/06/2024, 16:23 • Session beans: representa uma conversação transiente com o cliente. Quando o cliente encerra a execução, o bean e seus dados são perdidos. • Message driven beans: combina características de um session bean e um ouvinte de mensagens, permitindo que um componente de negócios receba mensagens de forma assíncrona. 22..11 AA AARRQQUUIITTEETTUURRAA DDOOSS CCOONNTTAAIINNEERRSS Uma das vantagens do JEE é a possibilidade de utilizá-lo em aplicações de praticamente qualquer porte. Seu modelo desacoplado e �exível facilita a utilização somente dos componentes que fazem sentido para a aplicação. Para entender esta arquitetura, é importante entender de que forma o servidor de aplicação está dividido em containers. A �gura a seguir ilustra o relacionamento entre os containers JEE. FIGURA 2 - RELACIONAMENTO ENTRE CONTAINERS FONTE: Oracle (2014) Perceba que o JEE Server possui dois containers, o Web Container e o EJB Container. A compreensão do funcionamento destes dois containers é fundamental para que se faça bom uso dos serviços do servidor de aplicação e da plataforma JEE. Dentro do Web Container podemos perceber as tecnologias Java Server Faces e Servlet. Uma �gura mais completa conteria ainda as Java Server Pages (JSP). Estas tecnologias representam uma forma de disponibilizar a aplicação através de um Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 10 of 17 26/06/2024, 16:23 navegador web. Sem um webcontainer não é possível publicar páginas html, xhtml e outras, o que impede a criação de aplicações web. Caso sua aplicação seja mandatoriamente acessada através de um navegador, você precisará de um webcontainer. Já o EJB Container é responsável pelo gerenciamento dos Enterprise Java Beans. A maioria dos serviços referentes a requisitos não funcionais �cam sob encargo deste container. Em geral, o acesso aos dados é feito através dele, visto que a JTA não está disponível no Webcontainer. Já dissemos aqui que nada impede a colocação de regras de negócio em POJOs dentro do Webcontainer e mesmo de acessar dados através dele, é simplesmente uma questão de analisar os prós e os contras. No modelo da �gura, os componentes Web interagem com os componentes EJB para a lógica de negócios e o acesso aos dados. Na �gura, ainda existe o que é chamado de Client System, composto pelo Browser e pelo Application Client Container. Este componente representa a interface da aplicação com o cliente, seja pelo navegador, seja por uma aplicação Swing, JavaFX ou mesmo console. Perceba que o application client acessa os EJBs sem intermédio do Webcontainer. Chegando ao �nal deste tópico, onde �zemos a introdução da plataforma Java Enterprise Edition e das principais tecnologias que a compõem, você deve pensar “é muita coisa para estudar”. E realmente, você tem razão, se considerarmos todo o conjunto das tecnologias que compõem o JEE, o volume de APIs é imenso. Entretanto, analisando o escopo de nossa disciplina e deste caderno, nos concentraremos nas tecnologias mais importantes e que impactarão diretamente sua produtividade como desenvolvedor. Nosso objetivo não é esgotar o tema, e sim colocar você produzindo aplicações JEE com as principais tecnologias que a plataforma disponibiliza. Seu sucesso dependerá diretamente de seus estudos futuros, entretanto, aqui forneceremos um embasamento sólido. E então...que tal pôr nossas mãos à obra? Como disse Linus Torvalds, criador do sistema operacional Linux: “Talk is cheap... show me the code”. No próximo tópico aprenderemos como con�gurar e preparar o ambiente que dará suporte ao desenvolvimento JEE. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 11 of 17 26/06/2024, 16:23 RREESSUUMMOO DDOO TTÓÓPPIICCOO • O Java Enterprise Edition (JEE) inicialmente evoluiu como uma plataforma de desenvolvimento para aplicações enterprise que focava em robustez, webservices e facilidade. • A plataforma JEE é projetada para suportar aplicações que possuem elevado grau de complexidade, acessando dados das mais variadas fontes e atendendo a um grande número de clientes e requisições. • A tier é sempre composta por software, ou seja, é lógica. A layer é sempre composta por hardware, ou seja, é física. • A Web Tier pode ser implementada em Servlet Containers, que são uma espécie de “mini” servidores de aplicação mais leves e ágeis, entretanto não disponibilizam todos os serviços dos servidores de aplicação. • A grande premissa por trás do JEE é que o desenvolvedor pode con�ar na plataforma para facilitar a implementação destes serviços padrão, normalmente representados por requisitos não funcionais. • Para cada um destes serviços existe uma ou mais tecnologias que, trabalhando individualmente ou em conjunto, abstraem o desenvolvedor de detalhes especí�cos da implementação do mesmo. • Algumas das tecnologias disponibilizadas pelo JEE permitem que o desenvolvedor simplesmente sinalize em seu código aspectos relacionados à segurança, remotabilidade, transações etc., e o servidor de aplicações faz todo o resto. Bons estudos! NNeessttee ttóóppiiccoo vvooccêê vviiuu qquuee: Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 12 of 17 26/06/2024, 16:23 • Uma das vantagens do JEE é a possibilidade de utilizá-lo em aplicações de praticamente qualquer porte. Seu modelo desacoplado e �exível facilita a utilização somente dos componentes que fazem sentido para a aplicação. AAUUTTOOAATTIIVVIIDDAADDEESS Responder Unidade 1 - Tópico 1 1 Diferencie um servidor de aplicação de um Servlet Container. 2 Explique detalhadamente e exempli�que a diferença entre uma layer e uma tier, no contexto de arquitetura de software. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 13 of 17 26/06/2024, 16:23 Responder A) B) 3 Uma das vantagens da utilização de um AS que obedeça às especi�cações JEE é a disponibilização de serviços que antes eram implementados anualmente pelos desenvolvedores. Neste contexto, avalie a lista de serviços abaixo: I - Segurança através do JAAS. II - Mensageria através do JMS. III - Remotabilidade. IV - Componentização através do JTA. Agora assinale a alternativa que apresenta as sentenças CORRETAS: I, II e III. II e III. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 14 of 17 26/06/2024, 16:23 C) D) Responder Responder I e III. II e IV. 4 A plataforma Java possui vários frameworks, os quais possuem suas próprias vantagens para equipes de desenvolvimento. Além disso, aplicações JEE são construídas por componentes, os quais são unidades encapsuladas de software. Através da plataforma Java, é possível desenvolver aplicações robustas, e realizar persistência em bancos relacionais através do JPA. Neste sentido, disserte sobre o JPA. 5 A linguagem de programação Java permite o desenvolvimento de aplicações simples e robustas, para os mais variados tipos de dispositivos, como notebooks, Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 15 of 17 26/06/2024, 16:23 A) B) C) D) Responder desktops ou aplicativos de celulares. O JEE oferece vários serviços que facilitam o desenvolvimento de aplicações. Analise as a�rmativas a seguir sobre o JEE: I - Enterprise Java Beans são componentes de negócio que executam no servidor. II - Java Server Pages são componentes que executamno servidor. III - JTA oferece uma interface-padrão para transações. IV - CDI representa resolução para o problema do mapeamento objeto relacional. Agora assinale a alternativa referente ao JEE: I, II e III. II e III. I e III. II e IV. Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 16 of 17 26/06/2024, 16:23 Apresentação Tópico 2 Conteúdo escrito por: Todos os direitos reservados © Prof. Cristiano Roberto Franco Unidade 1 - Tópico 1 Livro Digital - Programação para Web II https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii... 17 of 17 26/06/2024, 16:23 https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii/index.html https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii/index.html https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii/index.html https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii/index.html https://livrodigital.uniasselvi.com.br/ADS27_programacao_para_web_ii/index.html