Arquitetura de uma Webapp Arquitetura J2EE Containers e componentes MVC: introdução Frederico Costa Guedes Pereira 2006 fredguedespereira@gmail.com Plataforma J2EE World Wide Web e a Economia da Informação Informação valerá tanto quanto bens e serviços Desafios das empresas atualmente: Gerenciamento das funções críticas do negócio por sistemas computadorizados (vem sendo feito) Integração entre os sistemas, correlacionando dados de diversas fontes e transformando-os em informações estratégicas (grande desafio) Forma para isso: aplicações distribuídas customizáveis 2 1
Plataforma J2EE O objetivo da J2EE é: Definir um conjunto padrão de funcionalidades que ajudem às empresas a integrarem e escalarem suas aplicações distribuídas às demandas do negócio Para isso, disponibiliza um conjunto de tecnologias novas que simplificam a definição de aplicações empresariais distribuídas através de um modelo baseado em componentes Variedade de aplicações: de cliente/servidor na intranet a aplicações Web baseadas na Internet 3 Plataforma J2EE Visão Geral da Plataforma J2EE: 4 2
Plataforma J2EE Características: Modelo multi-camadas partes diferentes da aplicação executando em diferentes dispositivos Gerenciamento de Componentes por Containers ambientes de execução padronizados que oferecem serviços aos componentes gerenciados Suporte para Componentes Clientes páginas HTML, Applets, aplicações desktop escritas em Java ou outras linguagens Suporte para Componentes de Negócio (EJB) backbone da plataforma e persistência 5 Cenários para aplicações J2EE Cenário completo * Figura obtida de [1] 6 3
Cenários para aplicações J2EE Cenário aplicação multicamadas * Figura obtida de [1] 7 Cenários para aplicações J2EE Cenário centrado na Web Cenário a ser utilizado neste curso! * Figura obtida de [1] 8 4
Cenários para aplicações J2EE Detalhe do container web * Figura obtida de [1] 9 Componentes e containers Componente Unidades de software utilizadas para compor as diversas partes de uma aplicação, tais como, interface e a lógica de negócio. Só existem sobre um ambiente executável especial chamado container Container Oferecem os serviços necessários para os componentes, tais como, gerenciamento do ciclo de vida, segurança, formatação, dados de configuração, etc. 10 5
Componentes e containers Suporte de comunicação O container cuida de toda a comunicação e detalhes do protocolo HTTP com o cliente, dando ao servlet objetos ao invés de strings de caracteres. Gerenciamento do ciclo de vida É o container quem instancia e termina o seu servlet, quem chama os seus métodos e fornece todos os objetos indicados nos parâmetros destes. 11 Componentes e containers Suporte ao multi-threading O container cria um thread do método de serviço para cada requisição recebida. Segurança declarativa O container permite que você configure vários aspectos de segurança e autenticação de forma declarativa (XML) e não programaticamente dentro de cada aplicação Suporte a documentos JSP O container cria um servlet para cada documento JSP que você escreve, automatica e transparentemente. 12 6
Componentes e containers Ilustrativamente: componente envia dados recebe dados cria Cliente Container 13 Componentes e containers Componentes cliente Applets e aplicações desktop Exemplo de container:o browser ou a JVM cliente Componentes Web Servlets programa Java que estende a funcionalidade de um servidor Web através do modelo requisição-resposta Páginas JSP documentos HTML gerados dinamicamente por um servlet Exemplos de container: Tomcat, JBOSS, Resin, etc... 14 7
Componentes e containers Servlets Objetos Java criados pelo container web para tratar uma requisição do usuário e produzir a resposta (geralmente um documento HTML) A API de servlets é capaz de: Inicializar e finalizar um servlet Acessar o ambiente de execução do servlet Receber requisições e produzir respostas Manter sessões e informações relacionadas a elas Interagir com outros servlets e componentes 15 Componentes e containers Páginas JSP Documento em modo texto com enxertos de código Java via marcadores (ou tags) especiais Uma página JSP contém: Gabaritos (templates) para formatação do documento, geralmente em linguagem HTML. Nos servlets isso é feito dentro do código da classe. Elementos de marcação JSP: produzem o conteúdo dinâmico do documento através de diversos elementos onde código Java pode ser inserido 16 8
Container Web e uma requisição ❶O servidor web recebe um pedido de execução de um servlet http://localhost:8080/teste/show.do GET... webapp server container web servlet 17 Container Web e uma requisição ❷O container cria um objeto HttpServletRequest e HttpServletResponse webapp server container web servlet request response 18 9
Container Web e uma requisição ❸O container cria uma thread do método de serviço do servlet e passa os objetos previamente alocados como parâmetros webapp server container web request response servlet thread de service() 19 Container Web e uma requisição ❹O container chama o método service() que, por sua vez, chama o método adequado (doget ou dopost), dependendo do método HTTP usado webapp server container web request response service() doget() servlet thread 20 10
Container Web e uma requisição ❺O container chama o método service() que, por sua vez, chama o método adequado (doget ou dopost), dependendo do método HTTP usado webapp server container web <html>... </html> response service() doget() servlet thread 21 Container Web e uma requisição ❻O container monta uma resposta HTTP anexando o HTML produzido pelo servlet e destrói os objetos request e response e a thread webapp server 200... <html>... </html> container web request response servlet thread de service() 22 11
Um servlet... Identificando alguns elementos no código: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class AloMundoServlet extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse resp) throws IOException { resp.setcontenttype("text/html"); PrintWriter out = resp.getwriter(); out.println("<h1>alo, Mundo!</h1>"); } } 23 Como é que o container sabe que é para executar o servlet? Como ele descobre, qual é o servlet? 24 12
Mapeando uma URL num servlet Todo servlet tem 3 nomes: Um nome URL, que é o que o usuário e o programador HTML conhece Um nome interno usado no arquivo de mapeamento XML O nome da classe (precedido do pacote, se for o caso) O container recebe o path para o recurso (servlet) e tem que se virar com ele GET /teste/show.do HTTP/1.1 25 Puts! Três nomes para uma mesma coisa! Não é complicar demais não? Por que não usamos simplesmente o nome da classe? 26 13
Mapeando uma URL num servlet Desvantagens de utilizar o path e nome do servlet (nos links, formulários HTML, etc): Se o path mudar, você terá que reescrever todos os HTMLs que apontam para o servlet C:\aplications\tomcat\webapps\teste\ WEB-INF\classes\pacote\MeuServlet /usr/local/tomcat/webapp/teste/web- INF/classes/pacote/MeuServlet 27 Mapeando uma URL num servlet Desvantagens de utilizar o path e nome do servlet (nos links, formulários HTML, etc): O mundo externo fica sabendo muitos detalhes de como você organiza seu sistema internamente Nomes de classes podem ser grandes, precedidos por nomes de pacotes ainda maiores. Imagine digitar tudo isso numa URL!!! http://servidor:8080/aplications/tomcat/ webapps/teste/web-inf/classes/pacote/ MeuServlet 28 14
Mapeando uma URL num servlet Por tudo isso, deve-se registrar o servlet no descritor de implantação (deployment descriptor DD) <servlet> mapeia o nome interno no nome completo da classe (do pacote em diante) <servlet-mapping> mapeia o nome interno no nome URL O DD é um arquivo chamado web.xml com uma DTD própria para configurar vários aspectos da sua aplicação web 29 Mapeando uma URL num servlet Exemplo de arquivo web.xml <webapp> Nome interno do servlet <servlet> <servlet-name>alo</servlet-name> <servlet-class>fred.alomundoservlet</servlet-class> </servlet> Nome qualificado da classe <servlet-mapping> <servlet-name>alo</servlet-name> <url-mapping>/show.do</url-mapping> </servlet-mapping> Nome URL do servlet </web-app> 30 15
Neste arquivo você só mapeou o nome da classe no nome URL. Como o container sabe o path real da classe se você não o colocou no arquivo web.xml? 31 O container sabe onde procurar por aplicações web! E dentro de uma aplicação a estrutura de diretórios é padronizado na especificação de servlets! 32 16
Resumo da ópera... O container recebe a requisição e o path do recurso (que neste caso é o nome da aplicação seguida do nome URL do servlet) http://localhost:8080/teste/show.do container web 33 Resumo da ópera... O container procura no diretório de aplicações web dele por uma aplicação chamada teste??? Tomcat container web webapps /teste/show.do teste loja blog 34 17
Resumo da ópera... Utilizando o arquivo web.xml da aplicação teste, ele procura por um mapeamento chamado /show.do container web show.do??? <webapp>...... </webapp> web.wml <servlet-mapping> <servlet-name>alo </servlet-name> <url-mapping>/show.do </url-mapping> </servlet-mapping> 35 Resumo da ópera... Com o nome interno do servlet (Alo), ele pega o nome da classe lá no marcador <servlet> container web Alo <webapp>...... </webapp> web.wml <servlet> <servlet-name>alo </servlet-name> <servlet-class> fred.alomundoservlet </servlet-class> </servlet> 36 18
Resumo da ópera... Por fim, procura pelo arquivo AloMundoServlet.class dentro do diretório específico (isso é padrão!) na aplicação web: Achei! teste WEB-INF container web web.wml classes fred 1001 0110 AloMundoServlet.class 37 Um estudo de caso Construir um sistema de registro de bugs registra/atende bug login ok pesquisa bug 38 19
Um estudo de caso Servlets projetados: ChecaLoginServlet Verifica se o login e senha conferem com o fonecido pelo usuário a partir do formulário de login. Se login ok, página principal. EditaBugServlet GravaBugServlet Exibem a página com os detalhes cadastrados para o bug e gravam qualquer alteração realizadas nestas informações PesquisaBugServlet Faz uma pesquisa a partir de critérios fornecidos e exibe uma listagem com os bugs que os possuem 39 Um estudo de caso Fazendo o login web container login.html ChecaLoginServlet main.html 40 20
Um estudo de caso Cadastrando um novo bug web container login.html ChecaLoginServlet main.html EditaBugServlet bug.html 41 Um estudo de caso Alterando as informações de um bug web container login.html ChecaLoginServlet main.html EditaBugServlet bug.html GravaBugServlet 42 21
Um estudo de caso Pesquisando os bugs da base web container login.html ChecaLoginServlet PesquisaBugServlet main.html bugs.html 43 Um estudo de caso Editando um bug web container login.html ChecaLoginServlet main.html EditaBugServlet bug.html PesquisaBugServlet bugs.html 44 22
Um estudo de caso Fluxo completo web container login.html ChecaLoginServlet main.html EditaBugServlet bug.html PesquisaBugServlet bugs.html GravaBugServlet 45 Características desta webapp Alto acoplamento entre processamento e apresentação Os servlets realizam a lógica de negócio e a apresentação dos resultados (interface com o usuário) Dificuldade de manutenção A alteração do layout da apresentação dos dados implica em alteração e recompilação de muitos servlets dificuldade de manutenção e evolução 46 23
Adicionando JSP ao modelo Separação entre lógica e apresentação web container servidor web PesquisaBugServlet resultado do select <html>... </html> <html> <%=..%> </html> ListaBugs.jsp 47 MVC na web MVC = Model View Controller Padrão que mantém separados a lógica de negócio (M) da apresentação (V) e interação (C) com o usuário. Nas aplicações desktop, o controller e o view geralmente estão mais acoplados que estes e o modelo Na web, o controller determina o fluxo em que as ações irão acontecer na aplicação No modelo utilizamos todas as técnicas de POO aprendidas, é programação Java pura 48 24
MVC na web Interação entre as partes: Apresentação dos dados e recepção dos dados Controller Decide como juntar o modelo com a visão adequada <html> <%=..%> </html> View Lógica de negócios da aplicação Model 49 Bibliografia [1] Kassem, Nicholas. Designing Enterprise Applications with the Java 2 Plataform, Enterprise Edition. Addision Wesley. 2000. [2] Basham, Bryan; Sierra, Kathy. Head First Servlets & JSP. 2005. 50 25