Tecnologias para Web Carlos Lucena [email protected] Vitor Pellegrino [email protected] Cidiane Lobato [email protected] Andrew Diniz [email protected] Agenda • Servlets • MVC • JSP • Taglibs • Boas Práticas © LES/PUC-Rio 2 Arquitetura J2EE Arquitetura J2EE • Plataforma para desenvolvimento Java Enterprise (Java EE) • Voltada para aplicações Multi-Camadas baseadas em componentes. • Executada em um Application Server – Glassfish – Weblogic – JBOSS – Etc.. © LES/PUC-Rio 4 Arquitetura J2EE • Composta por várias outras especificações – JDBC (Java Database Connectivity) : utilizado no acesso a bancos de dados; – Servlets: são utilizados para o desenvolvimento de aplicações Web com conteúdo dinâmico. – JSP (Java Server Pages) : um especialização do servlet que permite que conteúdo dinâmico seja facilmente desenvolvido. – JTA (Java Transaction API) : é uma API que padroniza o tratamento de transações dentro de uma aplicação Java. – EJBs : utilizados no desenvolvimento de componentes de software, contendo as regras de negócio da aplicação. © LES/PUC-Rio 5 Arquitetura J2EE © LES/PUC-Rio 6 Modelos de Componente J2EE • A plataforma J2EE define quatro tipos diferentes de componentes de aplicação: – Aplicações cliente • aplicação Java • mantidos e executados no cliente • GUI – Applets • Normalmente executados dentro do browser • Mantidos pelo servidor e executados no cliente © LES/PUC-Rio 7 Modelos de Componente J2EE – Servlets e Java Server Pages (JSPs) (componentes Web) • Servlet – Objetos java que respondem requisições em HTTP – Resposta normalmente é Html gerado dinamicamente – Mantidos e executados no servidor • JSP – Linguagem de script adequada para escrita de servlets de apresentação – Enterprise JavaBeans (EJBs) • Mantidos e executados em um ambiente gerenciado pelo servidor • Provê: – Monitoramento transacional. – Persistência. – Distribuição de objetos. – Segurança. • Não são JavaBeans! © LES/PUC-Rio 8 Java Servlets O que é um Servlet? • Resposta da comunidade Java ao CGI. • Módulo Java executado em servidores orientados a request/response, como servidores web (TomCat, JBoss). • Vantagens – Melhor aproveitamento dos recursos do sistema – Fácil de programar • Em aplicações web, o cliente faz requisições utilizando protocolo HTTP © LES/PUC-Rio 10 O que é um Servlet? • Com Servlets, para cada requisição o servidor cria uma nova Thread • Conteúdo dinâmico • Camada intermediária entre a lógica da aplicação e a interface Web. © LES/PUC-Rio 11 Arquitetura Cliente-Servidor GET (request) Documento HTML retorna (response) Documento HTML Formulário Submetido via POST (request) Servidor retorna HTML gerado pelo Servlet Cliente / Browser Servidor © LES/PUC-Rio 12 Requisitando um Servlet via GET GET (HTTP) http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&No=Apsen © LES/PUC-Rio 13 Requisitando um Servlet via POST © LES/PUC-Rio 14 A API de Servlet • A API de Servlet é um conjunto de classes Java que define uma 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 15 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 são chamados pelo método service() • Subclasses reescrevem os métodos doGet, doPost e podem reescrever os métodos init() e destroy() © LES/PUC-Rio 16 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étodos service(), doGet(), doPost() são chamados para atender requisições de clientes – Cada requisição é atendida por uma nova thread © LES/PUC-Rio 17 Ciclo de Vida do Servlet • 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 18 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 19 Request e Response • Os 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 20 HttpServletRequest • Interface que encapsula a requisição feita pelo cliente através do protocolo HTTP • Possui métodos que recuperam 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 21 HttpServletRequest • Alguns métodos definidos em HttpServletRequest – 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 22 HttpServletResponse • Interface que encapsula a resposta ao cliente • Possui o método getWriter() responsável por recuperar o canal de resposta com o cliente – 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 23 Hello World! Hello World! © LES/PUC-Rio 24 Segundo Exemplo © LES/PUC-Rio 25 Gerenciamento de sessão (I) • O protocolo HTTP é um 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 e recuperar suas informações – Dados do estado do cliente • Para obter uma sessão: • HttpSession session = request.getSession() – Obtém sessão existente, caso não exista retorna uma nova sessão. • HttpSession session = request.getSession(boolean create) – Obtém sessão existente ou cria uma nova sessão dependendo do valor de o parâmetro create. • Funciona a base de cookie ou reescrita de URL © LES/PUC-Rio 26 Gerenciamento de sessão (II) • Principais 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 27 Gerenciamento de sessão (III) • Tempo de duração da sessão – As sessões em geral têm 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 28 Colocando para Funcionar • Para que o servlet “funcione” é preciso 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. © LES/PUC-Rio 29 Jakarta Tomcat • Servidor gratuito baseado em java • Configurável de maneira simples via XML • Oferece suporte a Java (Servlets e JSP) © LES/PUC-Rio 30 Jakarta Tomcat e Jboss • Tomcat – Pode ser gratuitamente obtido em http://www.apache.org – Utilizem a versão 5.x – VM j2sdk 1.5.x • Jboss – Servidor web similar ao Tomcat, mas com mais recursos – Na prática, ele é compatível com mais recursos da especificação J2EE © LES/PUC-Rio 31 Publicação de Servlets • Imagine que você implementou um Servlet, gerou o .java e compilou para ter o .class. • E agora? Como o Servlet é publicado no servidor? • Na verdade, existe um local para colocar as classes de sua aplicação. © LES/PUC-Rio 32 Configurando o Tomcat • Onde colocar as classes dos Servlets? • Primeiro, é preciso criar uma aplicação web – Cria-se um diretório em %TOMCAT_HOME%\webapps\, sem espaços no nome. – Dentro do diretório do projeto, cria-se a pasta WEB-INF – Dentro de WEB-INF, criam-se 2 pastas: lib e classes – Dentro de WEB-INF, cria-se o arquivo web.xml (deployment descriptor web) © LES/PUC-Rio 33 Configurando o Tomcat • As classes são colocadas no diretório: – %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEBINF\classes – A partir deste diretório devem ser colocadas em seus próprios pacotes • As libs (arquivos .jar) devem ser colocadas no diretório: – %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEBINF\lib © LES/PUC-Rio 34 Configurando o Tomcat • Registrando os Servlets – Os 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 © LES/PUC-Rio 35 Configurando o Tomcat • Registrando Servlets (1) – O arquivo web.xml localizado no diretório: • %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF © LES/PUC-Rio 36 Configurando o Tomcat • Registrando Servlets (2) <web-app> <servlet> <servlet-name>ServletSistema</servlet-name> <servlet-class>controller.Login</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletSistema</servlet-name> <url-pattern>/servlet/ServletSes</url-pattern> <servlet-mapping> </web-app> © LES/PUC-Rio 37 Chamada do servlet © LES/PUC-Rio 38 Configurando o Tomcat • Agora, o servlet poderá ser acessado através da URL: http://<host>:<porta>/DIRETÓRIO_APLICAÇÃO/servlet/ServletSes localhost:8080 © LES/PUC-Rio 39 Configurando o Tomcat • Outras configurações – O arquivo server.xml localizado no diretório: • %TOMCAT_HOME%\conf – Configuração da porta do servidor: <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> © LES/PUC-Rio 40 JSP Arquitetura HTML de resposta montado a partir de sucessivos comandos out.println(...). Controlador Browser Objetos de Negócio JavaBean de Resposta JSP © LES/PUC-Rio 42 O que é JSP • JSP é uma 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áticas • 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 43 Passos requisição para xxx.jsp xxx.jsp Geração de Código Java resposta xxx.java (servlet) © LES/PUC-Rio 44 Escopo dos Atributos • O JSP pode acessar objetos em tempo de execução em quatro escopos diferentes: – Página • Objeto PageContext corrente (pageContext) – Requisição • Objeto HttpServletRequest corrente (request) – Sessão • Objeto HttpSession corrente (session) – Aplicação • Objeto ServletContext corrente (servletContext) • Para armazenar informações: setAttribute(String, Object) • Para recuperar informações: getAttribute(String) © LES/PUC-Rio 45 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 46 Diretivas • <%@ nome-da-diretiva [nome-atributo = “valor-do-atributo”]* %> • Diretivas disponíveis: – <%@ include file=“url-relativa” %> – <%@ taglib uri=“url-relativa-da-biblioteca-de-tags” prefix=“prefixo-das-tags” %> – <%@ page lista-de-atributos %> © LES/PUC-Rio 47 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 48 Exemplos de Diretivas • Diretiva Include • Diretiva Taglib © LES/PUC-Rio 49 Exemplos de Diretivas • Diretiva Page • Ou © LES/PUC-Rio 50 Tags de Script • Declarações – <%! declaração %> • Scriptlets – <% comandos %> • Expressões – <%= expressão %> • Comentários – <!-- comentário html --> – <%-- comentário jsp --> © LES/PUC-Rio 51 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 52 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 53 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 54 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 55 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 56 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 57 © LES/PUC-Rio 58 Model View Controller (MVC) • O que é MVC? – Padrão arquitetural em três camadas para desenvolvimento de sistemas, surgido nos anos 80. NewClass7 NewClass3 NewClass NewClass2 HTTP browser NewClass8 NewClass9 NewClass10 Servlet NewClass5 © LES/PUC-Rio NewClass6 NewClass4 59 Arquitetura MVC • Sugere a divisão de uma aplicação visual em 3 partes – Model: Modelo da sua aplicação, com as regras de negócio (business logic) e todo o processamento da aplicação – View: Apresenta 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 • Em Java: – O modelo será uma aplicação 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 no modelo. – A apresentação será representada pelo JSP. © LES/PUC-Rio 61 Taglibs Ações • jsp:useBean • jsp:setProperty • jsp:getProperty • jsp:include • jsp:forward © LES/PUC-Rio 63 jsp:useBean • Cria ou recupera uma instância de um bean. • <jsp:useBean lista_de_atributos> • A lista_de_atributos pode ser – id: “nomeDaInstânciaDoBean” – scope:”page|request|session|application” – class: “com.teccomm.NomeClasse” – type: “com.teccomm.NomeDoTipo” • Exemplo: © LES/PUC-Rio 64 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; – repassa o controle para a página chamada até que o retorne. • <jsp:forward page=“url-relativa-da-página” /> – o processamento da página chamadora é terminado; – controle repassado sem espera de retorno para a página chamada. © LES/PUC-Rio 65 jsp:include • <jsp:include page="{URLrelativa |<%=expressão%>}"/> • Exemplo © LES/PUC-Rio 66 jsp:forward • <jsp:forward page="{URLrelativa|<%=expressão%>}"/> Exemplo: 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 67 JSP Standard Tag Library • Versão JSTL (Java 1.4) lançada em meados de 2002 impulsionou o desenvolvimento com JSP. • Requer servlet container que suporte Servlet 2.4 and JSP 2.0 (tomcat 5.x) • Provê 4 standard Tag Libs: – core, internationalization/format, XML, and SQL • Provê uma Expression Language (EL). © LES/PUC-Rio 68 JSTL EL © LES/PUC-Rio 69 JSTL – Core Tag Lib © LES/PUC-Rio 70 JSTL - Format tag lib © LES/PUC-Rio 71 Boas Práticas O padrão Comando (I) • Como implementar? – Atributo hidden © LES/PUC-Rio 73 O padrão Comando (II) • Como implementar? Atributo hidden + Comando abstrato + Hashtable – Atributo hidden – Ex: © LES/PUC-Rio 74 O padrão Comando (III) • 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 75 O padrão Comando (IV) • 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 76 O padrão Comando (V) © LES/PUC-Rio 77 O padrão Comando (VII) HttpServlet MeuServlet comandos : Hashtable doGet() doPost() init() ComandoAbstrato processaComa ndo() ComandoA ComandoB ComandoC processaComando() processaComando() processaComando() © LES/PUC-Rio 78 Dicas de Modelagem © LES/PUC-Rio 79 J2EE no Eclipse • É possível utilizar o Eclipse como ambiente de desenvolvimento – Plug-in Eclipse 3.x: • Lomboz: Instalação e Configuração • Execução do Exemplo no Eclipse – Lomboz + Tomcat © LES/PUC-Rio 80 Ferramentas • Eclipse 3.x • Jakarta Tomcat 5.x – http://jakarta.apache.org/ • Lomboz para eclipse 3.x – http://www.objectlearn.com/projects/download.jsp © LES/PUC-Rio 81