Desenvolvimento de
Projeto e Aplicações
Web
Ceça Moraes – [email protected]
Conteúdo

05/11/2015
Servlets
2
Servlets


Módulos de programas em Java

Pacote javax.servlets

incluídos na especificação da J2EE
Recebem pedidos, executam o
serviço e geram respostas




05/11/2015
paradigma request-response
Residem no servidor
Grande uso na geração de
conteúdo dinâmico na web
Baseados em CGI
3
CGI – Common Gateway
Interface



05/11/2015
Especificação de transferência de
informações entre um servidor
Web e um programa
Um programa CGI pode ser escrito
em linguagens de programação: C,
Perl, Java, or Visual Basic.
Maneira usual de fazer o servidor
Web interagir dinamicamente com
o cliente
4
CGI – Common Gateway
Interface

Exemplo:


Métodos HTTP


05/11/2015
Formulário HTML usando um
programa CGI no servidor para
processar os dados digitados
GET: linha de comando.
POST: entrada/saída padrão e
sem limite de caracteres.
5
Formulários



05/11/2015
Interface HTML para a entrada de
dados pelo usuário (cliente)
<FORM> define um bloco de
formulário.

ACTION: a URL do programa CGI

METHOD, o método do protocolo HTTP
Objetos do formulário: INPUT,
SELECT, TEXTAREA

NAME identifica uma variável

VALUE identifica valor armazenado.
6
Gateways CGI para SGBDs
Converte comandos de formulário HTML
para a linguagem sistema de banco de
dados.
 Converte respostas do SGBD p/ HTML
Cliente

05/11/2015
7
Servlets

05/11/2015
Cria threads para cada requisição
Web.
8
Arquitetura
Servidor Web
Container Servlet
Context
05/11/2015
9
Características




Servlets não têm GUI
Rodam no servidor e não no
cliente
Não são carregados pela
rede
Máquina virtual está no
servidor (e não no Browser)

05/11/2015
Mais eficiente, mais completa
10
e mais confiável
Ciclo de vida de servlets
• service(): Recebe e
processa as requisições
• pedidos GET são
repassados para o
método doGet()
•pedidos POST são
repassados para o
método doPost()
05/11/2015
11
Implementação Simples


05/11/2015
Herdar da classe
HttpServlet
Redefinir métodos doGet()
e doPost() para
implementar os serviços
12
Implementação Simples


05/11/2015
Dentro dos métodos
doGet()/doPost(), ler
parâmetros vindos do
formulário HTML ou da URL
Processar os parâmetros,
fazer validações, executar
lógica de negócio e montar
a reposta para o usuário
13
Acesso aos servlets

Diretamente através da URL
http://www.faculdademarista.co
m.br/servlet/ServletPgto?
matr=“2312"&valor=1000
05/11/2015
14
Acesso aos servlets

Através de formulários HTML



Pode escolher métodos GET ou POST
Passagem de parâmetros automática
Exemplo:
<form method=“POST”
action=“http://www.faculdademarista.com.
br/servlet/ServletPgto”>
<input type=“text” name=“matr”
value=“2312”>
<input type=“text” name=“valor”
size=“1000”>
<input type=“submit” >
15
</form>
Acesso aos servlets
05/11/2015
16
Classes e Interfaces básicas

<<Interface>>
Servlet


GenericServlet
<<interface>>
HttpServlet
Interface Servlet
Classe GenericServlet


Implementa interface Servlet
HttpServlet


05/11/2015
Métodos para gerenciar servlets
Estende GenericServlet
Acrescenta funcionalidade
17
específica para o protocolo HTTP
Classes e Interfaces básicas

ServletRequest


ServletResponse


O que o servidor retorna para o
cliente
HttpServletRequest,
HttpServletResponse

05/11/2015
Conteúdo que é passado do
cliente para o servidor

Estendem ServletRequest e
ServletResponse
Comunicação específica para o 18
protocolo HTTP
HttpServlet


Fornece um framework para
lidar com o protocolo HTTP
Introduz suas próprias
subclasses de request e
response para lidar com o
protocolo HTTP

05/11/2015
HTTPServletRequest e
HTTPServletResponse
19
HttpServlet: recebendo
dados

getQueryString

Retorna um String url-encoded:


Obtenção dos parâmetros



05/11/2015
nome=Fernando&credibilidade=0
getParameter
getParameterValues
getParameterNames
20
HttpServlet: Exemplo
import javax.servlet.*;
import java.io.*;
public class ServletHelloWorld extends
HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
05/11/2015
PrintWriter out = res.getWriter();
out.println("<HEAD><TITLE>Primeiro”);
out.println(“Servlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("<center><h1>Hello
World!</h1><center>");
out.println("</BODY>");
out.close();
}
}
21
HttpServlet: Exemplo
05/11/2015
22
Fase de serviço: service()



05/11/2015
Os dados da requisição chegam
ao servlet através de um objeto
do tipo ServletRequest
A requisição pode ser
respondidada através de um
objeto do tipo
ServletResponse
Protocolo HTTP, os objetos
usados são instâncias de
HttpServletRequest e
HttpServletResponse
23
ServletRequest

<<Interface>>
ServletRequest
Métodos para obter:



Informações do
cliente
Informações da URL
Parâmetros
fornecidos pelo
usuário
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
getAttribute(s : String) : Object
getAttributeNames() : Enumeration
getCharacterEncoding() : String
getContentLength() : int
getContentType() : String
getInputStream() : ServletInputStream
getLocale() : Locale
getLocales() : Enumeration
getParameter(s : String) : String
getParameterNames() : Enumeration
getParameterValues(s : String) : String[]
getProtocol() : String
getReader() : BufferedReader
getRealPath(s : String) : String
getRemoteAddr() : String
getRemoteHost() : String
getRequestDispatcher(s : String) : RequestDispatcher
getScheme() : String
getServerName() : String
getServerPort() : int
isSecure() : boolean
removeAttribute(s : String) : void
24
setAttribute(s : String, obj : Object) : void
ServletRequest
Parâmetros

String
getParameter(String
nomeParametro)

05/11/2015
Retorna um string com o
valor do parâmetro
especificado na variável
nomeParametro ou null se o
parâmetro não existir
25
ServletRequest
Parâmetros

String[]
getParameterValues(String
nomeParametro)


05/11/2015
Retorna os valores do parâmetro
especificado na variável
nomeParametro, como um
array de strings, ou null se o
parâmetro não existir
Parâmetros com múltiplos
valores, como listas
26
ServletRequest
Parâmetros

Enumeration
getParameterNames()

05/11/2015
Retorna o nome dos parâmetros
do request como uma
enumeração de strings, ou uma
enumeração vazia, se não
houver parâmetros
27
ServletRequest - Parâmetros

ServletRequest representa o pedido

getParameter(String nomeParametro)
http://localhost:8080/servlet/HelloPersonServlet?nome=Eduardo
// ...
public class HelloPersonServlet extends
HttpServlet {
public void doGet(HttpServletRequest request,
// ...
{
// ...
String nome = request.getParameter(“nome”);
out.println("<h1> Hello " + nome + " </h1>");
// ...
}
28
}
HttpServletRequest

Métodos para leitura de
cookies


Métodos para
gerenciamento de sessões

05/11/2015
Cookie[] getCookies()
HttpSession
getSession(boolean
create)
29
ServletResponse

Encapsula a reposta do servlet
<<Interface>>
ServletResponse
05/11/2015
+
+
+
+
+
+
+
+
+
+
+
+
flushBuffer() : void
getBufferSize() : int
getCharacterEncoding() : String
getLocale() : Locale
getOutputStream() : ServletOutputStream
getWriter() : PrintWriter
isCommitted() : boolean
reset() : void
setBufferSize(i : int) : void
setContentLength(i : int) : void
setContentType(s : String) : void
setLocale(locale : Locale) : void
30
ServletResponse - Saída

getWriter()


getOutputStream()


para escrever dados binários
Pode-se chamar o método
setContentType() antes de
chamar getWriter() ou
getOutputStream()

05/11/2015
para escrever dados textuais
o tipo padrão é “text/plain”
31
ServletResponse - Saída

Exemplo
...
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML><BODY>Bom
Dia!</BODY></HTML>");
...
05/11/2015
32
HttpServletResponse

Métodos para




05/11/2015
enviar códigos de status ou de
erros para o cliente
redirecionar o cliente para outra
URL
adicionar cookies à resposta
....
33
Mantendo o Estado
entre Requisições
Mantendo o Estado entre
Requisições

Objetivo


05/11/2015
manter um estado
conversacional entre o
cliente e o servidor
persistindo algum tipo de
informação entre as
requisições do cliente
Cookies e Sessões
35
Cookies



Concebidos pela Netscape
(versão 0)
Informações ficam
armazenadas no browser,
em memória ou em disco
Suportado na API de
Servlets

05/11/2015
classe Cookie
36
Cookies

Características




05/11/2015
Tamanho máximo de 4KB por
cookie
Um navegador armazena no
máximo 20 cookies por servidor
Informações do cookie são
enviadas e recebidas em toda
transação HTTP
São enviados apenas para o
servidor de origem
37
Cookies: manipulação

Recuperação dos cookies



retorna uma matriz de cookies
acessíveis da página
Adição de cookies


05/11/2015
getCookies() da classe
HttpServletRequest
addCookie(Cookie) da classe
HttpServletResponse
envia um cookie para o
navegador
38
Sessões

O protocolo HTTP não mantém
estado de sessão


São criadas no lado do servidor



05/11/2015
As aplicações Web devem mantê-lo
quando necessário
podem armazenar variáveis e objetos
de programas Java
Uma sessão por cliente
Expiram depois de um intervalo de
tempo definido no servidor
39
Sessões

05/11/2015
A sessão é única para cada
cliente e persiste através de
várias requisições
40
Sessões

Implementadas pela
interface HttpSession
<<Interface>>
HttpSession
(from http)
05/11/2015
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
getAttribute(s : String) : Object
getAttributeNames() : Enumeration
getCreationTime() : long
getId() : String
getLastAccessedTime() : long
getMaxInactiveInterval() : int
getSessionContext() : HttpSessionContext
getValue(s : String) : Object
getValueNames() : String[]
invalidate() : void
isNew() : boolean
putValue(s : String, obj : Object) : void
removeAttribute(s : String) : void
removeValue(s : String) : void
setAttribute(s : String, obj : Object) : void
41
setMaxInactiveInterval(i : int) : void
Sessões

Operações básicas

Criação da sessão




05/11/2015
HttpSession session =
req.getSession(boolean
create)
Retorna a sessão corrente
associada com o request req
Se não existe uma sessão, e
create=true, retorna uma nova
sessão
Se create=false e o request não
possui uma sessão, este método
retorna null
42
Sessões

Operações básicas

Inserção de um objeto
Poupanca p = new
Poupanca(“34560”,513.00);
session.setAttribute(“poupanca”,p);
05/11/2015
43
Sessões

Operações básicas

Consulta a um objeto
Poupanca objeto = (Poupanca)
session.getAttribute(“poupanca”)

Remoção do objeto
session.removeAttribute(“poupanca”)
05/11/2015
44
Sessões: propriedades

Enumeration
getAttributeNames()


boolean isNew()

05/11/2015
retorna uma enumeração
com todos os nomes dos
atributos armazenados na
sessão
retorna true se a sessão é
nova para o cliente. Retorna
false para sessões
45
preexistentes
Sessões: propriedades

boolean isNew()

05/11/2015
Para saber se uma sessão é nova,
use o método isNew()
if (session.isNew()) {
myObject = new BObject();
} else {
myObject = (BObject)
session.getAttribute("obj");
}
46
Gerenciamento de Sessão


Não há como saber que cliente não
precisa mais da sessão
Pode-se definir um timeout em
minutos para a duração de uma
sessão desde a última requisição
do cliente



05/11/2015
setMaxInactiveInterval(int
segundos) define novo valor para
timeout
se intervalo for -1 sessão nunca
expira
int getMaxInactiveInterval()
recupera valor de timeout
47
Sessões – Exemplo

05/11/2015
salvando objeto na sessão
public class ControleSessaoServlet {
public void doGet( ...) {
HttpSession session
=request.getSession(true);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String nome =
request.getParameter("nome");
Pessoa p = new Pessoa(nome);
session.setAttribute("usuario",p);
out.println("<a
href=\"/servlet/SeuNomeServlet\">"+
"Clique aqui</a>");
out.close();
}
}
48
Sessões – Exemplo
–
05/11/2015
recuperando objeto da sessão
public class SeuNomeServlet {
public void doGet() {
HttpSession session =
request.getSession(false);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if (session != null) {
Pessoa p = (Pessoa)
session.getAttribute("usuario");
out.println("Seu nome é" + p.getNome());
} else {
out.println("Sessão inválida");
}
out.close();
}
49
}
Compartilhamento de
objetos na sessão


05/11/2015
Como a sessão pode persistir
além do tempo de uma
requisição, é possível que a
persistência de alguns objetos
não sejam desejáveis
Use o método
removeAttribute("nome")
para remover objetos da
sessão
50
Download

Click here to get the file