Servlets
Helder da Rocha
www.argonavis.com.br
Tambm sero exploradas as formas de interao do servlet com a requisio e resposta HTTP
Como ler parmetros da entrada Como gerar uma pgina de resposta Como extrair dados de um formulrio HTML
2
O que so servlets
Extenso de servidor escrita em Java
Servlets so "applets" (pequenas aplicaes) de servidor Podem ser usados para estender qualquer tipo de aplicao do modelo requisio-resposta Todo servlet implementa a interface javax.servlet.Servlet (tipicamente estende GenericServlet)
Servlets HTTP
Extenses para servidores Web Estendem javax.servlet.http.HttpServlet Lidam com caractersticas tpicas do HTTP como mtodos GET, POST, Cookies, etc.
3
API: Servlets
Principais classes e interfaces de javax.servlet Interfaces
Servlet, ServletConfig, ServletContext Filter, FilterChain, FilterConfig ServletRequest, ServletResponse SingleThreadModel RequestDispatcher
interface interface
ServletRequest
interface
ServletResponse
interface
Classes abstratas
GenericServlet
ServletConfig
Servlet
Classes concretas
GenericServlet ServletException UnavailableException ServletInputStream e ServletOutputStream
Ciclo de vida
O ciclo de vida de um servlet controlado pelo container Quando o servidor recebe uma requisio, ela repassada para o container que a delega a um servlet. O container
1. Carrega a classe na memria 2. Cria uma instncia da classe do servlet 3. Inicializa a instncia chamando o mtodo init()
Depois aue o servlet foi inicializado, cada requisio executada em um mtodo service()
O container cria um objeto de requisio (ServletRequest) e de resposta (ServletResponse) e depois chama service() passando os objetos como parmetros Quando a resposta enviada, os objetos so destrudos
Quando o container decidir remover o servlet da memria, ele o finaliza chamando destroy()
5
Ciclo de vida
Servlet Container
Load on startup? no Cria servlet Hora da morte?
Requisio HTTP
Servlet existe?
init(config) rs
destroy()
Resposta HTTP
rq service(rq, rs)
Gera resposta
(pgina HTML)
Destri objetos
rq rs
Libera memria
Mtodos de servio
So os mtodos que implementam operaes de resposta executadas quando o cliente envia uma requisio Todos os mtodos de servio recebem dois parmetros: um objeto ServletRequest e outro ServletResponse Tarefas usuais de um mtodo de servio
extrair informaes da requisio acessar recursos externos preencher a resposta (no caso de HTTP isto consiste de preencher os cabealhos de resposta, obter um stream de resposta e escrever os dados no stream)
7
definido em javax.servlet.Servlet. Sempre que um servidor repassar uma requisio a um servlet, ele chamar o mtodo service(request, response).
request response service()
Um servlet genrico dever sobrepor este mtodo e utilizar os objetos ServletRequest e ServletResponse recebidos para ler os dados da requisio e compor os dados da resposta, respectivamente 8
Interfaces
HttpServletRequest HttpServletResponse HttpSession
ServletRequest
ServletResponse
interface
interface
HttpServletRequest
HttpServletResponse
Classes abstratas
HttpServlet
Classes concretas
Cookie
GenericServlet
HttpServlet
10
Um servlet HTTP genrico dever estender HTTPServlet e implementar pelo menos um dos mtodos doGet() ou doPost()
* doDelete(), doTrace(), doPut(), doOptions() - Mtodo HEAD implementado em doGet()
11
Inicializao
A inicializao de um GenericServlet, como o HttpServlet, deve ser feita com o mtodo init() Todos os mtodos de config esto no servlet, pois GenericServlet implementa ServletConfig
public void init() throws ServletException { String dirImagens = getInitParameter("imagens"); if (dirImagens == null) { throw new UnavailableException ("Configurao incorreta!"); } }
12
A requisio HTTP
Uma requisio HTTP feita pelo browser tipicamente contm vrios cabealhos RFC822*
GET /docs/index.html HTTP/1.0 Connection: Keep-Alive Host: localhost:8080 User-Agent: Mozilla 6.0 [en] (Windows 95; I) Accept: image/gif, image/x-bitmap, image/jpg, image/png, */* Accept-Charset: iso-8859-1, * Cookies: jsessionid=G3472TS9382903
13
A resposta HTTP
Uma resposta HTTP enviada pelo servidor ao browser e contm informaes sobre os dados anexados
HTTP/1.0 200 OK Content-type: text/html Date: Mon, 7 Apr 2003 04:33:59 GMT-03 Server: Apache Tomcat/4.0.4 (HTTP/1.1 Connector) Connection: close Set-Cookie: jsessionid=G3472TS9382903 <HTML> <h1>Hello World!</h1> </HTML>
Use doPost() para receber dados de formulrios Se quiser usar ambos os mtodos, no sobrepoha service() mas implemente tanto doGet() como doPost()
public class ServletWeb extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) { processar(request, response); } public void doPost (HttpServletRequest request, HttpServletResponse response) { processar(request, response); } public void processar(HttpServletRequest request, HttpServletResponse response) { ... } }
17
Parmetros da requisio
Parmetros so pares nome=valor que so enviados pelo cliente concatenados em strings separados por &:
nome=Jo%E3o+Grand%E3o&id=agente007&acesso=3
Se o mtodo for POST, os parmetros so passados como um stream no corpo na mensagem (o cabealho Content-length, presente em requisies POST informa o tamanho
POST /servlet/Teste HTTP/1.0 Content-length: 21 Content-type: x-www-form-urlencoded id=agente007&acesso=3
18
Formulrios HTML codificam o texto ao enviar os dados automaticamente Seja o mtodo POST ou GET, os valores dos parmetros podem ser recuperados pelo mtodo getParameter() de ServletRequest, que recebe seu nome
String parametro = request.getParameter("nome");
Parmetros de mesmo nome podem ser repetidos. Neste caso getParameter() retornar apenas a primeira ocorrncia. Para obter todas use String[] getParameterValues()
String[] params = request.getParameterValues("nome");
19
Apenas um deve ser usado. Os objetos correspondem ao mesmo stream de dados Deve-se tambm definir o tipo de dados a ser gerado. Isto importante para que o cabealho Content-type seja gerado corretamente e o browser saiba exibir as informaes
response.setContentType("text/html");
Depois, pode-se gerar os dados, imprimindo-os no objeto de sada (out) obtido anteriormente
out.println("<h1>Hello</h1>");
20
21
Usando o Ant
Pode-se usar o Ant para fazer a compilao e deployment de uma aplicao Web
Defina um <classpath> adicional nas tarefas <javac> que inclua o caminho do servlet.jar Use <copy> para copiar os arquivos para os contextos corretos Use <property environment="env" /> e as propriedades env.TOMCAT_HOME ou env.CATALINA_HOME para ler as variveis de ambiente do sistema e tornar seu build file independente da localizao do servidor
O Ant tambm pode ser usado para gerar o JAR que encapsula uma aplicao Web (WAR) usando a tarefa <war>
22
Execuo
Use
http://localhost:8080/contexto/servlet/nome.do.Servlet
23
Exerccios
Para os exerccios abaixo, use um contexto cap06. 1. Crie um servlet (exercicio.ParameterList) que imprima, em uma tabela, todos os nomes de parmetros enviados e seus valores
O servlet deve suportar tanto GET como POST Use request.getParameterNames() e getParameterValues(String) Use o formulrio allForm.html fornecido para test-lo
2. Crie um servlet (exercicio.HeaderList) que imprima, em uma tabela, todos os nomes de cabealhos HTTP da requisio e seus valores
O servlet deve suportar tanto GET como POST Use request.getHeaderNames() e getHeaders(String)
24
Instncias de servlets
Uma instncia de um servlet pode ser configurada no web.xml atravs do elemento <servlet>
<servlet> <servlet-name>myServlet</servlet-name> <servlet-class>exemplo.pacote.MyServlet</servlet-class> <!-- elementos de configurao opcionais aqui --> </servlet>
Pode-se criar mltiplas instncias da mesma classe definindo blocos servlet com <servlet-name> diferentes
No tero muita utilidade a no ser que tenham tambm configurao diferente e mapeamentos diferentes 25
Para definir um mapeamento de servlet necessrio usar <servlet> e <servlet-mapping> <servlet-mapping> associa o nome do servlet a um padro de URL relativo ao contexto. A URL pode ser
Um caminho relativo ao contexto iniciando por / Uma extenso de arquivo, expresso da forma *.extensao
<servlet> <servlet-name>umServlet</servlet-name> <servlet-class>pacote.subp.MeuServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>umServlet</servlet-name> <url-pattern>/programa</url-pattern> </servlet-mapping>
26
Sintaxe de mapeamentos
Mapeamento exato
No aceita /nome/ ou /nome/x na requisio
<url-pattern>/nome</url-pattern> <url-pattern>/nome/subnome</url-pattern>
Mapeamento de caminho
Aceita texto adicional (path info) aps nome do servlet na requisio
<url-pattern>/nome/*</url-pattern> <url-pattern>/nome/subnome/*</url-pattern>
Mapeamento de extenso
Arquivos com a extenso sero redirecionados ao servlet
<url-pattern>*.ext</url-pattern>
27
URL de requisio
http://localhost:8080/banco/login/simples
Porta de servio Nome da mquina Caminho do contexto (context path) Caminho do servlet (servlet path)
Esquema de protocolo
Path info
28
ServletConfig
A interface ServletConfig serve para que um servlet possa ter acesso a informaes de configurao definidas no web.xml Todo servlet implementa ServletConfig e, portanto, tem acesso aos seus mtodos Principais mtodos de interesse
String getInitParameter(String nome): l um parmetro de inicializao <init-param> do web.xml Enumeration getInitParameterNames(): obtm os nomes de todos os parmetros de inicializao disponveis
30
31
ServletContext
A interface ServletContext encapsula informaes sobre o contexto ou aplicao Cada servlet possui um mtodo getServletContext() que devolve o contexto atual
A partir de uma referncia ao contexto atual pode-se interagir com o contexto e compartilhar informaes entre servlets
Inicializao de contexto
No web.xml, <context-param> vem antes de qualquer definio de servlet
<context-param> <param-name>tempdir</param-name> <param-value>/tmp</param-value> </context-param>
No servlet, preciso primeiro obter uma instncia de ServletContext antes de ler o parmetro
ServletContext ctx = getServletContext(); String tempDir = ctx.getInitParameter("tempdir"); if (tempDir == null) { throw new UnavailableException("Configurao errada"); }
33
Exemplo
ServletContext ctx = getServletContext(); String arquivo = "/WEB-INF/usuarios.xml"; InputStream stream = ctx.getResourceAsStream(arquivo); InputStreamReader reader = new InputStreamReader(stream); BufferedReader in = new BufferedReader(reader); String linha = ""; while ( (linha = in.readLine()) != null) { // Faz alguma coisa com linha de texto lida }
34
Contexto
Servlet 2
ServletContext ctx = getServletContext(); String[] dados = (String[])ctx.getAttribute("dados");
Outros mtodos
35
Escopo e threads
Geralmente, s h uma instncia de um servlet rodando para vrios clientes
Atributos de instncia so compartilhados!
Quaisquer outros atributos, como atributos de sesso, atributos de instncia e de contexto so compartilhados entre requisies
Caso deseje compartilh-los, use synchronized nos blocos de cdigo onde seus valores so alterados.
36
Repasse de requisio
Objetos RequestDispatcher servem para repassar requisies para outra pgina ou servlet. Seus dois principais mtodos so
include(request, response) forward(request, response)
Redirecionamento x Repasse
Pode-se enviar um cabealho de redirecionamento para o browser usando
response.sendRedirect("url");
Location um cabealho HTTP que instrui o browser para redirecionar para outro lugar Sempre que o controle volta ao browser, a primeira requisio terminou e outra foi iniciada
Os objetos HttpServletResponse e HttpServletRequest e todos seus atributos e parmetros foram destrudos
Com repasse de requisies, usando RequestDispatcher, o controle no volta ao browser mas continua em outro servlet (com forward())ou no mesmo servlet (com include())
38
Sesses
Como o HTTP no mantm estado de sesso, so as aplicaes Web que precisam cuidar de mant-lo quando necessrio Sesses representam um cliente
A sesso nica para cada cliente e persiste atravs de vrias requisies
request
Cliente
session
39
Sesses
Sesses so representados por objetos HttpSession e so obtidas a partir de uma requisio Dois mtodos podem ser usados
HttpSession session = request.getSession(false);
40
Requisio 2
HttpSession session = request.getSession(); String[] dados = (String[])session.getAttribute("dados");
Como a sesso pode persistir alm do tempo de uma requisio, possvel que a persistncia de alguns objetos no sejam desejveis
Soluo: sempre que uma pgina contiver uma URL para outra pgina da aplicao, a URL deve estar dentro do mtodo encodeURL() de HttpServletResponse
out.print("<a href='" + response.encodeURL("caixa.jsp") + "'>");
Se cliente suportar cookies, URL passa inalterada (o identificador da sesso ser guardado em um cookie) Se cliente no suportar cookies, o identificador ser passado como parmetro da requisio
ex: http://localhost:8080/servlet/Teste;jsessionid=A424JX08S99 42
Servlets oferecem trs nveis diferentes de persistncia na memria (ordem decrescente de durao)
Contexto da aplicao: vale enquanto aplicao estiver na memria (javax.servlet.ServletContext) Sesso: dura uma sesso do cliente (javax.servlet.http.HttpSession) Requisio: dura uma requisio (javax.servlet.ServletRequest)
43
Thread-safe
init() chamado
Servlet carregado
Contexto
Requisio Requisio
Sesso do Cliente
Varivel de instncia
Varivel esttica
Sesso
destroy() chamado Servidor reiniciado
Contexto
44
Para situaes onde multithreading inaceitvel, servlet deve implementar a interface SingleThreadModel (s um thread estar presente no mtodo service() ao mesmo tempo)
Evite isto a todo custo: muito ineficiente! 45
Pode-se obter as conexes de um pool de conexes atravs de javax.sql.DataSource via JNDI (use esta soluo em servidores J2EE!)
DataSource ds = (DataSource)ctx.lookup("jbdc/Banco"); Connection con = ds.getConnection();
46
Environment Entries
Alternativa global (para o WAR) aos <init-param>
So acessveis dentro de qualquer servlet ou JSP da aplicao WAR No so visveis por outras aplicaes do servidor (no um nome JNDI global - est abaixo de java:comp/env - local aplicao) Acessveis via ferramentas de deployment (podem ser redefinidas)
48
Componentes EJB
Servlets e JSPs podem se comunicar com EJBs da aplicao declarando uma referncia associada ao bean chamado
A referncia deve informar o tipo do bean (Session, Entity ou MessageDriven e suas interfaces remota e home.
<ejb-ref> <description>Cruise ship cabin</description> <ejb-ref-name>ejb/CabinHome</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>com.titan.cabin.CabinHome</home> <remote>com.titan.cabin.Cabin</remote> </ejb-ref>
Componentes EJB so retornados como objetos CORBA que precisam ser reduzidos atravs da funo narrow.
InitialContext initCtx = new InitialContext(); Object ref = initCtx.lookup("java:comp/env/ejb/CabinHome"); CabinHome home = (CabinHome) PortableRemoteObject.narrow(ref, CabinHome.class);
49
Banco de dados
Fbricas de objetos so acessveis via <resource-ref>. A mais comum a fbrica de conexes de banco de dados
<resource-ref> <description>Cloudscape database</description> <res-ref-name>jdbc/BankDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>SERVLET</res-auth> </resource-ref>
50
Concluses
Neste mdulo abordamos os assuntos mais importantes sobre servlets, contextos e sesses
Para mais detalhes sobre esses assuntos consulte as referncias no CD ou os slides do curso J550
O prximo mdulo abordar JSP, cuja API bsica a mesma usada nos servlets
Familiarizar-se com a construo e uso da API de servlets ajuda na implementao de pginas JSP mais eficientes Mesmo com aplicaes consistindo basicamente de pginas JSP, servlets tm papel importante na separao de responsabilidades (arquiteturas MVC, FrontController, etc.)
51
Exerccios
3. Crie aliases para os servlets criados nos exerccios anteriores 1 e 2:
/parameters para exercicio.ParameterList /headers para exercicio.HeaderList
4. Parmetros de inicializao
a) Guarde, como parmetros de inicializao de ParameterList, duas cores: corDeFundo e corDoTexto que receba nomes de cor b) Gere a pgina usando os parmetros para colori-la c) Use um parmetro de contexto para gravar a fonte usada em todos os servlets do contexto.
5. Uso de Session
a) Crie um arquivo index.html contendo um link para /headers e um formulrio, que receba um 'nome' e envie-o para /parameters usando POST b) Em /parameters, grave o 'nome' na sesso c) Em /headers, leia o nome da sesso e imprima-o
52
53
Fontes
[1] Jason
Hunter, William Crawford. Java Servlet Programming, 2nd edition, O'Reilly and Associates, 2001 [2] J2EE Tutorial [3] Marty Hall, Core Servlets and JSP, Prentice-Hall, 2000 [4] Jim Farley et. al. Java Enterprise in a NutShell, 2nd. edition, O'Reilly and Associates, April 2002
54
helder@argonavis.com.br
argonavis.com.br
J500 - Aplicaes Distribudas com J2EE e JBoss Reviso 1.4 (maro de 2003) 1999-2003, Helder da Rocha
55
Molto più che documenti.
Scopri tutto ciò che Scribd ha da offrire, inclusi libri e audiolibri dei maggiori editori.
Annulla in qualsiasi momento.