Title: Java Avan
1Java Avançado
Material cedido por Daniel Arraes
Pereira dap_at_cin.ufpe.br
Guilherme Kely de Melo Oliveira gkmo_at_cin.ufpe.br
Jobson Ronan Jeronimo da Silva jrjs_at_cin.ufpe.br
2Servlets
- É a tecnologia Java em resposta à CGI (Common
Gateway Interface). São programas que rodam no
servidor Web, atuando como camada intermediária
entre uma requisição vinda de um cliente HTTP e
banco de dados ou aplicações no servidor Web.
Common Gateway Interface É uma especificação que
permite que um programa, escrito em uma linguagem
de programação qualquer, possa responder a
requisições HTTP encaminhadas por um servidor web.
3Servlets
- Suas tarefas são
- Ler todos os dados enviados pelo usuário.
- Gerar resultados.
- Formatar os resultados.
- Ajustar os parâmetros da resposta HTTP.
- Enviar a resposta ao cliente.
4Servlets
- Por que usá-los?
- Facilidade de uso.
- Facilidade de desenvolvimento.
- Maturidade da linguagem Java. Servlets são
classes Java. - Eficientes
- Independentes de browsers.
- Robustez, segurança, Multiplataforma, possuem
praticamente toda a plataforma Java disponível.
5Servlets
- Como usá-los?
- Escreve uma classe que extenda a classe Servlet
sobrescrevendo os métodos relativos ao tipos de
requisição. - Cria a estrutura de dirétorios necessária e faz o
deploy do servlet em tal estrutura. - Realiza o mapeamento do servlet em uma(s) URL
através do deployment descriptor da aplicação
6Servlet Hello World
- public class HelloWorldServlet extends
HttpServlet - protected void doGet(HttpServletRequest
request, -
HttpServletResponse response) - throws ServletException,
IOException - response.setContentType("text/html")
- PrintWriter out response.getWriter()
- out.println("lthtmlgtltheadgtlttitlegtHilt/titlegt
lt/headgt") - out.println("ltbodygt")
- out.println("Hello World!!")
- out.println("lt/bodygt")
- out.println("lt/htmlgt")
- out.close()
-
-
7Servlet Hello World - Deploy
- webapps
- ROOT Contexto principal. URL default.
- Nome do contexto
- Arquivos JSP
- META-INF
- WEB-INF
- classes Classes da aplicação (Servlets, ...)
- lib bibliotecas específicas da aplicação.
.jar. - Deployment Descriptor (web.xml)
8Servlet Hello WorldDeployment Descriptor
(web.xml)
- Arquivo que faz o mapeamento entre URLs e
Servlets além de configurações de segurança,
eventos, filtros, ...
9Servlet Hello WorldDeployment Descriptor
(web.xml)
- lt?xml version"1.0" encoding"UTF-8"?gt
- ltweb-app id"WebApp_ID" version"2.4"
xmlns"http//java.sun.com/xml/ns/j2ee"
xmlnsxsi"http//www.w3.org/2001/XMLSchema-instan
ce" xsischemaLocation"http//java.sun.com/xml/ns
/j2ee http//java.sun.com/xml/ns/j2ee/web-app_2_4.
xsd"gt - ltdisplay-namegtHelloWorldlt/display-namegt
- ltservletgt
- ltdescriptiongtlt/descriptiongt
- ltdisplay-namegtHelloWorldServletlt/display-namegt
- ltservlet-namegtHelloWorldServletlt/servlet-namegt
- ltservlet-classgtHelloWorldServletlt/servlet-classgt
- lt/servletgt
- ltservlet-mappinggt
- ltservlet-namegtHelloWorldServletlt/servlet-namegt
- lturl-patterngt/HelloWorldServletlt/url-patterngt
- lt/servlet-mappinggt
- ltwelcome-file-listgt
- ltwelcome-filegtindex.htmlt/welcome-filegt
- ltwelcome-filegtindex.jsplt/welcome-filegt
- lt/welcome-file-listgt
- lt/web-appgt
10Servlet Hello World
- Executando
- http//localhost8080/HelloWorld/HelloWorldServlet
11Ciclo de vida de um Servlet
- Antes que o Servlet esteja pronto para atender as
requisições do cliente, o container precisa
realizar algumas tarefas para levar o Servlet até
um estado no qual este possa atender tais
requisições.
12Ciclo de vida de um Servlet
13Ciclo de Vida de Um Servlet
Método Descrição
void init(ServletConfig) Invocado pelo container para iniciar o servlet. Recebe parâmetros especificados no deployment descriptor da aplicação
void service(ServletRequest, ServletResponse) Invocado pelo container para servir requisições dos clientes. Ele é quem na verdade intercepta as chamadas. Delega essas aos métodos correspondentes (doGet, doPost, ...)
void destroy( ) Invocado pelo container quando decide descarregar o servlet.
14Método service()
15A interface ServletConfig
16Parâmetros de inicialização
- ltweb-appgt
- ltservletgt
- ltservlet-namegtexemplolt/servlet-namegt
- ltservlet-classgtcurso.ExemploServletlt/servlet-c
lassgt - ltinit-paramgt
- ltparam-namegtJDBCDriverlt/param-namegt
- ltparam-valuegtsun.jdbc.odbc.JdbcOdbcDriverlt
/param-valuegt - lt/init-paramgt
- ltload-on-startupgt1lt/load-on-startupgt //
preloading - lt/servletgt
- lt/web-appgt
17Servlets e requisições
- Suportam todos os tipos de requisições. Mapeadas
em chamadas de métodos na instancia do Servlet em
questão. - GET doGet(...)
- POST doPost(...)
- PUT doPut(...)
- DELETE doDelete(...)
- TRACE doTrace(...)
- HEAD doHead(...)
- OPTIONS doOptions(...)
18Servlets e requisições
Características GET POST
Tipo de dados Texto Texto ou binário
Quantidade de dados Máximo de 255 caracteres Ilimitado
Visibilidade Dados fazem parte da URL e podem ser vistos Dados não fazem parte da URL e sim do corpo da mensagem. Não podem ser vistos
19Servlets e requisições
- Exemplos
- GET
- http//www.cin.ufpe.br/servlet/ServletProcurar?nu
mero12codigo1 - POST
- ltform methodPOST actionhttp//www.cin.ufpe.br
/servlet/ServletProcurargt - ltinput typetext namenumerogt
- ltinput typetext namecodigogt
- ltinput typesubmitgt
- lt/formgt
20Servlets e requisições analisando
- Interface ServletRequest
- Provê métodos de acesso ao conteúdo da requisição
que são relevantes a qualquer protocolo. - Pacote javax.servlet.
- Interface HttpServletRequest
- Extende ServletRequest
- Provê métodos relativos ao protocolo HTTP.
- Pacote javax.servlet.http.
21ServletRequest
Método Descrição
String getParameter(String paramName) Retorna o valor associado ao determinado parâmetro.
String getParameterValues(String name) Retorna todos os valores associados ao determinado parâmetro. (List boxes, Check boxes)
Enumeration getParameterNames() Retorna os nomes dos parâmetros passados na requisição.
22HttpServletRequest
Método Descrição
String getHeader(String headerName) Retorna um dos valores associados ao Header.
Enumeration getHeaderValues(String headerName) Retorna todos os valores associados ao Header
Enumeration getHeaderNames() Retorna os nomes dos Headers.
23Servlets e requisições Exemplo
- protected void doGet(HttpServletRequest
request, - HttpServletResponse
response) - throws
ServletException -
- String nome request.getParameter(name)
- int idade Integer.parseInt(request.getPa
rameter(age)) - fachada.cadastrarCliente(new
Cliente(nome, idade)) - response.sendRedirect(sucesso.jsp)
-
24Prática 1
- Escreva um servlet que receba o nome e o telefone
do usuário e retorne tais dados formatados em uma
string passada ao servlet como parâmetro de
inicialização - Use o método estático format da classe String
25Servlets - Enviando respostas
- Interface ServletResponse
- Provê métodos de resposta que são relevantes a
qualquer protocolo. - Pacote javax.servlet.
- Interface HttpServletResponse
- Extende ServletResponse
- Provê métodos relativos ao protocolo HTTP.
- Pacote javax.servlet.http.
26ServletResponse
Método Descrição
PrintWriter getWriter() Retorna um java.io.PrintWriter, que pode ser usado para enviar texto ao cliente.
ServletOutputStream getOutputStream() Retorna um javax.servlet.ServletOutputStream, que pode ser usado para enviar dados binários ao cliente.
void setContentType(String type) Usado para ajustar o tipo do conteúdo da resposta. Ex text/html, image/jpeg, application/jar
27HttpServletResponse
Método Descrição
void setXXXHeader(...) Seta pares nome / valor para o Header. (String, Inteiros, Datas)
boolean containsHeader(String name) Retorna se um header com este nome já está setado.
void sendRedirect(String location) Redireciona a chamada à URL especificada.
28Servlets Enviando RepostasExemplo
- protected void doGet(HttpServletRequest req,
- HttpServletResponse res)
- throws ServletException,
IOException -
- res.setContentType("application/jar")
- File f new File("test.jar")
- byte bytearray new byte(int) f.length()
- FileInputStream is new FileInputStream(f)
- is.read(bytearray)
- OutputStream os res.getOutputStream()
- os.write(bytearray)
- os.flush()
-
29Prática 2
- Crie um servlet que retorne uma imagem.
30Contextos
- O contexto de uma aplicação é, fisicamente, o
conjunto de componentes, arquivos recursos que a
compõem. (dentro do diretório do contexto). - Toda aplicação web deve possui um contexto
único. - http//localhost8080/contexto/hello
- No caso da API de J2EE, os contextos são
representados pela classe ServletContext.
31ServletContext
- Classe que representa o contexto de uma
aplicação. - Serve para comunicação entre servlets da mesma
aplicação (através do próprio contexto) e
servlets de aplicações diferentes (acessando
diferentes contextos) entre outras
funcionalidades.
32ServletContext
Método Descrição
Object getAttribute(String name) Retorna o objeto mapeado ao nome passado como parâmetro.
void setAttribute(String name, Object value) Associa um objeto a um nome no contexto.
Enumeration getAttibuteNames() Lista os nomes de todos os atributos presentes no contexto.
33ServletContext
Método Descrição
Enumeration getInitParameterNames() Retorna o nome de todos os parâmetros de inicialização.
URL getResource(String path) Retorna um recurso da aplicação. Podem acessar arquivos dentro de .jar, .war... Livre do sistema de arquivos
InputStream getResourceAsStream(String path) Retorna um recurso da aplicação. Podem acessar arquivos dentro de .jar, .war... Livre do sistema de arquivos
34ServletContext
Método Descrição
ServletContext getContext(String uri) Retorna o contexto da URI passada como parâmetro.
String getServerInfo() Retorna uma string contendo informações sobre o container web.
void log(String msg, Throwable t) Loga uma exceção com uma devida mensagem.
35ServletContext
Método Descrição
String getMimeType(String file) Retorna o mime do arquivo especificado ou null se o mime não eh conhecido
String getRealPath(String path) Retorna uma string contendo o caminho real do caminho relativo passado como parâmetro.
36Interface ServletContext
- As maneiras mais comuns de acessá-la são
- Através da requisição request.getServletConte
xt() - Através do próprio servlet
this.getServletContext() - Através da configuração config.getServletCont
ext()
37Prática 3
- Mude o servlet do exercício passado para que este
carregue a image como um recurso do contexto e
para que descubra o mime da mesma em tempo de
execução.
38Sessões Introdução
- Motivação
- Guardar informações entre requisições de um
cliente - Problema
- HTTP não mantém estado.
- Soluções.
- Campos ocultos em formulário.
- Cookies
- Reescrita de URLs
- Sessões
39Sessões
- É uma série de interações request-response sem
interrupções, ou seja, para cada requisição parte
da sessão, o servidor pode identificar que a
requisição vem do mesmo cliente - Características
- Armazenadas no lado do servidor.
- Possibilidade de se armazenar objetos Java.
- Única de cada cliente.
- Normalmente implementadas indiretamente através
de Cookies ou reescrita de URLs. - Representada pela classe HttpSession
40HttpSession
- Classe que representa uma sessão.
- Criação / Aquisição
- HttpSession s request.getSession(boolean
create) - create true se a sessão não existir, esta é
criada e depois retornada caso exista é,
simplesmente, retornada. - create false se a sessão não existir, retorna
null caso exista retorna a sessão existente.
41HttpSession Exemplo
- protected void doGet(HttpServletRequest request,
- HttpServletResponse
response) - throws ServletException
- HttpSession session request.getSession(t
rue) - Usuario user (User) session.getAttribute
("usuario") - if (user ! null)
- //Faça alguma coisa
- else
- session.invalidate()
- response.sendRedirect("login.jsp")
-
-
42HttpSession Métodos
Método Descrição
void setAttribute(String alias, Object objeto) Armazena um objeto na sessão corrente. A princípio, só o dono da sessão pode ter acesso a tal objeto.
Object getAttribute(String alias) Retorna o objeto armazenado com tal apelido.
void removeAttribute(String alias) Remove o objeto armazenado com tal apelido
43HttpSession Métodos
Método Descrição
void setMaxInactiveInterval(int segundos) Define quanto tempo a sessão poderá ficar inativa.
int getMaxInactiveInterval () Retorna quanto tempo a sessão poderá ficar inativa.
boolean isNew(String alias) Retorna se uma sessão é válida.
44HttpSession Métodos
Método Descrição
Enumeration getAttributesNames() Retorna uma enumeração com todos os nomes(alias) dos atributos armazenados na sessão.
void invalidate () Invalida a sessão e remove todos os objetos associados a ela.
45HttpSession
- Pode-se definir o Timeout de uma sessão no
deploymente descriptor da aplicação. - ltweb-appgt
-
- ltsession-configgt
- ltsession-timeoutgt30lt/session-timeoutgt
- lt/session-configgt
-
- ltweb-appgt
46Sessões
- Importante
- A sessão não é enviada a cada requisição /
resposta (lento e inseguro). Apenas o ID da
sessão é transmitido através de um cookie com
nome JSESSIONID. - A API de servlets permite o uso de sessões mesmo
que o navegador do usuário nao suporte cookies. É
preciso passar o valor do JSESSIONID como um
parâmetro especial da requisição. Isso pode ser
feito utilizando o método HttpServletResponse.enco
deURL(). (URL rewriting)
47Cookies
- Dados permanentes mantidos em um browser do
cliente entre várias sessões. - Informações do tipo nome / valor.
- Usados para armazenar perfis de usuários entre
outras funcionalidades.
48Cookie
- Classe
- javax.servlet.http.Cookie
- Criação
- Cookie c new Cookie(chave, valor)
- Obtenção
- Cookie cs request.getCookies()
- Persistindo
- response.addCookie(cookie)
49Cookie
- Por padrão, existem enquanto a sessão existir.
- Pode-se configurar o tempo de expiração de um
Cookie através do método - setMaxAge(int intervalo)
- Intervalo gt 0 tempo de vida em segundos.
- Intervalo 0 apaga o cookie instantaneamente.
- Intevalo lt 0 remove o cookie ao fim da sessão
50Cookie métodos
Método Descrição
String getName() Retorna a chave do cookie.
String/void get/setValue () Retorna ou ajusta o valor do cookie.
51Cookie Exemplo
- protected void doGet(HttpServletRequest request,
- HttpServletResponse
response) - throws ServletException
- HttpSession session request.getSession(t
rue) - Perfil p (Perfil) session.getAttribute(
perfil") - if (p ! null)
- //Atualiza o perfil
- response.addCookie(new Cookie(perfil,
p.toString())) - else
- response.sendRedirect(cadastroPerfil.
jsp") -
-
52Prática 4
- Crie um pequeno sistema (uma funcionalidade), que
só possa ser usada caso o usuário esteja logado. - Deverão ser criados
- Um servlet de login
- Um HTML com um form de login.
- Um servlet para a aplicacao em si.
- Um HTML de front-end da aplicação
- Uma página de erro com um link para a página de
login
53Método sendError()
- Métodos sendError() da interface
HttpServletResponse -
- public void sendError(int sc) throws
IOException - public void sendError(int sc, String msg)
throws IOException - Envia um erro como resposta para o cliente
utilizando o código de status e limpa o buffer de
saída. - Caso a resposta já tenha sido enviada, este
método lança a exceção IllegalStateException.
54Método sendError()
- try
- //processamento
-
- catch(Exception e)
- String msg Erro
- res.sendError(res.SC_NOT_FOUND, msg )
-
55Método sendError()
56Códigos
- 200 ok
- 400 Requisição mal formada
- 403 Acesso negado
- 404 Recurso inexistente
- 500 Erro no servidor (requisição não pode ser
tratada)
57Servlets e Threads
58O Modelo MultiThreaded
59O Modelo MultiThreaded
- Deve ser utilizado para grandes aplicações.
- Padrão
- Eficiente
- Difícil de preservar a consistência.
60O Modelo SingleThreaded
61O Modelo SingleThreaded
- Deve-se implementar a interface SingleThreadModel
- Apesar de conveniente não é aconselhável utilizar
pelas seguintes razões - Pode ocupar muita memória.
- Falsa sensação de segurança de thread.
- Falta de compartilhamento de dados.
- Extremamente ineficiente
62Variáveis X Segurança
63Context scope
- Não é Thread-Safe.
- Usado para compartilhar dados que são raramente
modificados.
64Session scope
- Não é Thread-Safe. O usuário pode abrir várias
janelas do browser simultaneamente. - Geralmente sincroniza-se o acesso a sessão. (Não
causa perda de eficiência relevante)
65Request scope
- É Thread-Safe.
- Deve se usado apenas no escopo do método
service(...).
66Observação.
- Existe uma outra variação do comportamento de um
servlet. Quando o elemento servlet do descritor
web declara o sub-elemento ltdistributable/gt. Essa
marcação é útil em ambiente distribuído. Ela
indica que cada JVM do cluster possuirá sua
própria instancia do servlet.
67Upload
68Upload
- Submissão de arquivos do cliente para o
servidor. - Utilização da biblioteca commons-fileupload-1.0
da apache foundation. - Import org.apache.commons.fileupload.
69Upload o html
- ltform action"/curso/up" enctype"multipart/form-d
ata" method"post"gt - ltinput type"file" name"datafile" size"40"gt
- ltinput type"submit" value"Send"gt
- lt/formgt
70Upload o servlet
- public void doPost(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException - DiskFileUpload fu new DiskFileUpload()
- try
- fu.setSizeMax(1000000)
- fu.setSizeThreshold(4096)
- fu.setRepositoryPath(this.getServletCo
ntext().getRealPath("/tmp")) - List fileItems fu.parseRequest(reque
st) - Iterator i fileItems.iterator()
- while (i.hasNext())
- FileItem fi (FileItem)i.next()
- String fileName fi.getName()
- fi.write(new File(this.getServletC
ontext().getRealPath("/tmp")
getRelativePath(fileName))) -
-
71Prática 5
- Escreva um servlet e uma página para realizar
uploads de arquivos.
72Filtros
73Filtros
- Para uma aplicação web, um filtro é um
componente que reside no servidor e atua
intermediando (filtrando) as mensagens trocadas
por tal servidor e pelo cliente. - Previne que informações indesejadas transitem
livremente.
74Filtros
75Filtros funcionamento
- Quando o container recebe uma requisição de um
recurso, ele checa se existe um filtro associado
a tal recurso. Em caso positivo, ele direciona a
requisição para tal filtro. Este, depois de
processar a requisição, pode - Gerar a resposta ele mesmo.
- Passa a requisição (modificada ou não) para o
recurso requisitado. - Repassar a requisição para outro recurso.
76Filtros implementação
- Todos os filtros
- Devem implementar a interface Filter (init(),
doFilter(), destroy()) - Estarem corretamente mapeados no descritor da
aplicação
77Filtros API
Interface / Classe Descrição
javax.servlet.Filter Interface implementada para construir os filmes
javax.servlet.FilterChain Representa a cadeia de filtros.
javax.servlet.FilterConfig Similar ao ServletConfig.
78Filtros exemplo
- public class ExFilter implements Filter
- public void doFilter(ServletRequest req,
ServletResponse res, FilterChain fc) - // processa a requisição e faz a validação
- // dos parâmetros
- fc.doFilter(req, res)//passa o controle
para - // o próximo filtro ou para o recurso
-
- ...
-
79Filtros implementação
- ltfiltergt
- ltfilter-namegtvalidarlt/filter-namegt
- ltfilter-classgtcurso.ExFilterlt/filter-classgt
- lt/filtergt
- ltfilter-mappinggt
- ltfilter-namegtvalidarlt/filter-namegt
- lturl-patterngt/secure/lt/url-patterngt
- lt/filter-mappinggt
- OBS O mapeamento pode ser feito pelo nome do
servlet também. - ltfilter-mappinggt
- ltfilter-namegtvalidarlt/filter-namegt
- lturl-patterngtloginServletlt/url-patterngt
- lt/filter-mappinggt
80Filtros
- Pode-se encadear um conjunto de filtros
81Filtros encadeando
- Quando o container recebe, ele acha todos os
filtros que mapeiam a máscara da url do recurso e
forma o primeiro conjunto. Em seguida acha todos
os filtros que mapeiam o recurso no nome do
servlet. A ordem da cadeia é feita da seguinte
forma - O primeiro conjunto antecede o segundo
- Cada conjunto é ordenado de acordo com a
declaração dos filtros no descritor da aplicação.
- Nesse caso, o método doFilter() passa a mensagem
para o próximo filtro ou para o recurso
propriamente dito.
82Filtros encadeando
- ltfiltergt
- ltfilter-namegtValidatorFilterlt/filter-namegt
- ltfilter-classgtValidatorFilterlt/filter-classgt
- lt/filtergt
- ltfiltergt
- ltfilter-namegtSpamFilterlt/filter-namegt
- ltfilter-classgtSpamFilterlt/filter-classgt
- lt/filtergt
- ltfilter-mappinggt
- ltfilter-namegtValidatorFilterlt/filter-namegt
- lturl-patterngt/secure/lt/url-patterngt
- lt/filter-mappinggt
- ltfilter-mappinggt
- ltfilter-namegtSpamFilterlt/filter-namegt
- lturl-patterngt/secure/lt/url-patterngt
- lt/filter-mappinggt
83Prática 6
- Escreva uma pequena aplicação que filtre um
subconjunto de requisições, redirecionando estas
para uma página de erro ou, para o caso de uma
requisição aprovada, envie esta para um servlet
que realize um processamento simples.
84Eventos de ciclo de vida
85Eventos
- A criação ou destruição, assim como a manipulação
de atributos, tanto no contexto como na sessão,
levantam eventos que podem ser capturados por
classes implementadas pelo desenvolvedor. - Tais classes devem implementar as respectivas
classes
86Eventos
Método Descrição
void contextDestroyed (ServletContextEvent sce) Chamado quando o contexto é destruído.
void contextInitialized (ServletContextEvent sce) Chamado quando o contexto é criado.
87Eventos
- ServletContextAttributeListener
Método Descrição
void attributeAdded (ServletContextAttributeEvent scae) Chamado quando um atributo é adicionado ao contexto
void attributeRemoved (ServletContextAttributeEvent scae) Chamado quando um atributo é removido do contexto
void attributeReplaced (ServletContextAttributeEvent scae) Chamado quando um atributo é substituído do contexto
88Eventos
Método Descrição
void sessionCreated (HttpSessionEvent se) Chamado quando a sessão é criada.
void sessionDestroyed (HttpSessionEvent se) Chamado quando a sessão é destruida.
89Eventos
- HttpSessionAttributeListener
Método Descrição
void attributeAdded (HttpSessionBindingEvent scae) Chamado quando um atributo é adicionado à sessão
void attributeRemoved (HttpSessionBindingEvent scae) Chamado quando um atributo é removido da sessão
void attributeReplaced (HttpSessionBindingEvent scae) Chamado quando um atributo é substituído da sessão
90Eventos
- Configurando
- ltlistenergt
- ltlistener-classgt
- com.abcinc.MyServletContextAttributeListener
- lt/listener-classgt
- lt/listenergt
- OBS Apenas o nome da classe ouvinte precisa
ser declarada, pois o container faz as devidas
inferências.
91Eventos
- Existem outras interfaces de eventos
- HttpSessionBindingListener
- HttpSessionActivationListener
- Não serão abordadas nesse curso.
92Eventos
- Existem outras interfaces de eventos
- HttpSessionBindingListener
- HttpSessionActivationListener
- Não serão abordadas nesse curso.