Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 1 Introduo/Servlets
Prof. Elton R C Spode, MsC
E-mail: espode@brturbo.com http://www.inf.unifra.br/~espode
Contedo
Introduo a programao Web Introduo a Servlets Request/Response Cookies/HttpSession Introduo a JSP Diretivas JSP JSP e Java Beans JSP vs. Servlets
Bibliografia
Core Servlets and Java Server Pages Marty Hall Sun Microsystems Web Development with Java Server Pages Duane K. Fields/Mark A. Kolb Manning
Na Internet
Tutorial de Servlets da Sun
http://www.javasoft.com/docs/books/tutorial/servlets/index.html
Ferramentas Utilizadas
Visual Age for Java 3.02 Entry Edition: http://www7.software.ibm.com/vad.nsf Tomcat 3.1.1 jakarta.apache.org Integrando Visual Age e Tomcat
http://www7.software.ibm.com/vad.nsf/Data/Document2390?OpenDocument&p=1&BCT=3&Footer=1
Tecnologias Web
Client Javascript Applets Flash Server ASP JSP/Servlets PHP XML/XSL
Histrico Server-Side
HTML: sem contedo dinmico CGI: Common Gateway Interface ASP: Active Server Pages Servlets JSP: Java Server Pages PHP: Open source
Servlets - Na Internet
Provedores gratuitos com suporte para Servlets/JSP e JDBC http://www.mycgiserver.com http://www.webappcabaret.com http://dev.startcom.org http://java.isavvix.com
Servlets - Introduo
Classes Java que rodam no servidor Applet - Browser, Servlet - Server Uso de Servlets Gerao de Contedo HTML Dinmico Sincronizao de requisies Redirecionamento de requisies
Servlets - Funcionamento
Servlets so executados a partir de requisies de clientes Executam alguma tarefa (BD, Classes de negcio) e retornam uma pgina
Servlets - Criao
Criar uma classe derivada de HTTPServlet Implementar os mtodos doGet e/ou doPost usando os parmetros: request para tratamento das requisies response para tratamento das respostas
getWriter para pegar a stream de sada
Servlets - Request/Response
Request - interface HttpServletRequest Encapsula os dados do cliente Header, cookies, parmetros Response - interface HttpServletResponse Encapsula os dados para o cliente Header, cookies, contedo
Servlets - service
A cada nova requisio o servidor cria um novo thread e chama service O mtodo service verifica a requisio e chama o mtodo apropriado Se for sobreposto dever fazer todo o tratamento de verificao e chamada dos mtodos
Exerccio
Controle de Conta Corrente Construir o servlet EntradaServlet no pacote view que imprima a mensagem: Sistema de Conta Corrente em Construo!
Requisies/Respostas
Quando uma requisio enviada a um servlet (mtodos service e doXXX), os mtodos chamados recebem dois objetos: request e response O objeto request implementa a interface HttpServletRequest e usado para recuperar informaes e contedo do cliente (requisio) O objeto response implementa a interface HttpServletResponse e usado para enviar informaes e contedo para o cliente (resposta)
Requisies
Qualquer dado enviado pelo browser do cliente est disponvel atravs do objeto request Desde informaes sobre o servidor at parmetros de formulrios podem ser recuperados atravs de seus mtodos: getParameter getParameterValues getParameterNambes getHeader getHeaders getHeaderNames
Recebendo um Parmetro
Um servlet pode receber parmetros de uma requisio, seja atravs de um form HTML ou da insero direta destes parmetros em um link Para receber um parmetro usa-se getParameter: Sintaxe: String getParameter(String nome); Caso o parmetro pedido no exista, o mtodo getParameter retornar null
Para recuperar os nomes de todos os parmetros utiliza-se o mtodo getParameterNames Este mtodo retorna um Enumeration contendo os nomes de todos os parmetros recebidos Sintaxe: Enumeration getParameterNames(); Caso no existam parmetros, o mtodo retornar null Para pegar o valor do parmetro basta usar o mtodo getParameter
Recebendo um Header
As informaes trocadas entre o browser e o servlet esto codificadas no formato MIME Este formato define tipos de arquivos e cabealhos de transmisso Os dados do cabealho podem ser recuperados com o mtodo getHeader: Sintaxe: String getHeader(String nome); Os browsers em geral no enviam todos os cabealhos disponveis
Recebendo Informaes
Muitas outras informaes teis esto disponveis no objeto request: autenticao, string de parmetros, dados do servidor, dados de path, dados do contedo entre outros: getAuthType getQueryString getServerName getServerPort getProtocol getRequestURI getMethod getPathInfo getCookies getPathTranslated getServletPath getContentLength getContentType getCharacterEncoding getContextPath (2.2) getLocale (2.2) getLocales (2.2)
Resposta
Atravs de um servlet podemos enviar para o cliente: contedo, informaes sobre ele e at aes que devem ser executadas pelo browser O envio para o cliente feito atravs do uso dos mtodos do objeto response: setContentType setContentLength getWriter getOutputStream setStatus setHeader
Enviando Contedo
Para enviar o contedo da resposta deve-se: Assinalar o tipo do contedo com setContentType Recuperar um stream para envio dos dados com getWriter (texto) e getOutputStream (binrio) Enviar a resposta com o mtodo adequado Fechar a stream Exemplo:
response.setContentType(text/html); PrintWriter out = response.getWriter(); out.println(texto);
Enviando Informaes
A resposta enviada consiste da linha de status, headers, uma linha em branco e o contedo A linha de status contm a verso do HTTP, o cdigo de status e a mensagem de status Cada header consiste de um nome padro seguido de um valor Servlets podem manipular estes cdigos para executar determinadas tarefas, como redirecionar para outros sites, indicar o tipo do documento anexado, solicitar uma senha, etc.
Enviando Headers
Headers so usadas para diversas tarefas teis: insero de cookies, indicao da data de alterao e tamanho do documento, releitura automtica da pgina, solicitao de autenticao (senha), etc Para especificar Headers de resposta podem ser utilizados os seguintes mtodos: setHeader, para valores string setDateHeader, para envio de datas (milissegundos) setIntHeader, para envio de valores inteiros
Redirecionando Requisies
Para solicitar ao browser o redirecionamento automtico, necessrio especificar o cdigo de status 302 e definir o header Location com a URL desejada. Estas tarefas podem ser realizadas por um nico mtodo: sendRedirect Alm disso, este mtodo tambm monta uma pgina para os browsers que no suportam redirecionamento Sintaxe: void sendRedirect(String URL);
Exerccio
Criar o servlet LoginServlet para solicitar uma senha ao usurio Criar o servlet CadastroServlet que mostra a pgina de cadastro se no receber parmetros ou grava no BD se receb-los. Alterar o servlet EntradaServlet para apresentar um menu contendo as opes: Nova Conta, Sacar, Depositar, Consultar, Bloquear e Finalizar
Exerccio
A opo Nova Conta dever chamar o servlet LoginServlet Se o usurio digitar senha dever ser chamado CadastroServlet As demais opes devero chamar o servlet ExecutarServlet utilizando um parmetro para distinguir a opo escolhida. Cada opo dever retornar a mensagem Em Construo
Cookies
So pequenas seqncias de bits armazenadas no cliente pelo browser Surgiram no Netscape para guardar informaes persistentes no cliente Existem restries para o seu uso: Podem ser acessados apenas pelo domnio que os criou Podem ser desabilitados pelo usurio (privacidade) Cookies so enviados de volta sempre que o usurio retorna ao domnio que gravou-os
Aplicaes de Cookies
Os usos mais comuns de cookies so: Identificao de usurios durante uma sesso de comrcio eletrnico Diminuir a necessidade de solicitao de senhas para o usurio Customizao de sites de acordo com as preferncias de cada visitante Propaganda dirigida Como cookies so gravados como arquivos texto eles no representam ameaa segurana do usurio, apenas sua privacidade
Criao de Cookies
Para criar um cookie: Criar um objeto da classe Cookie passando o nome do cookie e seu valor Indicar o tempo de validade do cookie (em segundos) com o mtodo setMaxAge. Se no for indicado nenhum, o cookie valido at que o browser seja fechado Enviar o cookie para o cliente usando o mtodo addCookie do objeto response Mesmo que sejam criados vrios cookies, todos eles sero gravados em apenas um arquivo
Leitura de Cookies
Todos os cookies referentes ao domnio que est sendo solicitado so automaticamente enviados juntos com a requisio Eles esto disponveis no objeto request e podem ser recuperados com getCookies Este mtodo retorna um array de cookies Para recuperar um cookie especfico necessrio fazer a varredura do array comparando o nome procurado com cookie.getName
Cookies API
A API de cookies possui mtodos para assinalar e pegar atributos disponveis no cookie: set/getComment set/getDomain set/getMaxAge set/getName set/getPath set/getSecure set/getValue set/getVersion
Exerccio
Alterar o servlet LoginServlet para gravar o id do usurio em um cookie. Caso o cookie j exista no solicitar a senha, apenas redirecionar para o CadastroServlet
Sesso
O protocolo HTTP stateless, ou seja, ele no mantm informaes entre conexes Aps a resposta ser enviada a uma requisio, a conexo fechada Entretanto, comum o envio de requisies interligadas por um mesmo cliente, como operaes de conta corrente ou compras Este conjunto de requisies e respostas chamado de sesso
Rastreamento de Sesses
Para atingir o objetivo de ligar conexes necessrio rastrear cada sesso, ou seja, verificar a qual usurio pertence cada requisio Este mtodo de rastreamento consiste em: Associar cada requisio recebida com uma sesso especfica Se for uma nova sesso, gerar um identificador nico para ela Recuperar dados da sesso (produtos comprados por exemplo) de um conjunto (lista, tabela hash, etc)
Rastreamento de Sesses
Este controle pode ser feito manualmente atravs do uso de cookies. Como o usurio pode desabilitar os cookies em sua mquina, os processos alternativos so: uso de campos escondidos em formulrios HTML ou atravs de reescrita de URLs Entretanto, como este um processo comum e trabalhoso, existe uma API que realiza todo o tratamento de maneira simples e transparente para o programador: HttpSession
Campos Escondidos
Consiste na insero do id nico do usurio em cada pgina gerada atravs do uso de campos escondidos: <input type=hidden name=id value= ...> O id ento recuperado atravs do getParameter Este mtodo apresenta duas desvantagens: S funciona para pginas geradas dinamicamente pois o id deve ser inserido no HTML obrigatrio o uso de forms com botes, no sendo possvel o uso de links para pginas que faam parte da sesso
Reescrita de URLs
Neste mtodo, o id da sesso de cada usurio adicionado ao fim de toda URL: http://www.xyz.com;id=563248712354 Para recuper-lo, tambm utiliza-se mtodo getParameter Funciona em qualquer browser, mesmo se o usurio desabilitar os cookies Entretanto se o usurio acessar a mesma pgina atravs de um outro link ou bookmark, a sesso ser perdida
Cookies
Para cada nova requisio, um cookie com o id da sesso gravado no browser do cliente O id recuperado atravs do cookie Se puder ser usada, a melhor soluo pois funciona em todos os casos. Como desvantagem, temos a tarefa relativamente trabalhosa de: Extrair o cookie de id do array Assinalar um tempo de validade adequado Associar cada requisio com uma sesso Gerar os ids nicos
HttpSession API
Para simplificar o rastreamento de sesses utilizamos a interface HttpSession que realiza as seguintes tarefas de maneira transparente: Gera ids nicos Mantm informaes de todas as sesses atuais Associa requisies com suas respectivas sesses Utiliza o mtodo de rastreamento disponvel para cada usurio: cookies se estiverem habilitados ou reescrita de URLs Possibilita o armazenamento de objetos na sesso Descarta sesses completas ou abandonadas
Inserindo um Atributo
Para inserir atributos deve-se usar os mtodos setAttribute (2.2) e putValue de HttpSession Sintaxe: void putValue(String nome, Object Valor); Objetos inseridos com este mtodo estaro disponveis at que a sesso do usurio correspondente termine Como cada usurio ter sua prpria sesso, esta uma excelente maneira de armazenar e organizar os dados de cada um
Recuperando Atributos
Para recuperar atributos da sesso, usa-se getAttribute (2.2) e getValue de HttpSession Sintaxe:
Descartando Sesses
Quando o usurio terminar sua sesso, deve-se elimin-la usando o mtodo invalidate() Sintaxe: void invalidate(); Este mtodo finaliza a sesso e retira a ligao de todos os objetos anteriormente associados Repare que ele no libera os objetos associados, apenas elimina suas ligaes
Outros Mtodos
removeAtribute - elimina o atributo da sesso getId - recupera o ID nico gerado getCreationTime - recupera a hora de criao da sesso em milisegundos getLastAccessedTime - recupera o ltimo acesso a esta sesso em milisegundos setMaxInactiveInterval - altera o tempo de inatividade em que uma sesso ser invalidada getMaxInactiveInterval - recupera o tempo de inatividade
Codificao de URLs
O HttpSession escolher o mtodo de reescrita de URLs caso no possa usar cookies Neste caso, o id da sesso ser adicionado a toda URL requisitada Nas respostas enviadas pelos servlets comum a insero de URLs em links, aes de formulrios ou em redirecionamentos Para o correto funcionamento da sesso necessria a insero do id nestas URLs Usam-se os mtodos do objeto response: encondeURL e encodeRedirectURL
URLs em Links
Para codificar URLs do prprio site que sero colocadas em links ou em aes de formulrios utiliza-se o mtodo encodeURL Sintaxe: String encodeURL(String URL); Exemplo:
String novaURL = response.encodeURL(URL); out.println(<a href= + novaURL + >Clique aqui </a>);
URLs em sendRedirect
Para os casos em que a requisio deva ser redirecionada para outra URL no mesmo site usa-se encodeRedirectURL Sintaxe: String encodeRedirectURL(String URL); Exemplo: String URL = response.encodeRedirectURL(URL); response.sendRedirect(novaURL);
Exerccio
Completar o sistema: Cada opo chamada do menu dever operar sobre a conta corrente atual.
Uso de JSP
Pginas JSP tambm necessitam de Web Servers especficos. Em geral, um servidor de servlets tambm um servidor de JSP Para disponibilizar um arquivo JSP basta gravlo em qualquer pasta visvel do servidor com extenso jsp
Execuo de JSP
Quando um usurio faz uma requisio a uma pgina JSP: Se for a primeira, a pgina jsp convertida em um servlet e compilada Este servlet invocado e retorna como resposta uma string HTML Esta string retornada para o cliente Todo o processamento ocorre no servidor, apenas o Html retornado
Elementos JSP
Uma pgina JSP pode ter trs tipos de elementos: Elementos de Script que so inseridos diretamente no servlet Diretivas que permitem a manipulao do cdigo gerado como servlet Aes que possibilitam o uso de outros componentes, como Java Beans
Elementos de Script
Os elementos de script JSP que podem ser inseridos em uma pgina HTML so: Expresses que so avaliadas e inseridas na sada do servlet Scriptlets, trechos de cdigo inseridos no mtodo _jspservice Declaraes inseridas fora dos mtodos do servlet
Expresses
Usadas para inserir valores diretamente na sada Sintaxe: <%= expresso java %> A expresso avaliada, convertida para string e inserida na pgina
Expresses
As expresses podem ser qualquer comando Java que retorne valor Exemplo: Data: <%= new java.util.Date() %>
Expresses so muito teis na atribuio de valores para parmetros html: <font size = <%Math.random()*5%> >
Variveis pr-definidas
Existem variveis em JSP que representam os objetos dos servlets: out request response session Exemplo: Host: <%request.getServerName()%>
Elementos XML
As tags jsp podem ser escritas no formato XML Expresses JSP podem ser escritas: <jsp:expression> expresso java </jsp:expression>
Os elementos XML so sensveis ao caso.
Scriptlets
Trechos de cdigo Java Delimitados por <% e %> Sintaxe XML: <jsp:scriptlet> cdigo java </jsp:scriptlet> Podem acessar as variveis pr-definidas
Scriptlets
Exemplo:
<% String cor = request.getParameter(cor); if (cor == null) cor = white; %>
Scriptlets
Podem ser usados para apresentar html condicionalmente:
<%if (hora >= 6 && hora < 12) { %> <b> Bom Dia! </b> <%} else {%> <b> Boa Tarde! </b> <% } %>
Declaraes
Para definir mtodos ou campos fora dos mtodos do servlet gerado Sintaxe: <%! declarao java %> Em XML: <jsp:declaration> declarao java </jsp:declaration>
Exerccio
Alterar o menu para um JSP simples que mostre data e hora atuais
Diretivas JSP
Afetam a estrutura geral do servlet gerado da pgina JSP Possuem o seguinte formato: <%@diretiva atributo=valor %> ou em XML <jsp:directive.diretiva atributo=valor/>
Tipos de Diretivas
Existem trs tipos de diretivas JSP: page, para importao de classes, alterao do tipo do contedo, etc. include, para incluso de arquivos durante a execuo do JSP taglib, para definio de tags prprias usadas em bibliotecas de tags
Diretiva page
Atributo import Usado para importar classes para o servlet gerado pelo JSP Pode aparecer vrias vezes no JSP Exemplo: <%@page import = java.util.* %>
Diretiva page
Atributo contentType Usado para alterar o formato MIME do texto de sada Exemplo: <%@page contentType=text/html%>
Tambm pode ser especificado o conjunto de caracteres com charset
Diretiva page
Atributo isThreadSafe Controla o uso de mltiplas threads no servlet gerado O padro usar mtithread (true) Exemplo: <%@page isThreadSate=false%>
Diretiva page
Atributo session Indica se a pgina em questo faz parte de uma sesso sendo que o seu valor padro true Ex: <%@page session=false %>
Neste caso a varivel pr-definida session no pode ser acessada
Diretiva page
Atributo buffer Indica o uso e tamanho do buffer usado pela varivel out. Exemplo: <%@page buffer = 32kb%>
ou <%@page buffer = none %>
Diretiva page
Atributo autoflush Controla o comportamento do buffer quando ele estiver cheio: true executa um flush automtico e false gera uma exceo Exemplo: <%@page autoflush=true%>
Diretiva page
Atributo extends Altera a superclasse do servlet gerado Exemplo: <%@page extends=MeuServlet.class%>
Diretiva page
Atributo info Define a string de descrio do servlet gerado Ser retornada pelo mtodo getServletInfo() Exemplo: <%@page info=descrio%>
Diretiva page
Atributo errorPage Indica o nome da pgina que deve ser mostrada em caso de erro Exemplo: <%@page errorPage=URL relativa%>
Diretiva page
Atributo isErrorPage Indica se a pgina atual pode ser usada como pgina de erro O valor padro deste atributo false Exemplo: <%@page isErrorPage=true%>
Diretiva include
Usada para incluir outros arquivos em pginas JSP Possui dois formatos, o primeiro inclui arquivos em tempo de compilao e o segundo em tempo de requisio A diretiva deve aparecer no ponto em que o arquivo ser includo
Diretiva plugin
Permite a incluso de outras classes Java em JSP, como applets e beans Tem uma sintaxe semelhante a da tag applet do HTML Exemplo:
<jsp:plugin type=applet code=Dados.class width=200 height=100> </jsp:plugin>
Diretiva plugin
Para passar parmetros para a classe envolvida com o plugin utiliza-se a diretiva jsp:params dentro de jsp:plugin Exemplo:
<jsp:params> <jsp:param name=cor value = red> </jsp:params>
Diretiva plugin
Se o browser no suportar objetos pode ser mostrado texto alternativo O texto definido em jsp:fallback dentro de jsp:plugin Exemplo:
<jsp:fallback> <b>Seu browser no suporta JAVA</b> </jsp:fallback>
Exerccio
Criar arquivos JSP para cabealhos e rodap e inclu-los nos locais adequados.