JavaTM Platform, Enterprise Edition (Java EE) Projeto de Sistemas de Software Agenda • Visão geral da Arquitetura Java EE • Servlets • JSP • Boas Práticas – MVC – Command © LES/PUC-Rio 2 COMO O JAVA EE PODE TE AJUDAR A ENFRENTAR PROBLEMAS • Tive uma idéia inovadora! – Quero desenvolver um sistema Web para gerenciar o agendamento de consultas médicas. Regras de Negócio: • Cadastrar médicos • Cadastrar pacientes • Adicionar consulta • Deletar consulta... © LES/PUC-Rio 3 COMO O JAVA EE PODE TE AJUDAR A ENFRENTAR PROBLEMAS • Tive uma idéia inovadora! – Quero desenvolver um sistema Web para gerenciar o agendamento de consultas médicas. Requisitos não-funcionais: • Persistência em banco de dados • Gerenciamento de threads • Gerenciamento da sessão WEB • Cache de objetos... © LES/PUC-Rio 4 JavaTM Platform, Enterprise Edition (Java EE) • Versão mais antiga: J2EE • Arquitetura de referência • Plataforma de Tecnologias • Desenvolvimento de aplicações distribuídas • Provê – Infra-estrutura de serviços complexos • Transações • Segurança • Persistência • Objetivo Central – Desenvolvedores podem concentrar-se no desenvolvimento da lógica de negócio © LES/PUC-Rio 5 Componentes Java EE • Aplicações Java EE – Constituídas por componentes • Componente Java EE – Unidade funcional de software – Formada por • Conjunto de classes • Arquivos relacionados – Pode se comunicar com outros componentes – Pode ser reusado durante a construção de aplicações Java EE – Deve seguir a especificação Java EE © LES/PUC-Rio 6 Modelos de Componente Java EE • A especificação Java EE define os seguintes componentes Java EE: • Componentes Web – Enterprise Javabeans Components (EJB) – Java Servlet • Objetos java que respondem requisições em HTTP • Resposta normalmente é Html gerado dinamicamente • Encapsular lógica de negócios de uma aplicação • Executados no servidor • Mantidos e executados no servidor – JavaServer PagesTM (JSPTM) • Linguagem de script adequada para escrita de servlets de apresentação © LES/PUC-Rio 7 Servidores Java EE • Componentes Java EE são instalados em servidores • Servidores – Oferecem infra-estrutura para gerenciamento do ciclo de vida dos componentes – Incluem containers Web e EJB – Provêem diversos serviços para os componentes • Transações • Persistência • Segurança • Nomes • Distribuição © LES/PUC-Rio 8 Java EE – Tecnologias Associadas • Panacéia de tecnologias – Ambientes de desenvolvimento – Servidores de aplicação – Frameworks de apoio ao desenvolvimento – Padrões de Projeto – Ferramentas de geração de código © LES/PUC-Rio 9 Java Servlets A Long Time Ago.. • O meu primeiro “Hello World” © LES/PUC-Rio 11 Servlet - Conceito • Na plataforma Java, a tecnologia capaz de gerar páginas dinâmicas são as Servlets – Alguns frameworks criam um nível de abstração sobre elas • Aplicação Java executada do lado do servidor, estendendo a capacidade do servidor web – Alternativa Java para os scripts CGI (Python, Ruby) – Gerenciado pelo módulo web • Vantagens – Melhor aproveitamento dos recursos do sistema – Fácil de programar – Portável © LES/PUC-Rio 12 Servlets - Conceito • Soluções para WEB – Acesso seguro à um site – Interagir com o banco de dados – Gerar documentos personalizados • Ideal para serem utilizados com Clientes Magros © LES/PUC-Rio 13 Arquitetura Cliente-Servidor GET (request) Documento HTML retorna (response) Documento HTML Formulário Submetido via POST (request) Servidor retorna HTML gerado pelo Servlet Servidor Cliente / Browser © LES/PUC-Rio 14 Arquitetura Cliente-Servidor • Arquitetura baseada na divisão do processamento em processos distintos – Servidor • responsável pela manutenção da informação – Clientes • responsáveis pela obtenção dos dados • envio de pedidos ao processo servidor • Cliente faz requisições utilizando protocolo HTTP • Para cada requisição o servidor cria uma nova Thread © LES/PUC-Rio 15 Requisitando um Servlet via GET GET (HTTP) http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&Por=&No=Apsen © LES/PUC-Rio 16 Requisitando um Servlet via POST © LES/PUC-Rio 17 API de Servlet • API de Servlet – Conjunto de classes Java – Define interface padrão entre o cliente web e o servidor web java.lang.Object | +----javax.servlet.GenericServlet | +----javax.servlet.http.HTTPServlet | +----com.teccomm.pss.MeuServlet © LES/PUC-Rio 18 HttpServlet • Tratador de requisições HTTP • Trata métodos HTTP específicos – doGet(HttpServletRequest req, HttpServletResponse resp) – doPost(HttpServletRequest req, HttpServletResponse resp) • doGet e doPost – Chamados pelo método service() • Subclasses reescrevem os métodos – doGet – doPost • Podem reescrever os métodos – init() – destroy() © LES/PUC-Rio 19 Ciclo de Vida do Servlet • Criação e inicialização – Realizado uma única vez – init(ServletConfig config) – Sempre chama o método da super classe primeiro • super.init(config) – Pode sinalizar a exceção UnavailableException caso ocorra algum erro durante o processo de inicialização • Os médotos service(), doGet(), doPost() são chamados para atender requisições de clientes – Cada requisição é atendida por uma nova thread • destroy() e Coleta de lixo – Executado somente uma vez – Alguns servidores somente removem o servlet quando ocorre o shutdown – Utilizado para liberar recursos © LES/PUC-Rio 20 Recapitulando... • Para criar um Servlet é necessário – Estender a classe HttpServlet • pacote javax.servlet.http do JSDK – Implementar os métodos doGet ou doPost © LES/PUC-Rio 21 Request e Response • Métodos doGet(), doPost() recebem dois parâmetros – HttpServletRequest • encapsula os parâmetros da requisição – HttpServletResponse • encapsula a resposta ao cliente © LES/PUC-Rio 22 HttpServletRequest • Interface que encapsula a requisição feita pelo cliente através do protocolo HTTP • Possui métodos que permitem recuperar os dados da requisição – cabeçalho – dados de formulários ou parâmetros enviados – informações sobre a sessão do cliente © LES/PUC-Rio 23 HttpServletRequest • Alguns métodos definidos em HttpServletRequest para manipulação de Parâmetros – java.util.Enumeration getParameterNames() • Obtém listagem, contendo nomes de parâmetros da requisição – java.lang.String[] getParameterValues(java.lang.String name) • Obtém valores do parâmetro “name” da requisição – java.lang.String getParameter(java.lang.String name) • Obtém valor do parâmetro “name” da requisição © LES/PUC-Rio 24 HttpServletResponse • Interface que encapsula a resposta ao cliente • Possui um método responsável por recuperar o canal de resposta com o cliente – getWriter() • retorna um PrintWriter Ex: PrintWriter out = response.getWriter(); out.println(“Escrevendo no cliente”); • Também é possível configurar qual é o tipo dos dados que estão sendo enviados de volta ao cliente – setContentType(String type) – Os tipos mais comuns são text/html, text/xml – O método setContentType deve ser chamado antes do método getWriter © LES/PUC-Rio 25 Primeiro Exemplo: Hello World! Hello World! © LES/PUC-Rio 26 Segundo Exemplo © LES/PUC-Rio 27 Gerenciamento de sessão (I) • Protocolo HTTP – Protocolo sem estado • Não é possível a princípio conhecer o estado do cliente anterior à uma requisição • O gerenciamento de sessão provê uma maneira de identificar usuários através de várias requisições HTTPs e recuperar suas informações – Dados do estado do cliente • Para obter uma sessão – HttpSession getSession() • Obtém sessão existente, caso não exista retorna uma nova sessão – HttpSession getSession(boolean create) • Obtém sessão existente ou cria uma nova sessão dependendo do valor do parâmetro create © LES/PUC-Rio 28 Gerenciamento de sessão (II) • Métodos para manipulação de objetos em sessão – void removeAttribute(java.lang.String name) • Retira objeto da sessão – void setAttribute(java.lang.String name, java.lang.Object value) • Coloca ou sobreescreve objeto na sessão identificado por name – java.lang.Object getAttribute(java.lang.String name) • Obtém objeto da sessão – java.util.Enumeration getAttributeNames() • Obtém os nomes de todos os objetos armazenados na sessão © LES/PUC-Rio 29 Gerenciamento de sessão (III) • Tempo de duração da sessão – Sessões em geral tem intervalo máximo de tempo que podem ficar inativas • public int getMaxInactiveInterval() • public void setMaxInactiveInterval(int interval) • As sessões também podem ser encerradas explicitamente pelo programador – public void invalidate() © LES/PUC-Rio 30 Exemplo – Carrinho de compras (I) Adicionando parâmetros à Sessão © LES/PUC-Rio 31 Exemplo – Carrinho de compras (II) Recuperando parâmetros da Sessão © LES/PUC-Rio 32 Exemplo – Carrinho de compras (III) Recuperando parâmetros da Sessão © LES/PUC-Rio 33 Exemplo – Carrinho de compras (IV) Encerrando a Sessão © LES/PUC-Rio 34 Colocando para Funcionar • Para que o servlet “funcione” – Necessário que um servidor web/aplicação com suporte a java que escute as requisições do cliente – Ex: • IBM WebSphere Application Server • Jakarta Tomcat • Java Web Server • Etc. • Jakarta Tomcat – Servidor gratuito baseado em java – Configurável de maneira simples via XML – Oferece suporte a Java (Servlets e JSP) © LES/PUC-Rio 35 Configurando o Tomcat • Registrando os Servlets – Servlets devem ser chamados com seu nome completo (Pacotes e classe) • Muitas vezes o nome se torna grande demais – Pode-se então dar um nome ao servlet através do qual o servidor redirecionará a chamada à classe específica – Arquivo web.xml • Localizado em geral no diretório %TOMCAT_HOME%\webapps\ROOT\WEB-INF – Registrando um servlet <web-app> <servlet> <servlet-name>ServletSes</servlet-name> <servlet-class>interfPesquisa.ServletSes</servlet-class> </servlet> </web-app> © LES/PUC-Rio 36 Jakarta Tomcat © LES/PUC-Rio 37 JSP Arquitetura HTML de resposta montado a partir de sucessivos comandos out.println(...). Servlet + Controladores (Controle) Browser Objetos de Negócio (Modelo) JSP JavaBean de Resposta (Visão) © LES/PUC-Rio 39 JSP - Conceito • Tecnologia que permite combinar informações estáticas com informações geradas dinamicamente • Script executado no servidor – Combinação de sintaxe JSP e tags de marcação – Tags estáticos • HTML, XML – Conteúdo dinâmico gerado pelo código do script • Java • Exemplo <HTML><HEAD><TITLE>Primeiro JSP</TITLE></HEAD> <BODY> <H1>Data e hora: <%= new java.util.Date() %></H1> </BODY></HTML> © LES/PUC-Rio 40 Tags JSP • Diretivas – Configuração do processador JSP – Inclusão estática de conteúdo – Encaminhamento de requisições para outros servidores • Comandos de script – Inserção de código para a programação de conteúdo dinâmico • Ações – Tags de alto nível que encapsulam padrões de programação mais corriqueiros © LES/PUC-Rio 41 Diretivas <%@ nome-da-diretiva [nome-atributo = “valor-do-atributo”]* %> • Diretivas disponíveis – <%@ include file=“url-relativa” %> • Inclusão em tempo de compilação – <%@ taglib uri=“url-relativa-da-biblioteca-de-tags” prefix=“prefixo-das-tags” %> – <%@ page lista-de-atributos %> © LES/PUC-Rio 42 Atributos da Diretiva Page • language=“nome-da-linguagem-de-script” • contentType=“mime-type | mime-type; charset=nomecharset” • errorPage=“url-página-de-erro” • isErrorPage=“true | false” • buffer=“none|tamanho-em-kb” • auto-flush=“true | false” • import=“lista-de-pacotes” • extends=“nome-da-classe-base” • session=“true | false” • isThreadSafe=“true | false” • info=“texto-informativo” © LES/PUC-Rio 43 Exemplos de Diretivas • Diretiva Include <%@ include file=“/teccommdoc/header.html” %> • Diretiva Taglib <%@ taglib uri=“/tags/teccommtags” prefix=“teccomm” %> <teccomm:exemplo parametro=“demonstracao” /> • Diretiva Page <%@ page language=“java” errorPage=“erro.jsp” isErrorPage=“false” buffer=“12kb” auto-flush=“true” session=“true” isThreadSafe=“true” info=“TecComm” %> • Ou <%@ page language=“java” %> <%@ page errorPage=“erro.jsp” %> <%@ page import=“com.teccomm.output.*” %> © LES/PUC-Rio 44 Tags de Script • Declarações <%! declaração %> • Scriptlets <% comandos %> • Expressões <%= expressão %> • Comentários <!-- comentário html --> <%-- comentário jsp --> © LES/PUC-Rio 45 Declarações • <%! declarações %> • Exemplos <%! int i = 0; public void metodo {...} %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> • Declara variáveis ou métodos a serem utilizados no código JSP © LES/PUC-Rio 46 Scriptlets • <% fragmento_de_código_válido %> • Exemplo <% String name = null; if (request.getParameter(“nome") == null) { %> <%@ include file="error.html" %> <% } else { foo.setName(request.getParameter(“nome")); } %> • Um scriptlet pode conter qualquer número de instruções, variáveis, métodos, declarações ou expressões válidos © LES/PUC-Rio 47 Expressão • <%= expressão %> • Exemplo O mapa tem <font color="blue"><%= mapa.getCount() %></font> entradas. • Esta tag contém uma expressão que é avaliada e convertida para string, depois de processada. © LES/PUC-Rio 48 Comentários • <!-- comentário [ <%= expressão %> ] --> • Exemplo <!-- Comentário --> <!-- Esta página foi carregada em <%= (new java.util.Date()).toLocaleString() %> --> • O processador JSP trata um comentário como texto HTML não interpretado, retornando-o ao cliente. • Uma expressão pode ser incluída em um comentário, sendo avaliada e seu resultado é retornado ao usuário juntamente com o HTML de resposta © LES/PUC-Rio 49 Comentários para Desenvolvimento • <%-- comentário --%> • Exemplo <%@ page language="java" %> <html><head><title>Um teste comentário</title></head> <body><h2>Um teste - comentário</h2> <%-- Este comentário não estará disponível para o cliente --%> </body></html> • O processador JSP simplesmente ignora este tipo de comentário e não processa nenhum código ou expressão contida entre os delimitadores. • Este tipo de comentário não será enviado para o cliente © LES/PUC-Rio 50 Objetos Pré-Definidos • Disponíveis para scriplets e expressões – request – response – session – out – exception (somente em páginas de erro) – page © LES/PUC-Rio 51 © LES/PUC-Rio 52 Ações • jsp:include • jsp:forward – ou então tags personalizadas via taglib © LES/PUC-Rio 53 jsp:include e jsp:forward • Ações utilizadas para o encadeamento de páginas jsp <jsp:include page=“url-relativa-da-página” /> – Suspende o processamento da página chamadora e repassa o controle para a página chamada até que esta retorne-o <jsp:forward page=“url-relativa-da-página” /> – O processamento da página chamadora é terminado e o controle é repassado sem espera de retorno para a página chamada © LES/PUC-Rio 54 jsp:include • <jsp:include page="{URLrelativa |<%=expressão%>}"/> • Exemplo <jsp:include page="scripts/login.jsp" /> <jsp:include page="copyright.html" /> <jsp:include page="/index.html" /> © LES/PUC-Rio 55 jsp:forward • <jsp:forward page="{URLrelativa|<%=expressão%>}"/> • Exemplo <jsp:forward page="scripts/login.jsp" /> • A tag <jsp:forward> repassa o objeto request enviado para o arquivo JSP para que seja processado por outra aplicação • O processador JSP não executa o restante das instruções contidas após a tag. © LES/PUC-Rio 56 Boas Práticas MVC Servlet + Modelo de Objetos • Agora sabemos – Programar servlets – Modelar um sistema orientado a objetos • Mas como fazer os dois funcionarem juntos? © LES/PUC-Rio 58 Servlet + Modelo de Objetos NewClass7 NewClass3 NewClass NewClass2 NewClass8 ?? HTTP browser NewClass9 NewClass10 Servlet NewClass5 © LES/PUC-Rio NewClass6 NewClass4 59 Arquitetura MVC • O que é MVC? – MVC – Model-View-Controller – Surgiu nos anos 80 com SmallTalk • Sugere a divisão de uma aplicação visual em 3 partes fundamentais – Model • Representa o modelo da sua aplicação, com as regras de negócio (business logic) e todo o processamento da aplicação – View • Representa a informação e recolhe os dados fornecidos pelo usuário – Controller • Recebe as informações da entrada e as transmite para o modelo © LES/PUC-Rio 60 Arquitetura MVC • Pela arquitetura, a interação de um usuário com o sistema se dá através de seqüências de chamadas MVC Servlet + Controladores (Controle) Browser Objetos de Negócio (Modelo) JSP JavaBean de Resposta (Visão) © LES/PUC-Rio 61 Arquitetura MVC • O modelo será uma aplicação Java orientada a objetos • O controlador será alguma tecnologia de implementação (padrão comando) que juntamente com o Servlet redirecionará as chamadas feitas pelo cliente aos objetos responsáveis no modelo • A apresentação será representada pelo JSP © LES/PUC-Rio 62 Boas Práticas Padrão Command Padrão Command • Objetivos – Reduzir acoplamento entre as requisições dos clientes e os objetos que as executam – Parametrizar objetos por uma ação a ser executada – Especificar, enfileirar e executar solicitações em tempos diferentes para desfazer operações, por exemplo – Estruturar um sistema em torno de operações de alto nível, como transações, por exemplo © LES/PUC-Rio 64 Padrão Command (I) • Como implementar? – Atributo hidden © LES/PUC-Rio 65 Padrão Command (II) • Como implementar? – Atributo hidden • Ex: • Atributo hidden + Comando abstrato + Hashtable © LES/PUC-Rio 66 Padrão Command (III) HttpServlet MeuServlet comandos : Hashtable doGet() doPost() init() ComandoAbstrato processaComando() ComandoA ComandoB ComandoC processaComando() processaComando() processaComando() © LES/PUC-Rio 67 Padrão Command (IV) • O Comando Genérico: • HttpServletRequest – Passa o comando a ser instanciado (input do formulário) • HttpServletResponse – Contém o PrintWriter que deverá receber as respostas do Comando © LES/PUC-Rio 68 Padrão Command (V) • O Servlet deve possuir um atributo HashTable com todos os Commands • Ao ser iniciado, cada Comando deve ser instanciado e inserido na HashTable © LES/PUC-Rio 69 Padrão Command (VI) © LES/PUC-Rio 70 Fim Perguntas?