Tecnologias para Web Carlos Lucena lucena@inf.puc-rio.br Vitor Pellegrino vitorp@gmail.com Cidiane Lobato cidianelobato@yahoo.com.br Andrew Diniz andrew@les.inf.puc-rio.br
Agenda Servlets MVC JSP Taglibs Boas Práticas 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.. 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. 5
Arquitetura J2EE 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 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! 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 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. 11
Arquitetura Cliente-Servidor GET (request) Documento HTML retorna (response) Documento HTML Formulário Submetido via POST (request) Cliente / Browser Servidor retorna HTML gerado pelo Servlet Servidor 12
Requisitando um Servlet via GET GET (HTTP) http://localhost/servlet/servlethypermed?comando=setctxlabpornome&no=apsen 13
Requisitando um Servlet via POST 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 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() 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 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. 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 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 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 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 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 23
Hello World! Hello World! 24
Segundo Exemplo 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 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 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() 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. 29
Jakarta Tomcat Servidor gratuito baseado em java Configurável de maneira simples via XML Oferece suporte a Java (Servlets e JSP) 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 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. 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) 33
Configurando o Tomcat As classes são colocadas no diretório: %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB- INF\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\WEB- INF\lib 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 35
Configurando o Tomcat Registrando Servlets (1) O arquivo web.xml localizado no diretório: %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF 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> 37
Chamada do servlet 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 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" /> 40
JSP
Arquitetura HTML de resposta montado a partir de sucessivos comandos out.println(...). Browser Controlador Objetos de Negócio JavaBean de Resposta JSP 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> 43
Passos requisição para xxx.jsp xxx.jsp Geração de Código Java resposta xxx.java (servlet) 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) 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 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 %> 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 48
Exemplos de Diretivas Diretiva Include Diretiva Taglib 49
Exemplos de Diretivas Diretiva Page Ou 50
Tags de Script Declarações <%! declaração %> Scriptlets <% comandos %> Expressões <%= expressão %> Comentários <!-- comentário html --> <%-- comentário jsp --> 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. 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. 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. 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. 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. 56
Objetos Pré-Definidos Disponíveis para scriplets e expressões request response session out exception (somente em páginas de erro) page 57
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 NewClass8 NewClass NewClass2 browser HTTP Servlet NewClass9 NewClass10 NewClass5 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 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. 61
Taglibs
Ações jsp:usebean jsp:setproperty jsp:getproperty jsp:include jsp:forward 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: 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. 65
jsp:include <jsp:include page="{urlrelativa <%=expressão%>}"/> Exemplo 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. 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). 68
JSTL EL 69
JSTL Core Tag Lib 70
JSTL - Format tag lib 71
Boas Práticas
O padrão Comando (I) Como implementar? Atributo hidden 73
O padrão Comando (II) Como implementar? Atributo hidden Ex: Atributo hidden + Comando abstrato + Hashtable 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 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 76
O padrão Comando (V) 77
O padrão Comando (VII) HttpServlet MeuServlet comandos : Hashtable doget() dopost() init() ComandoAbstrato processacoma ndo() ComandoA ComandoB ComandoC processacomando() processacomando() processacomando() 78
Dicas de Modelagem 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 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 81