Vous êtes sur la page 1sur 46

Servlets

Carlos Bazilio
Depto de Cincia e Tecnologia
Plo Universitrio de Rio das Ostras
Universidade Federal Fluminense

Servlets
So o bloco bsico do desenvolvimento
web em Java
Servlets so classes hospedadas num
servidor que respondem a requisies
HTTP
De maneira informal e resumida, servlets
so classes java que geram pginas html
Um servlet uma especializao da
classe javax.servlet.http.HttpServlet
2

Servlets
package br.com.siriusnet.cursojava;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.IOException;
public class PrimeiroServlet extends HttpServlet {
public void doGet ( HttpServletRequest req,
HttpServletResponse res )
throws IOException {
ServletOutputStream out = res.getOutputStream();
res.setContentType("text/html");
out.println("<html><head><title>Bsico</title></head>")
;
out.println("<body>Voc est no endereo: " +
req.getRemoteAddr() + "!!</body></html>");
3
}

Servlets Implantao
Para a compilao do exemplo, devemos
incluir a API de servlets:
<tomcat6-path>/lib/servlet-api.jar ou
<tomcat5-path>/common/lib/servlet-api.jar

O arquivo chave para implantao de um


servlet o web.xml (descritor de
implantao)

Descritor de Implantao
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>primeiro</servlet-name>
<servlet-class>
br.com.siriusnet.cursojava.PrimeiroServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>primeiro</servlet-name>
<url-pattern>/alou</url-pattern>
</servlet-mapping>
</web-app>
5

Diretrios do Tomcat
Executveis
Configurao do Tomcat
Bibliotecas compartilhadas
entre aplicaes
Diretrio de implantao de
aplicaes
Contexto de uma aplicao
especfica; pode conter
arquivos html, jsp, etc
Diretrio que contm o descritor
de implantao web.xml
Diretrio que contm as
compilaes dos servlets
(.class) de uma aplicao
Bibliotecas de uma aplicao
Temporrio das aplicaes

Servlets Distribuio
de Aplicaes
Podemos colocar toda aplicao Web
dentro de um arquivo .war
WAR anlogo ao JAR para programas
Java; deve conter toda a rvore de
diretrios da aplicao, exceto a raiz
No Tomcat, para implantarmos um WAR
basta que copiemos o arquivo para o
diretrio <tomcat>/webapps
Na implantao no necessrio que o
Tomcat seja reiniciado

import
import
import
public
//
//

Mtodos herdados de
HTTPServlet

javax.servlet.http.*;
javax.servlet.*;
java.io.IOException;
class CicloDeVida extends HttpServlet {
Metodo chamado para inicializar o servlet
O metodo da superclasse precisa ser chamado quando este
metodo eh sobrescrito
public void init(ServletConfig arg0) throws ServletException { }
// Este metodo eh invocado quando solicitacoes chegam
// Este metodo nao precisa ser obrigatoriamente sobrescrito
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException { }
// Chamado por service() quando solicitacoes GET sao recebidas
public void doGet(HttpServletRequest arg0, HttpServletResponse
arg1) throws ServletException, IOException { }
// Chamado por service() quando solicitacoes POST sao recebidas
public void doPost(HttpServletRequest arg0, HttpServletResponse
arg1) throws ServletException, IOException { }
// Chamado quando o servlet eh destruido pelo conteiner
public void destroy() { }
8

Tratamento de Mensagens
GET e POST
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.IOException;
public class CicloDeVida extends HttpServlet {
public void doGet(HttpServletRequest arg0, HttpServletResponse
arg1) throws ServletException, IOException {
this.processa(arg0, arg1);
}
public void doPost(HttpServletRequest arg0, HttpServletResponse
arg1) throws ServletException, IOException {
this.processa(arg0, arg1);
}
public void processa(HttpServletRequest arg0,
HttpServletResponse arg1) throws ServletException, IOException
{

// Processamento da requisio
}
}

Servlets Ciclo de Vida


O continer recebe uma solicitao;
O objeto servlet existe?
Se no existe, o continer instancia o servlet e
o inicializa com o mtodo init();
O continer invoca o metodo service() do servlet;
A requisio enviada para o mtodo service()
do cliente, o qual invoca o mtodo doXXX()
apropriado;
A resposta ento retornada para o cliente.
10

HTTPServletRequest e
HTTPServletResponse
Estas 2 classes so cruciais para o tratamento
de requisies atravs de servlets
A classe HTTPServletRequest representa uma
requisio e contm todas as informaes do
cliente solicitante
IP do cliente, cookies, header do HTTP, etc

A classe HTTPServletResponse utilizada para


preparar a resposta ao cliente
Com esta classe podemos:
Adicionar novos cookies, adicionar uma nova entrada
no cabealho HTTP, redirecionar uma requisio para
tratamento por outro recurso, etc
11

Servlets Alguns
Mtodos
HttpServletRequest
String getParameter(String name) Retorna
parmetros de solicitao de campos de um
formulrio;
String getRemoteAddress() Retorna o endereo
IP da mquina cliente;
Cookie [] getCookies() Retorna um array de
todos os cookies;
String getHeader(String name) Retorna o valor
da entrada name no cabealho HTTP como uma
string.
12

Servlets Alguns
Mtodos
HttpServletRequest
RequestDispatcher getRequestDispatcher
(String url) Cria um dispatcher para o
recurso url; assim podemos encaminhar a
requisio utilizando o mtodo forward() da
classe RequestDispatcher
HttpSession getSession() Retorna uma
referncia para a sesso associada
requisio, ou cria uma nova caso a sesso
no exista
13

Servlets Alguns
Mtodos
HttpServletResponse
java.io.ServletOutputStream getOutStream()
Retorna o outputstream de forma que
possamos gravar dados no cliente;
void setContentType(String mime)
Configura o tipo de contedo de sada; Lista
completa dos tipos MIME em
http://www.iana.org/assignments/mediatypes/i
ndex.html
14

Servlets Alguns
Mtodos
HttpServletResponse
void addCookie(Cookie cookie) Adiciona um
cookie ao cabealho da resposta;
void addHeader(String name, String value)
Adiciona o cabealho especificado
resposta;
void sendRedirect(String url) Redireciona
uma solicitao para outro recurso (servlet ou
pgina www).
15

Processando Formulrios

<html>
<head>Um Form Bsico</head>
<body>
<h1>Entre com seus dados:</h1>
<form action="processaForm" method="POST">
Tratamento: <select size="1" name="titulo">
<option>Sr.</option>
<option>Sra.</option>
</select>
Nome: <input type="text" name="nome" size="20"><br>
Cidade: <input type="text" name="cidade" size="20"><br>
<p>Selecione seus interesses:</p>
<input type="checkbox" name="interesses"
value="esportes">Esportes<br>
<input type="checkbox" name="interesses"
value="musica">Musica<br>
<input type="checkbox" name="interesses"
value="leitura">Leitura<br>
<p><input type="submit" value="Envie"></p>
</form>
</body>
16
</html>

Processando Formulrios

public class ProcessaFormulario extends HttpServlet {


private void processa(HttpServletRequest req, HttpServletResponse res)
throws IOException {
ServletOutputStream out = res.getOutputStream();
res.setContentType("text/html");
String tratamento = req.getParameter("titulo");
String nome = req.getParameter("nome");
String cidade = req.getParameter("cidade");
String interesses[] = req.getParameterValues("interesses");
out.println("<html><head><title>Resp do Servlet</title></head>");
out.println("<body>");
out.println("Ol " + tratamento + " " + nome);
out.println("Voc mora em " + cidade + " e seus interesses so: ");
out.println("<ul>");
for (String interesse : interesses) {
out.println("<li>");
out.println(interesse);
out.println("</li>");
}
out.println("</ul></body></html>");
17
} }

Processando Formulrios
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>segundo</servlet-name>
<servlet-class>
br.com.siriusnet.cursojava.ProcessaFormulario</servletclass>
</servlet>
<servlet-mapping>
<servlet-name>segundo</servlet-name>
<url-pattern>/processaForm</url-pattern>
</servlet-mapping>
</web-app>
18

Redirecionamentos
Ao receber uma requisio, um servlet pode:
Respond-la diretamente, produzindo algum
contedo html a ser enviado ao cliente (navegador)
Encaminh-la para algum outro recurso responsvel
por responder a esse tipo de requisio

H, ao menos, 2 formas de encaminhamento:


Chamada ao mtodo
HttpServletResponse.sendRedirect(String url)
Criao de um objeto do tipo RequestDispatcher e
chamada ao mtodo forward(HttpServletRequest,
HttpServletResponse)
19

Redirecionamentos
A chamada do mtodo sendRedirect(String url)
faz com que o servidor envie ao cliente uma
mensagem para que este envie a solicitao a
uma nova url
Na verdade, o servidor envia ao cliente uma
mensagem HTTP com cdigo 302, o qual indica
que o recurso foi movido para outra url
O redirecionamento atravs da classe
RequestDispatcher interno ao servidor; ou
seja, no h comunicao com o cliente
20

Redirecionamentos
Em termos de prticos, para o cliente
(navegador), a primeira opo modifica o
endereo url no navegador, enquanto que
a segunda no
Em temos de projeto de aplicaes web,
redirecionamentos so utilizados entre
Servlets/JSPs como um mecanismo de
delegao de tarefas entre recursos
21

Exerccio

Crie 2 formulrios para fazer autenticao de um usurio


O primeiro deve obter o nome do usurio no sistema
Caso seja um usurio cadastrado, a solicitao deve ser
direcionada para um outro formulrio que pedir a senha
Este segundo formulrio deve ser enviado de forma segura, assim
como a senha
A senha deve ser fornecida por, no mximo, 10 seg; caso seja
fornecida aps, o sistema retorna para a pgina inicial
As informaes de usurio/senha podem estar no prprio servlet ou
em algum banco de dados
Aps a autenticao correta, deve ser enviada ao cliente uma
pgina de boas-vindas
Aps falha na autenticao, o usurio deve ser direcionado para
uma pgina de erro com um link para nova tentativa

22

Exerccio

23

Escopo
O escopo de um objeto indica quanto
tempo o objeto existe depois de ter sido
criado;
Os nveis de escopo variam desde o tempo
de vida do continer at o tempo de vida
de uma pgina individual;
Em aplicaes Web, podemos definir 4
nveis de escopos diferentes: Aplicao,
Sesso, Solicitao/Requisio e Pgina
24

Escopo

25

Escopo Aplicao
Objetos compartilhados por todos os
servlets em uma dada aplicao
Exemplo: conexo com banco de dados,
lista de produtos numa aplicao de
controle de estoque, etc.

26

Obtendo Acesso aos Tipos


de Escopos
Aplicao
A classe HTTPServlet possui um mtodo
getServletContext() que retorna um objeto do tipo
ServletContext
Este objeto nos permite, por exemplo, criar atributos
que existiro enquanto o servidor estiver no ar
Outra alternativa atravs do mtodo init() de
HTTPServlet, o qual possui um parmetro que uma
instncia da classe ServletConfig; esta classe possui
um mtodo denominado getServletContext() que
retorna a mesma referncia citada no sub-item
anterior
27

Escopo Sesso
Objetos compartilhados numa sesso
vinculada a um usurio
Exemplo: carrinho num site de compras

28

Obtendo Acesso aos Tipos


de Escopos
Sesso
A classe HTTPServletRequest (primeiro
parmetro dos mtodos doGet()/doPost())
possui o mtodo getSession(), que retorna
uma referncia para a sesso corrente
Caso no exista sesso corrente ativa, uma
nova criada

29

Escopo Pgina
Objetos compartilhados entre JSPs e
servlets na pgina de execuo atual
Exemplo: variveis locais declaradas em
pginas JSPs

30

Escopo Requisio
Objetos compartilhados disponveis para
JSPs/Servlets numa solicitao
Difere do escopo de pgina por permitir o
compartilhamento tambm para
JSPs/Servlets includas ou redirecionadas
Exemplo: parmetros de campo de
formulrio
Pode ser acessado atravs da classe
HTTPServletRequest
31

Listeners e Filters
Permitem que tenhamos maior controle do uso das
nossas aplicaes web
Listeners sero usualmente utilizados para observar o
ciclo de vida de atributos (criao, atualizao e
remoo) para os escopos disponveis
Filters, por sua vez, permitem que as requisies
possam ser interceptadas antes ou depois de alcanar o
recurso desejado (um servlet, por exemplo)
Ambos funcionam como funes de callback, ou seja,
aps a criao, o continer quem faz chamadas a
estes mtodos

32

Listeners de Aplicaes
Web
Usando a API de servlets (javax.servlet),
podemos criar listeners de eventos para
aplicaes web
Estes listeners esto definidos como interfaces
nesta API
Esto disponveis para os escopos:
Escopo de aplicao: ServletContextListener,
ServletContextAttributeListener
Escopo de sesso: HTTPSessionListener,
HTTPSessionAttributeListener
Escopo de requisio: ServletRequestListener,
ServletRequestAttributeListener
33

Listener de Aplicao
public class EscutadorAplicacao implements ServletContextListener
{
public void contextDestroyed(ServletContextEvent arg0) {}
public void contextInitialized(ServletContextEvent arg0) {}
}

public class EscutadorAtributoAplicacao implements


ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0)
{ }
public void attributeRemoved(ServletContextAttributeEvent
arg0) {}
public void attributeReplaced(ServletContextAttributeEvent
arg0) {}
}
34

Listener de Aplicao
public class EscutadorAplicacao implements ServletContextListener,
ServletContextAttributeListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("Aplicao encerrada");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Aplicao inicializada");
Calendar cal = new GregorianCalendar();
arg0.getServletContext().setAttribute("iniciou", cal);
}
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println(arg0.getName() + ": ");
System.out.println(arg0.getValue().toString());
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
}
public void attributeReplaced(ServletContextAttributeEvent arg0)
{ }
35
}

Listener de Aplicao
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
...
<listener>
<listener-class>
br.com.siriusnet.cursojava.EscutadorAplicacao
</listener-class>
</listener>
...
</web-app>

36

Listener de Aplicao
A execuo da aplicao fornecida no
Tomcat far com que os comandos
System.out.println() sejam enviados para
um arquivo de log: <Tomcat>/logs
Testes anlogos podem ser feitos para os
listeners de sesso e requisio

37

Exerccio
Criar 2 tipos de contadores:
Um contador de acessos, o qual contar a
quantidade de acessos servlets
Um outro que contar a quantidade de
sesses abertas para a aplicao num dado
momento

Crie um servlet que exiba estes valores

38

Servlets Container
Multithreaded

39

Filtros de Servlets
Filtros permitem a interceptao de uma
solicitao antes/aps que esta atinja o recurso
solicitado
Em outras palavras, um filtro d acesso aos
objetos HTTPServletRequest e
HTTPServletResponse antes destes serem
passados a um servlet
Um filtro pode ser um ponto ideal para: log de
requisies, criptografia, autenticao,
compresso de dados, validao do usurio, etc
40

Filtros de Servlets
Filtros podem ser organizados em
cadeias, de forma que mais de 1 filtro
possa ser acionado para uma mesma
solicitao
Para criao de um filtro, basta criar uma
classe que implemente a interface
javax.servlet.Filter

41

Filtros de Servlets
public class FiltraRequisicao implements Filter {
@Override
public void init(FilterConfig arg0)
throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0,
ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
}
}

42

Filtros de Servlets
public class FiltraRequisicao implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2)
throws IOException, ServletException {
Calendar cal = Calendar.getInstance();
System.out.println("Endereo: " + arg0.getRemoteAddr());
System.out.println("Recurso: " +
((HttpServletRequest)arg0).getRequestURL().toString());
System.out.println("Hora: " + cal.getTime().toString());
arg2.doFilter(arg0, arg1);
}
43
}

Filtros de Servlets
<web-app>
<servlet>
<servlet-name>primeiro</servlet-name>
<servlet-class>br.com.siriusnet.cursojava.PrimeiroServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>primeiro</servlet-name>
<url-pattern>/alou</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filtro</filter-name>
<filter-class>br.com.siriusnet.cursojava.FiltraRequisicao
</filter-class>
</filter>
<filter-mapping> // Filtro para um servlet especfico !!
<filter-name>filtro</filter-name>
<url-pattern>/alou</url-pattern> <!--OU !!!
<servlet-name>primeiro</servlet-name -->
</filter-mapping>
</web-app>

44

Filtros de Servlets
<web-app>
<filter>
<filter-name>filtro</filter-name>
<filter-class>
br.com.siriusnet.cursojava.FiltraRequisicao
</filter-class>
</filter>
<filter-mapping>
<filter-name>filtro</filter-name>
<url-pattern>/*</url-pattern> // Qualquer recurso!
</filter-mapping>
</web-app>

45

Filtros de Servlets
A chamada ao mtodo doFilter() dentro do
prprio mtodo encaminha a solicitao para
outros filtros na cadeia, ou para o recurso
solicitado
Quando desejamos tratar a resposta de uma
solicitao, esta chamada deve ser localizada
antes do tratamento desejado
Pode ser utilizado, por exemplo, para calcular o
tempo necessrio para o processamento de
uma requisio pelo servidor
46

Vous aimerez peut-être aussi