Buscar

POO2 Java WEB

Prévia do material em texto

Grupo Multitecnus©, 2013
www.multitecnus.com
WEB
2
Grupo Multitecnus© , 2013
1. Introdução
Java é uma Linguagem de Programação orientada a objetos (LPOO),
projetada para ser portável entre diferentes plataformas de hardware e software,
ou seja, um programa criado no ambiente Windows pode ser executado no
ambiente Linux ou UNIX.
Como qualquer linguagem de programação, JAVA lhe permitirá escrever 
programas que rodarão com capacidade semelhante à de qualquer programa para 
desktop1. Java também permite construir páginas Web, e que podem ser acessadas 
por um navegador, tal como: Chrome, Firefox, IE , Opera, etc.
1 Um material de introdução à linguagem Java encontra-se em: http://www.multitecnus.com/java .
3
Grupo Multitecnus© , 2013
1.1. Criando um Projeto WEB no Eclipse
Execute o Eclipse. Verifique se a perspectiva Java EE está ativa:
4
Grupo Multitecnus© , 2013
Clique em File -> New -> Dynamic Web Project: 
5
Grupo Multitecnus© , 2013
Surge a janela New Dynamic Web Project. 
No campo Project Name digite o nome do projeto, por exemplo, dwp.html: 
Em seguida, clique em Next.
Obs.: Definiu-se o nome do projeto como dwp.html, mas poderia ser qualquer
nome de sua escolha, como, por exemplo, prj_web.
6
Grupo Multitecnus© , 2013
Na janela seguinte (de configuração), clique em Next: 
7
Grupo Multitecnus© , 2013
Surge a janela Web Module.
Marque a opção Generate web.xml deployment descriptor; após, clique em Finish:
8
Grupo Multitecnus© , 2013
Pronto. A estrutura básica para criar seu projeto web foi criada. A pasta WebContent
representa o root da aplicação. 
9
Grupo Multitecnus© , 2013
Da estrutura criada para executar a aplicação web, explica-se os diretórios:
a) WebContent: diretório a partir do qual o usuário acessará os recursos publicados 
(deploy);
b) META-INF: contém um arquivo de informações necessárias para a execução do 
projeto. 
c) WEB-INF: é um diretório acessível apenas pelo web container (conteiner web, ou 
servidor web). 
O próximo passo é criar um arquivo HTML para testar o projeto criado por você.
10
Grupo Multitecnus© , 2013
Clique sobre WebContent (botão direito do mouse), e, depois, em New -> HTML File: 
11
Grupo Multitecnus© , 2013
Surge a janela New HTML File. Neste primeiro exemplo, vamos deixar o nome do 
arquivo inalterado (NewFile.html). Clique em Next:
12
Grupo Multitecnus© , 2013
Na janela Select HTML Template, clique no template desejado aqui optou-se pelo 
HTML5, mas poderia ter sido qualquer outro), em seguida, clique em Finish:
13
Grupo Multitecnus© , 2013
Observe o arquivo NewFile.html (na pasta WebContent) e seu conteúdo:
14
Grupo Multitecnus© , 2013
Altere o código-fonte de NewFile.html, inserindo a informação abaixo (no body):
<h1> Multitecnus – teste </h1>
O código-fonte fica, então:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1> Multitecnus – teste </h1>
</body>
</html>
Salve as modificações.
15
Grupo Multitecnus© , 2013
1.2. Empacotando e Publicando a Aplicação WEB
Uma vez que a página é criada, deve-se publicá-la (deploy), o que
significa que o projeto deve estar contido na pasta webapps do servidor web.
Neste trabalho, o projeto criado anteriormente será testado com o Apache
Tomcat2.
O primeiro passo é iniciar o servidor Apache Tomcat (vá ao Monitor
Tomcat e clique em Start service), caso não esteja em funcionamento.
O segundo passo é criar um móduloWAR (Web Archive), contendo todos
os recursos necessários (html, jsp, servlets, etc.) à publicação (padrão JEE).
2 Neste momento, o Apache já deve estar instalado no sistema. Caso não esteja, vá ao endereço
http://www.multitecnus.com/java e faça o download do arquivo apache_tomcat.pdf. Siga as instruções
para instalar este servidor WEB.
16
Grupo Multitecnus© , 2013
Para gerar o arquivo WAR e publicá-lo, basta clicar com o botão direito do mouse 
sobre o nome do projeto (no Project Explorer) e, depois, em Export -> WAR file:
17
Grupo Multitecnus© , 2013
Na janela War Export, clique no botão Browse... :
18
Grupo Multitecnus© , 2013
Na janela Salvar como, vá até o o diretório de instalação do Apache Tomcat, e
selecione a pasta webapps:
Em seguida, digitemultitecnus no campo Nome. Ao final, clique em Salvar.
19
Grupo Multitecnus© , 2013
Finalize o deploy clicando em Finish:
20
Grupo Multitecnus© , 2013
Observe o arquivoWAR (multitecnus.war) gerado e salvo no diretório webapps.
Observe, também, que uma pasta com o mesmo nome do arquivoWAR foi criada.
21
Grupo Multitecnus© , 2013
Esse diretório contém a estrutura básica para o funcionamento da aplicação WEB
criada por você, além do arquivo NewFile.html criado por você com o auxílio do
Eclipse:
22
Grupo Multitecnus© , 2013
Em um navegador web, acesse: http://localhost:9080/multitecnus/NewFile.html. 
Veja que o conteúdo entre <h1> e </h1> é exibido na janela do navegador.
Obs.: A porta utilizada (9080) pode variar, dependendo de como o Apache Tomcat 
foi configurado.
23
Grupo Multitecnus© , 2013
2. Servlet
Servlets são classes Java que executam e processam requisições dentro
de um conteiner web. Podem ser requisições genéricas (GenericServlet) ou
requisições HTTP (HttpServlet).
GenericServlets podem devolver qualquer tipo de dados. Já HttpServlets,
podem devolver uma página HTML, documentos do MS-Word, MS-Excel, Acrobat-
PDF, imagens (gif, jpg, etc.), ou qualquer outro conteúdo MIME3 válido.
3 MIME: Multipurpose Internet Mail Extensions. Em http://www.w3.org/wiki/WebIntents/MIME_Types
pode-se obter mais informação a respeito.
24
Grupo Multitecnus© , 2013
2.1. Criando um HttpServlet com Eclipse
Para criar um HttpServlet, deve-se:
a) Inserir uma anotação@WebServlet;
b) Criar uma classe que estenda javax.servlet.http.HttpServlet;
c) Definir os métodos doGet e doPost a serem utilizados pelo HttpServlet;
d) Importar a biblioteca servlet-api.jar para o Build Path do projeto.
Para finalizar, deve-se criar um formulário HTML para testar o HttpServlet
criado.
25
Grupo Multitecnus© , 2013
Para exemplificar, crie um HttpServlet no Eclipse:
a) Crie um projeto web dinâmico (New -> Dynamic Web Project):
26
Grupo Multitecnus© , 2013
Nomeie o projeto como: dwp.servlet e, depois, clique em Finish:
27
Grupo Multitecnus© , 2013
b) Crie um pacote (New -> Package):
28
Grupo Multitecnus© , 2013
Nomeie o pacote como: com.multitecnus.servlet. Clique em Finish.
29
Grupo Multitecnus© , 2013
O pacote criado (com.multitecnus.servlet) pode ser visto em Project Explorer:
30
Grupo Multitecnus© , 2013
c) Clique com o botão direito do mouse sobre o pacote, e, depois, em New -> Servlet:
31
Grupo Multitecnus© , 2013
Dê o nome ServletExemplo ao HttpServlet sendo criado. Clique em Next:
32
Grupo Multitecnus© , 2013
Na janela de informações, complete o campo Description, se desejado:
O campo URL Mappings define o URL de execução do Servlet. Clique em Next.
33
Grupo Multitecnus© , 2013
Na janela seguinte, marque os métodos desejados e clique em Finish.
d) Surge o código do HttpServlet criado. Nele, podem ser vistos vários
apontamentos de erro. Configure o Build Path4 para corrigi-los.
4 Em: http://www.multitecnus.com/java, no material Introdução à Linguagem Java, encontra-se
explicação a respeito do recurso Configure Build Path do Eclipse.
34
Grupo Multitecnus© , 2013
35
Grupo Multitecnus© , 2013
Clique com o botão direito do mouse sobre o pacote. Em seguida, clique em
Build Path -> Configure Build Path...:
36
Grupo Multitecnus© , 2013
Na janela Java Build Path, clique na aba Libraries, e, depois, em Add External JARs...:
37
Grupo Multitecnus© , 2013
Na janela JAR Selection, vá até o diretório lib de instalação do Tomcat, e selecione
o arquivo servlet-api.jar. Clique em Abrir:
38
Grupo Multitecnus© , 2013
Pronto! A biblioteca foi adicionada ao projeto. Clique em OK.
39
Grupo Multitecnus© , 2013
Observe que não há mais erros no projeto.
40
Grupo Multitecnus© , 2013
Agora, só falta testar o HttpServlet criado.
Para tal, crie um arquivo HTML no Eclipse. Clique com o botão direito do mouse
sobre o pacote com.multitecnus.servlet e, depois, em New -> HTML File:
41
Grupo Multitecnus© , 2013
Nomeie-o como testaServlet.html. Clique em Next:
42
Grupo Multitecnus© , 2013
Selecione o template html 5. Clique em Finish.
43
Grupo Multitecnus© , 2013
Ao surgir o código html, insira o trecho destacado em negrito:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="ServletExemplo" method="get">
Parâmetro 1 <input type="text" name="p1" /><br />
Parâmetro 2 <input type="text" name="p2" /><br />
<input type="submit" value="Enviar" />
</form>
</body>
</html>
44
Grupo Multitecnus© , 2013
Altere, altere o método doGet do HttpServlet criado, inserindo o código abaixo:
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<meta charset='ISO-8859-1'>");
out.println("<title>Tela de saída</title>");
out.println("</head>");
out.println("<body>");
String p1 = request.getParameter("p1");
out.println("<p>Parâmetro 1: " + p1 + "</p>");
String p2 = request.getParameter("p2");
out.println("<p>Parâmetro 2: " + p2 + "</p>");
out.println("</body>");
out.println("</html>");
45
Grupo Multitecnus© , 2013
O método doGet, então , fica como:
46
Grupo Multitecnus© , 2013
Para finalizar, teste o HttpServlet. Clique na aba testaServlet.html e, depois, em
Run:
47
Grupo Multitecnus© , 2013
Se surgir a janela Run On Server, selecione o servidor instalado na máquina local.
No exemplo dado, será selecionado o servidor Tomcat 7.0 Server. Clique em Next:
48
Grupo Multitecnus© , 2013
Certifique-se que o projeto (dwp.servlet) esteja configurado no servidor. Clique em
Finish.
49
Grupo Multitecnus© , 2013
O navegador interno do Eclipse surge, com o arquivo HTML criado anteriormente
carregado:
50
Grupo Multitecnus© , 2013
Preencha os campos de texto com as strings Grupo e Multitecnus, e clique no
botão Enviar:
51
Grupo Multitecnus© , 2013
O Servlet criado por você cria uma página HTML dinâmica e a envia ao navegador:
52
Grupo Multitecnus© , 2013
2.2. Publicando o HttpServlet
Clique com o botão direito do mouse sobre o projeto (dwp.servlet) e,
depois, em Export -> WAR file:
53
Grupo Multitecnus© , 2013
Clique em Browse... para selecionar a pasta de destino do arquivoWAR:
54
Grupo Multitecnus© , 2013
Selecione a pasta webapps de instalação do Apache-Tomcat. Clique em Salvar:
55
Grupo Multitecnus© , 2013
Clique em Finish para exportar o arquivoWAR: dwp.servlet.war.
56
Grupo Multitecnus© , 2013
O arquivo dwp.servlet.war já se encontra no diretório webapps.
57
Grupo Multitecnus© , 2013
Porém, para que a publicação seja completada, é preciso que o serviço do Apache-
Tomcat seja iniciado. Mas, antes, é necessário "parar" o servidor utilizado pelo
Eclipse quando da execução do HTML. No Eclipse, clique na aba Servers (na parte
inferior da IDE):
Em seguida, clique no botão Stop the server (em vermelho).
58
Grupo Multitecnus© , 2013
O servidor é, então, parado.
Agora, por meio doMonitor Tomcat, inicie o Apache-Tomcat instalado no sistema :
59
Grupo Multitecnus© , 2013
Ao iniciar o serviço Apache-Tomcat, observe que um diretório com o mesmo nome
do arquivoWAR é criado no diretório webapps:
Este diretório, dwp.servlet, já é resultante do deploy da aplicação web.
60
Grupo Multitecnus© , 2013
No diretório dwp.servlet encontra-se o arquivo testaServlet.html.
61
Grupo Multitecnus© , 2013
Uma vez publicado o projeto, carregue a página HTML em um navegador web:
http://localhost:9080/dwp.servlet/testaServlet.html.
Observação: Neste exemplo foi alterado o método doGet porque o método
utilizado pelo formulário para envio dos dados ao HttpServlet foi o método GET.
Caso o método de envio das informações do formulário seja por meio do método
POST, deve-se utilizar o método doPost.
62
Grupo Multitecnus© , 2013
2.3. Deployment Descriptor
A anotação@WebServlet criada pelo Eclipse:
@WebServlet(description = "Exemplo de criação de um HttpServlet com Eclipse",
urlPatterns = { "/ServletExemplo" })
atende à especificação Servlet 3.0, tornando opcional a alteração do arquivoWEB-
INF /web.xml.
O arquivo web.xml é denominado deployment descriptor (descritor de
publicação), e contém informações de configuração para a publicação de um
aplicativo web.
63
Grupo Multitecnus© , 2013
Um duplo clique sobre o arquivo web.xml (na pasta na pasta Web-INF) permite
acessar seu conteúdo:
64
Grupo Multitecnus© , 2013
No desenvolvimento de projetos web dinâmicos em versões anteriores à 3.0, cria-
se facilmente este arquivo com o Eclipse. Por exemplo, inicie um novo projeto
(Dynamic Web Project) e selecione a versão 2.5:
65
Grupo Multitecnus© , 2013
Após clicar 2 vezes em Next, selecione: Generate web.xml deployment descriptor:
Isto faz com que o arquivo web.xml seja gerado com várias informações iniciais, ao
contrário do arquivo gerado na versão 3.0, que só contém uma referência à versão
(Version) e a inserção da anotação (@WebServlet ) dentro do Servlet.
66
Grupo Multitecnus© , 2013
Ao clicar em Finish o Eclipse inicia um projeto dinâmico e, não só cria o
deployment descriptor, mas também o inicia com alguns valores. Dê um duplo
clique sobre o arquivo web.xml (na pasta na pasta Web-INF) para acessar seu
conteúdo:
67
Grupo Multitecnus© , 2013
Para verificar como o Eclipse altera, automaticamente, o arquivo web.xml, execute
as seguintes tarefas:
a) Crie o pacote: com.multitecnus.servlet ;
b) Crie um Servlet. Nomeie a classe como: TestaServlet ;
c) Complete o campo Description com: Testa Servlet ;
d) Clique no botão Add... do campo URL mappings: e complete o campo Pattern
com: /TS ;
e) Clique em Finish .
68
Grupo Multitecnus© , 2013
Agora, examine o arquivo web.xml, e verifique as informações sobre o Servlet
criado. Dê um clique na aba Source para ter acesso ao arquivo web.xml:
69
Grupo Multitecnus© , 2013
Na listagem abaixo, observe as informações sobre o Servlet criado (em negrito):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>dwp.servlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description>Testa Servlet</description>
<display-name>TestaServlet</display-name>
<servlet-name>TestaServlet</servlet-name>
<servlet-class>com.multitecnus.servlet.TestaServlet</servlet-class></servlet>
<servlet-mapping>
<servlet-name>TestaServlet</servlet-name>
<url-pattern>/TestaServlet</url-pattern>
<url-pattern>/TS</url-pattern>
</servlet-mapping>
</web-app>
70
Grupo Multitecnus© , 2013
2.3.1. Elementos de web.xml
O elemento web-app é o raiz do documento web.xml. Listam-se, abaixo,
alguns elementos válidos para esse arquivo5:
a) Context-param : declara parâmetros de iniciação.
b) Description : texto descritivo sobre a aplicação.
c) Display-name : nome curto da aplicação a ser visualizado por ferramentas GUI.
d) Error-page : página a ser exibida quando da ocorrência de um dado erro.
e) Servlet : contém dados de declaração de um servlet.
f) Servlet-mapping : define um mapeamento entre uma URL e um servlet.
g) welcome-file: lista ordenada de arquivos a serem carregados se o arquivo
desejado não estiver disponível para carregamento (index.html, por exemplo).
5Mais detalhes em: http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1017571
71
Grupo Multitecnus© , 2013
2.4. Sessão
Quando uma página "chama" uma outra, nenhum estado é armazenado
entre essas chamadas. Diz-se, então, que o HTTP é um protocolo "stateless“, pois o
servidor HTTP não armazena qualquer informação sobre o que se passa nos
navegadores.
Porém, às vezes é necessário armazenar valores entre chamadas. Por
exemplo, em sites de comércio eletrônico, identifica-se o cliente permitindo-lhe
utilizar seu carrinho de compras, independente da navegação entre páginas do site.
Quando ocorre uma requisição HTTP, é criado, pelo servidor, uma
conexão temporária (única) entre ambos (servidor e requisitante), a qual se
conhece por sessão (session). Uma vez criada, pode-se armazenar informações
entre navegações por meio de sessões. (interface HttpSession).
72
Grupo Multitecnus© , 2013
Para exemplificar, será criado um projeto contendo 3 arquivos: 1 HTML para
invocar o servlet criaSession, o qual criará uma variável de sessão para armazenar a
informação http://www.multitecnus.com e retornará ao navegador com uma
página contendo um link para o servlet ResgataSession, o qual exibirá o conteúdo
da informação armazenada na sessão, além do seu ID e último acesso.
Para tal, execute os passos abaixo:
a) Crie o projeto (Dynamic Web Project): dwp.ExemploSession ;
b) Crie o arquivo HTML: criaSession.html ;
c) Crie o pacote: testaSession ;
d) No pacote testaSession:
d.1) Crie o servlet: CriaSession.java ;
d.2) Crie o servlet: ResgataSession.java ;
e) O projeto será configurado no servidor Apache Tomcat 7.0 .
73
Grupo Multitecnus© , 2013
O Project Explorer resultante deverá ser como mostrado abaixo:
74
Grupo Multitecnus© , 2013
f) Substitua o código-fonte de criaSession.html pelo código abaixo:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="./CriaSession">Chama a servlet "Cria Session"</a>
</body>
</html>
75
Grupo Multitecnus© , 2013
g) Insira no método doGet de CriaSession.java, as linhas de código abaixo:
HttpSession sessao = request.getSession(true);
sessao.setAttribute("site", "http://www.multitecnus.com");
PrintWriter out = response.getWriter();
response.setContentType("text/html");
String pagina = 
"<html>" + 
"<head>" + 
"<title>Servlet chamado de cria Session.html</title>" +
"</head>" + 
"<body>" + 
"<a href=\"./ResgataSession\">Chama a servlet \"Resgata Session\"</a>" + 
"</body>" + 
"</html>";
out.println(pagina);
76
Grupo Multitecnus© , 2013
h) Insira no método doGet de ResgataSession.java, as linhas de código abaixo :
PrintWriter out = response.getWriter();
out.println("Chamada de CriaSession<br />");
HttpSession sessao = request.getSession(true);
response.setContentType("text/html");
out.println("Valor resgatado: " + sessao.getAttribute("site") + "<br />");
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy - HH:mm");
out.println("Id da session: " + sessao.getId() + "<br />");
out.println("Acesso : " + sdf.format(new Date(sessao.getLastAccessedTime())));
Obs.: O parâmetro true em request.getSession(true) cria uma sessão caso ela não
exista. Um parâmetro igual a false retorna uma sessão caso ela exista, e nulo,
caso contrário.
77
Grupo Multitecnus© , 2013
i) Execute o projeto (a partir de criaSession.html). A tela produzida por
ResgataSession deverá exibir algo como:
Obs.: As informações "Id da session" e "Acesso" poderão variar de acordo com o
obtido do seu ambiente de desenvolvimento.
78
Grupo Multitecnus© , 2013
2.4.1. Definindo Tempo Máximo para uma Sessão
Uma sessão expira, por padrão, em 1800 segundos (30 minutos). E, ao
expirar, o conteiner invalida a sessão.
Por exemplo, se a linha de comando
sessao.setMaxInactiveInterval(10);
for inserida após a linha de comando de criação da sessão:
HttpSession sessao = request.getSession(true);
sessao.setMaxInactiveInterval(1);
response.setContentType("text/html");
Após 10 segundos a sessão será invalidada, e a informação armazenada, perdida.
Atualizar a página faz com que a informação "Valor resgatado" exiba "null".
79
Grupo Multitecnus© , 2013
2.5. Cookie
Há uma outra forma de persistir informação entre navegações: pode-se
utilizar cookies para esse armazenamento.
Cookies são pequenos arquivos de texto armazenados na máquina do
cliente, e que são enviados pelo endereço remoto com a finalidade de persistir
informações, tais como a identificação e as preferências do usuário. Assim, em uma
visita posterior ao site que enviou o cookie, o usuário será automaticamente
identificado, e suas preferências utilizadas para personalizar seu acesso.
Deve-se ressaltar que o cookie tem prazo para expirar, e esse prazo é
definido pelo programador.
Outro ponto: o usuário pode bloquear o acesso do navegador a cookies,
dificultando, algumas vezes, impedindo, a navegação pelas páginas do site.
80
Grupo Multitecnus© , 2013
2.5.1. Criar um cookie:
a) Crie um servlet.
b) Crie o cookie em um método da classe (passe duas Strings ao construtor):
Cookie cookie = new Cookie("id", "1");
c) Em seguida, defina por quanto tempo (em segundos) o cookie será válido:
cookie.setMaxAge(60);
No exemplo acima, após 1 minuto (60s) o cookie torna-se inválido. Um valor 
igual a 0 (zero) exclui o cookie.
d) Adicione o cookie ao objeto HttpServletResponse:
response.addCookie(cookie);
Obs.: Repita o processo anterior para cada cookie adicional. Por exemplo:
Cookie novoCookie = new Cookie("nome", "multitecnus");
novoCookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(novoCookie);
81
Grupo Multitecnus© , 2013
2.5.2. Resgatar um cookie:
a) Crie um servlet.
b) Em um dos métodos da classe, resgate todos os cookies em um array:
Cookie [] cookies = request.getCookies();
a) Liste os valores se o array não for nulo (caso haja cookie válido armazenado):
PrintWriter out = response.getWriter();
if (cookies == null)
out.println ("Não há cookies válidos!");
else
for(int i=0; i<cookies.length;i++)
{
Cookie cookie = cookies[i];
out.println("Valor["+ i +"]= " + cookie.getValue() + "<br />");
}
82
Grupo Multitecnus© , 2013
2.5.3. Resgatar um cookie específico:
Para listar o valor de um cookie específico, deve-se identificar o nome dado ao
mesmo (por meio do método getName):
if (cookies == null)
out.println ("Não há cookies válidos!");
else
for(int i=0; i<cookies.length;i++)
{
if(cookies[i].getName().equals("id"))
{
out.println("Parâmetro: " + cookies[i].getName() + "<br />" ); 
out.println("Valor: " + Integer.parseInt(cookies[i].getValue()));
}
}
83
Grupo Multitecnus© , 2013
2.6. DataSourceUm DataSource é um objeto (server-side) que referencia um repositório
de conexões (Connection Pool) a bancos de dados. Seu registro define os
parâmetros associados à conexão: o driver JDBC, a base de dados (database), o
login, etc. Após uma conexão ser utilizada, a mesma retorna ao Connection Pool
para uso por outra requisição, o que evita novas operações de login ao banco, que
causam diminuição do desempenho da aplicação Java Web em acessos a dados.
Por meio do DataSource pode-se criar conexão JDBC e executar cláusulas
SQL. Um exemplo será criado para manipular um banco de dados no MySQL6.
6 Neste momento, o MySQL já deve estar instalado no sistema. Caso não esteja, vá ao endereço
http://www.multitecnus.com/java e faça o download do arquivo mysql.pdf. Siga as instruções para
instalar este SGBD.
84
Grupo Multitecnus© , 2013
2.6.1. JNDI - Java Naming and Directory Interface 
Em computação, um serviço de nomes associa um nome a um recurso
computacional, quer seja o nome de um local na internet (por exemplo,
http://www.multitecnus.com é associado ao endereço IP desse local. Assim, para
acessar o site é preciso conhecer seu nome (ao invés do endereço IP), quer seja o
nome de um diretório (que é associado a um bloco de memória). Essa associação é
chamada Binding, e um conjunto de associações é chamado Contexto. Além de
associar nomes a recursos, um serviço de nomes deve localizar um recurso (por
exemplo, servlets, EJBs, bancos de dados, etc.) a partir de seu nome, que segue
uma convenção. Por exemplo, o nome de um local na internet termina com o
domínio (.com ou .br). O nome continua da direita para a esquerda, separando os
demais elementos do nome pelo caractere "." (ponto):
multitecnus.com
85
Grupo Multitecnus© , 2013
JNDI é uma API Java que permite o acesso a recursos por meio de nomes.
Ela define um contexto (Context), por meio do qual é possível a procura do recurso
(objeto) desejado, sendo que essa procura é iniciada por um contexto inicial
(InitialContext).
Para que se possa utilizar um DataSource, deve-se procurar (lookup) o
objeto DataSource para o contexto JNDI (Java Naming and Directory Interface).
86
Grupo Multitecnus© , 2013
2.6.2. Exemplo
a. Iniciar o Apache Tomcat
b. Crie o projeto Web dinâmico (File -> New ->Dynamic Web Project): dwp.ds
c. Crie o arquivo context.xml no diretório META-INF com o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8" ?>
<Context >
<Resource
name="testaDS"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="10"
87
Grupo Multitecnus© , 2013
maxWait="100"
url="jdbc:mysql://localhost/multitecnus"
username="root"
password="mysql"
description="Teste de DataSource"
closeMethod="close"
/>
</Context>
Obs.: O parâmetro "closeMethod" corrige o problema das versões anteriores de
não fechamento do DataSource (do Pool de conexão). Indica, para o Apache
Tomcat, que ele deve fechar todas os recursos JNDI (conexões do
DataSource) no undeploy do arquivo WAR.
88
Grupo Multitecnus© , 2013
d. Crie um servlet para testar o datasource:
- Anotação: @WebServlet("/JavaDS")
- Obter o contexto inicial:
Context initialContext = new InitialContext();
- Obter do contexto e procura do objeto DataSource para o contexto JNDI:
Context envContext = (Context)initialContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("testaDS");
e. Faça o deploy da aplicação
f. Inicie o MySQL
- Crie o BD: multitecnus
- Crie a tabela: produto
g. Carregue o servlet no navegador: http://localhost:9080/dwp.ds/JavaDS 
89
Grupo Multitecnus© , 2013
Obs.1: SQL de construção da tabela produto no MySQL:
CREATE TABLE `produto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(20) DEFAULT NULL,
`preco` double(15,3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 PACK_KEYS=0;
Obs.2: Em http://www.multitecnus.com/java podem ser obtidos os códigos-fonte
do servlet (datasource_src.doc) e do arquivo XML (datasource_context.doc).
90
Grupo Multitecnus© , 2013
2.7. Listener
Um Listener é utilizado no tratamento de eventos, e permite que objetos
interessados sejam avisados de uma mudança de estado, ou da ocorrência de um
evento, em outro objeto.
Os principais tipos de evento são:
- Eventos de janela (WindowEvents): ocorre quando o estado de uma janela é
modificado, ou seja, quando ela é: aberta, fechada, minimizada ou maximizada.
- Eventos de ações (ActionEvents): ocorre quando o estado de um componente é
modificado (seleção de um elemento ou clique do mouse em um elemento, por
exemplo, um JButton).
- Eventos de mouse (MouseEvents): ocorre quando o mouse é manipulado (clique 
no botão ou deslocamento)
- Eventos de teclado (KeyEvents): ocorre quando uma tecla é pressionada.
91
Grupo Multitecnus© , 2013
A especificação servlet possui a capacidade de manipular eventos por
meio de listeners, possibilitando um controle maior da aplicação Web. Para que se
possa fazer esse monitoramento, deve-se implementar umas das interfaces abaixo:
- javax.servlet.ServletContextListener: é um listener que monitora o início
(contextInitialized) e a finalização (contextDestroyed ) de uma aplicação.
- javax.servlet.ServletContextAttributeListener: é um listener que monitora a
adição (attributeAdded), a remoção (attributeRemoved) ou a alteração
(attributeReplaced) de um atributo no contexto.
- javax.servlet.http.HttpSessionListener: é um listener que monitora a criação
(sessionCreated) e a destruição (sessionDestroyed) da sessão.
92
Grupo Multitecnus© , 2013
- javax.servlet.http.HttpSessionAttributeListener: é um listener que monitora a
adição (attributeAdded), a remoção (attributeRemoved) ou a alteração
(attributeReplaced) de um atributo da sessão de usuário.
- javax.servlet.http.HttpSessionActivationListener: é um listener que monitora ó
ativamento (sessionDidActivate) ou passivada (sessionWillPassivate).
- javax.servlet.http.HttpSessionBindingListener: é um listener que monitora
quando o objeto que implementa esta interface é vinculado ou desvinculado de
uma sessão, ou para um HttpSessionAttributeListener que foi configurado no
descritor de implementação quando qualquer atributo for vinculado,
desvinculado ou substituído em uma sessão. A sessão vincula o objeto por meio
de uma chamada a HttpSession.setAttribute e libera o objeto por meio de uma
chamada para HttpSession.removeAttribute.
93
Grupo Multitecnus© , 2013
- javax.servlet.ServletRequestListener: é um listener que monitora a chegada de
uma requisição.
- javax.servlet.ServletRequestAttributeListener: é um listener que monitora a
adição (attributeAdded), a remoção (attributeRemoved) ou a alteração
(attributeReplaced) de um atributo de uma requisição.
De todas elas, as interfaces ServletContextListener e HttpSessionListener
são as mais utilizadas.
94
Grupo Multitecnus© , 2013
2.7.1. Criando um Listener com Eclipse
a) Crie um projeto Web dinâmico (File -> New -> Dynamic Web Project) ;
b) Crie o pacote com.multitecnus ;
c) Crie um servlet de nome ServletMonitorado;
d) Clique, com o botão direito do mouse, sobre o nome do pacote, e, depois, em
New -> Listener :
95
Grupo Multitecnus© , 2013
Na janela que surge, digite ServletmonitoradoListener no campo Class name :
Clicar em Next.
96
Grupo Multitecnus© , 2013
Na janela que surge, clique em javax.servlet.ServletContextListener : 
Clique em Finish.
97
Grupo Multitecnus© , 2013
A anotação @WebListener no código gerado:
@WebListener
public class ServletMonitoradoListener implements ServletContextListener{
/**
* Default constructor. 
*/
public ServletMonitoradoListener() {
// TODO Auto-generated constructor stub
}
registra a classe como sendo um listener, obrigando-a a implementar uma das
interfaces listadas anteriormente (no exemplo, usou-se: ServletContextListener).
Em versões anteriores à especificação 3.0, deve-se alterar o arquivo de
web.xml com o seguinte:
<listener>
<listener-class>com.multitecnus. ServletMonitoradoListener</listener-class>
</listener>
98
Grupo Multitecnus© , 2013
Na classe recém criada, altere as linhas de código como abaixo:
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("O Contexto foi iniciado!");
}
Execute, agora, a aplicação Web e veja a mensagem na aba Console (na parte
inferior da tela do Eclipse).
Obs.: Caso esta aba não esteja visível, clique emWindow -> Show View -> Console.
99
Grupo Multitecnus© , 2013
2.8. Filtro
Um servlet filter permite interceptar os objetos HttpServletRequest e
HttpServletResponse antes que eles sejam enviados ao servlet, permitindo
implementar controle de acesso, compressão/descompressão de dados, etc.
A anotação @WebFilter no código:
@WebFilter(servletNames = { "ServletTeste" } )
public class ServletTesteFilter implements Filter {
registra a classe como sendo um filtro, obrigando-a a implementar a interface Filter.
E informa que o servlet ServletTeste será filtrado por meio de ServletTesteFilter.
100
Grupo Multitecnus© , 2013
Nas versões anteriores à especificação Servlet 3.0, deve-se adicionar os
elementos “<filter>” e “<filter-mapping>” ao arquivo web.xml:
<filter>
<display-name>ServletTesteFilter</display-name>
<filter-name>ServletTesteFilter</filter-name>
<filter-class>com.multitecnus.ServletTesteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ServletTesteFilter</filter-name>
<servlet-name>ServletTeste</servlet-name>
</filter-mapping>
101
Grupo Multitecnus© , 2013
Quando o filtro é adicionado ao contexto, o método init é executado.
Quando o filtro é destruído, é invocado o método destroy.
O método mais importante em um filtro é o método doFilter, que examina
os cabeçalhos (headers) da requisição, customiza requisições que solicitem a
modificação de cabeçalhos ou dados e invoca o próximo filtro.
A interface FilterConfig (parâmetro do método init), possui 4 métodos:
a) public String getFilterName() : retorna o nome do filtro.
b) public String getInitParameter(String arg0) : retorna uma string contendo o
parâmetro de iniciação, ou nulo, caso não exista tal parâmetro.
c) public Enumeration<String> getInitParameterNames() : retorna os nomes de
todos os parâmetros do filtro.
d) public ServletContext getServletContext() : retorna um objeto para o contexto
do servlet.
102
Grupo Multitecnus© , 2013
Como exemplo, crie um filtro de controle para acesso a requisições7 a um
servlet:
1) Crie um projeto Web dinâmico. Nomeie-o como: filtro .
2) Crie o pacote com.multitecnus.filtro .
3) Crie o servlet ServletTeste no pacote com.multitecnus.filtro. Altere o URL
mappings para: /st .
4) Clique com o botão direito do mouse sobre o nome do servlet ServletTeste e,
após isto, em New -> Filter. É criada a classe ServletTesteFilter.
Neste caso, o filtro avaliará se o usuário possui, ou não, privilégio para acessar o
ServletTeste.
5) Crie o arquivo teste.html que requisitará ServletTeste .
6) Execute o projeto a partir do HTML gerado.
7Obs.: O filtro será configurado para permitir o acesso a ServletTeste somente pelo usuário admin. Usuário
com login diferente de admin será redirecionado ao formulário de entrada.
103
Grupo Multitecnus© , 2013
Trecho do código-fonte do arquivo ServletTeste.java:
a) Anotação: @WebServlet("/st")
b) Método doGet:
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<meta charset='ISO-8859-1'>");
out.println("<title>Tela de saída</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>Usuário logado!</p>");
String login = request.getParameter("login");
out.println("<p>Login: " + login + "</p>");
String senha = request.getParameter("senha");
out.println("<p>Senha: " + senha + "</p>");
String valor = (String) getServletContext().getAttribute("valor"); 
out.println("<p>Valor: " + valor + "</p>");
out.println("</body>");
out.println("</html>");
104
Grupo Multitecnus© , 2013
Passos para criação do filtro ServletTesteFilter.java :
Clique com o botão direito do mouse sobre o servlet a ser filtrado
Em seguida, clique em New -> Filter
105
Grupo Multitecnus© , 2013
Código-fonte do arquivo ServletTesteFilter.java:
package com.multitecnus;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Obs1: Adicione os trechos em negrito ao código gerado pelo Eclipse. 
Obs2: Altere a anotação criada automaticamente pelo descrito no exemplo.
Obs3: O projeto completo, filter.war, pode ser obtido em http://www.multitecnus.com/java.
106
Grupo Multitecnus© , 2013
/**
* Servlet Filter implementation class ServletTesteFilter
*/
@WebFilter(urlPatterns = { "/st" }) 
public class ServletTesteFilter implements Filter {
private FilterConfig fConfig;
/**
* Default constructor. 
*/
public ServletTesteFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
107
Grupo Multitecnus© , 2013
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
if (((HttpServletRequest) request).getParameter("login").equals("admin"))
{
fConfig.getServletContext().setAttribute("valor", "10");
chain.doFilter(request, response);
}
else
((HttpServletResponse) response).sendRedirect("teste.html");
108
Grupo Multitecnus© , 2013
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
this.fConfig = fConfig;
}
}
109
Grupo Multitecnus© , 2013
Código-fonte do arquivo teste.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="st" method="get">
Login <input type="text" name="login" /><br />
Senha <input type="text" name="senha" /><br />
<input type="submit" value="Enviar" />
</form>
</body>
</html>
110
Grupo Multitecnus© , 2013
Antes de exportar o projeto (arquivo .war), cuide para que servlet-api.jar seja
exportada também.
Para tal, na aba Markers, 
expanda o item Classpath Dependency Validator Message. Aparecerá a mensagem
Classpath entry.
111
Grupo Multitecnus© , 2013
Clique em Classpath entry com o botão direito do mouse:
Em seguida, dê um clique em Quick Fix.
112
Grupo Multitecnus© , 2013
Na janela do Quick Fix, certifique-se que a opção: 
Mark the associated raw classpath entry as a publish/export dependency
esteja selecionada. Clique em Finish para terminar.
113
Grupo Multitecnus© , 2013
Pronto. O problema da dependência está resolvido.
Agora,é só exportar o projeto. 
114
Grupo Multitecnus© , 2013
2.9. Servlet Assíncrono
A especificação Java Servlet 3.0 permite processamento assíncrono de tal
forma que uma thread relacionada a um servlet não precise esperar pela resposta
de um banco de dados, ou outro recurso qualquer, para continuar processando a
requisição, ou seja, a thread não é bloqueada. Um bom exemplo de utilização de
servlet assíncrono, é na construção de conversações (chats) onde se tem a
necessidade de habilitar conexões clientes longas com um servlet.
Dessa forma, a requisição processada pelo servlet é colocada em uma
fila; já a resposta é processada dentro da possibilidade do servidor, sendo gerada
assincronamente.
115
Grupo Multitecnus© , 2013
Para que se possa trabalhar com servlets assíncronos, deve-se:
a) Incluir o argumento asyncSupported = true na anotação @WebServlet . Por
exemplo:
@WebServlet(urlPatterns={"/ts","/ServletAssincrono"}, asyncSupported=true)
b) Fazer uma requisição assíncrona por meio do método startAsync:
AsyncContext aCtx = request.startAsync(request, response);
c) Definir a quantidade de tempo (em ms) após o qual ocorre "timeout" para a
requisição HTTP. No exemplo dado, serão 30s (30000 ms):
aCtx.setTimeout(30000);
d) Criar um pool de threads para executar as tarefas (no exemplo dado, o pool
conterá10 threads, ativas ou inativas):
ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor (10);
116
Grupo Multitecnus© , 2013
e) Definir a quantidade máxima de threads que o pool poderá conter (as
requisições que excederem "MaximumPoolSize" serão rejeitadas):
stpe.setMaximumPoolSize(500);
f) Definir o tempo máximo, após o qual, uma thread é encerrada se não estiver em
atividade (no exemplo dado, 30s):
stpe.setKeepAliveTime(30, TimeUnit.SECONDS);
f) Executar as tarefas:
stpe.execute(new ServletAssincronoThread(aCtx));
Segue o código-fonte da classe ServletAssincrono.java.
117
Grupo Multitecnus© , 2013
package com.async;
import java.io.IOException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns={"/tsa","/ServletAssincrono"}, asyncSupported=true)
public class ServletAssincrono extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletAssincrono() { }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
AsyncContext aCtx = request.startAsync(request, response);
aCtx.setTimeout(10000);
ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor (10);
stpe.setMaximumPoolSize(500);
stpe.setKeepAliveTime(30, TimeUnit.SECONDS);
stpe.execute(new ServletAssincronoThread(aCtx));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
}
118
Grupo Multitecnus© , 2013
g) Criar a classe "ServletAssincronoThread" para executar a tarefa desejada com
uma thread:
public class ServletAssincronoThread implements Runnable
Segue o código-fonte:
package com.async;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.AsyncContext;
import javax.sql.DataSource;
119
Grupo Multitecnus© , 2013
package com.async;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
public class ServletAssincronoThread implements Runnable {
AsyncContext aCtx;
PrintWriter out;
public ServletAssincronoThread(AsyncContext aCtx) {
this.aCtx = aCtx;
try {
this.out = aCtx.getResponse().getWriter();
}
catch (IOException ioe){}
}
public void run() {
/*
* Rotina demorada (acesso a dados, a sites, etc.)
*/
aCtx.complete();
}
}
120
Grupo Multitecnus© , 2013
Obs.1: Para um melhor controle da operação, pode-se adicionar um observador
(classe Listener) à variável que instancia AsyncContext (no caso, aCtx):
aCtx.addListener (new AListener(aCtx));
Obs.2: Para ver o projeto completo (com a classe AListener, que implementa a
interface AsyncListener, e a classe ServletAssincronoThread, que utiliza um
datasource para acesso a dados), importe o arquivo testaAssincrono.war
(File -> Import... -> Web ->WARfile), em: http://www.multitecnus.com/java.
121
Grupo Multitecnus© , 2013
3. JSP
JSP (JavaServer Pages) permite criar páginas web de forma dinâmica,
sendo transformada em um Servlet pelo conteiner web.
Um arquivo JSP pode conter HTML e código Java (chamado de scriptlet)
delimitado pelos marcadores: <% e %>, como mostrado abaixo:
<html>
<head>
<title>Exemplo de JSP</title>
</head>
<body>
<%
out.println (“Teste de JSP”);
%>
</body>
</html>
122
Grupo Multitecnus© , 2013
Métodos definidos dentro do código JSP, devem ser delimitados pelos
marcadores <%! e %>, como mostrado abaixo:
<html>
<head>
<title>Exemplo de JSP</title>
</head>
<body>
<%!
public String msg(String m)
{
return "Mensagem= " + m;
}
%>
<p>Código HTML</p>
<%
out.println( msg("testandométodo msg") );
%>
</body>
</html>
123
Grupo Multitecnus© , 2013
Obs.: A impressão de saída pelo método println:
<%
out.println( msg("testando método msg") );
%>
pode ser substituída pela forma abreviada abaixo:
<%= msg("testando método msg") %>
Observe que o marcador inicial é "<%=" e, neste caso, após o marcador "%>" não
há ponto e vírgula.
124
Grupo Multitecnus© , 2013
Os passos para criação de uma página dinâmica via JSP envolvem:
a) Uma requisição (request) HTTP chega ao servidor web;
b) O servidor envia a página JSP especificada na requisição ao motor (engine) JSP;
c) O JSP é convertido em um servlet;
d) O servlet é compilado e, então, enviado ao motor (engine) servlet para que seja 
executado;
e) O servlet após execução produz uma saída no formato HTML, e enviado ao 
cliente da requisição por meio de uma resposta (response) HTTP;
f) O motor servlet envia a resposta HTTP ao servidor web, e este, por sua vez, 
envia a página HTML gerada ao navegador requisitante. 
125
Grupo Multitecnus© , 2013
3.1. Scriptlet
Um scriptlet pode conter código Java (método, variável ou comendo), 
sendo delimitado por: <% e %>:
<%
// código Java
%>
Em formato XML, escreveríamos como abaixo:
<jsp:scriptlet> 
// código Java 
</jsp:scriptlet> 
126
Grupo Multitecnus© , 2013
As declarações de variáveis e métodos devem ser delimitadas por: <%! e %>:
<%!
int a,b;
public String msg(String m)
{
return "Mensagem= " + m;
}
%>
Em formato XML, escreveríamos como abaixo:
<jsp:declaration> 
int a,b;
public String msg(String m)
{
return "Mensagem= " + m;
}
</jsp:declaration> 
127
Grupo Multitecnus© , 2013
Uma expressão, após avaliação, produz uma string a ser impressa na página HTML.
Deve ser delimitada por: <%= e %>:
<%= msg("testando método msg") %> 
Em formato XML, escreveríamos como abaixo:
<jsp:expression> 
msg("testando método msg") 
</jsp:expression> 
Observe que não há ponto e vírgula ao final da expressão, pois trata-se de uma
string que será adicionada à página.
128
Grupo Multitecnus© , 2013
Comentários em JSP são delimitados por: <%-- e --%>:
<%--
Esta parte do código será ignoradapor JSP.
--%> 
Exemplo: gerando uma tabela com a tabuada de 10:
<body>
Tabuada de 10
<table border="1">
<tr>
<td>número</td><td> número x 10 </td>
</tr>
<% for (int i = 0; i <= 10; i++) { %> <%-- início do for --%>
<tr> 
<td> <%= i %> </td> 
<td> <%= i*10 %> </td> 
</tr>
<% } %> <%-- fim do for --%>
</table>
</body> 
129
Grupo Multitecnus© , 2013
3.2. Diretivas
São configurações informadas ao conteiner sobre a página JSP na sua
compilação a servlet, sendo delimitadas por <%@ e %>.
São três as diretivas: page, include e taglib.
3.2.1. Diretiva: <%@ page %>
Informa uma lista de atributos de uma página JSP, tais como:
- buffer: se contiver um valor igual a "none", a página de resposta é
enviada diretamente ao cliente sem uso de buffer. Do contrário,
deve-se especificar um tamanho, por exemplo: "8kb" (o padrão)
- contentType: informa o conteúdo MIME (por padrão "text/html") e o
conjunto de caracteres a ser utilizado (“ISO-8859-1", por
exemplo)
130
Grupo Multitecnus© , 2013
- errorPage: especifica a URL de outra JSP a ser carregada no caso de
ocorrerem exceções no JSP atual
- import: especifica uma lista de pacotes ou classes, separados por
vírgula, a serem utilizados pelo JSP
- info: string contendo informações que podem ser resgatadas pelo
método getServletInfo()
- language: string contendo o nome da linguagem utilizada pelo código
(por padrão, " java ")
- pageEncoding: informa a codificação de caracteres a ser utilizado (por
exemplo, “ISO-8859-1 ")
Por exemplo:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1" info="Página de exemplo de JSP" %>
131
Grupo Multitecnus© , 2013
Exemplo 1: JSP gerado no Eclipse:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" 
content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.println("Teste de JSP");
%>
</body>
</html>
132
Grupo Multitecnus© , 2013
Exemplo 2: especificação de página de erro
a) Criar os arquivos: arq.jsp e erro.jsp (pasta WebContent)
133
Grupo Multitecnus© , 2013
b) Conteúdo do arquivo arq.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" errorPage= “erro.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" 
content="text/html; charset=ISO-8859-1">
<title>Página com erro</title>
</head>
<body>
<%
int n1=1, n2=0, n3;
// A linha abaixo causará um erro de divisão por zero
n3 = n1/n2; 
%>
</body>
</html>
134
Grupo Multitecnus© , 2013
c) Conteúdo do arquivo erro.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1«
pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" 
content="text/html; charset=ISO-8859-1">
<title> Página de tratamento de erro </title>
</head>
<body>
<%
out.println ("Ocorreu um erro em arq.jsp!");
%>
</body>
</html>
135
Grupo Multitecnus© , 2013
d) Ao executar arq.jsp, o conteúdo de erro.jsp é exibido:
Exemplo 3: Importando "java.util"
<%@ page import="java.util.*" %>
<%= (new java.util.Date()).toLocaleString() %>
136
Grupo Multitecnus© , 2013
3.2.2. Diretiva: <%@ include %>
Utilizada para a inclusão de arquivos:
<%@ include file= “uri relativo" %>
Por exemplo, se o código presente em arq2.jsp deve ser incluído em arq1.jsp, o
arquivo arq1.jsp deve declarar o seguinte:
<%@ include file= “arq2.jsp" %>
137
Grupo Multitecnus© , 2013
3.2.3. Diretiva: <%@ taglib %>
A JSTL (JavaServer Pages Standard Tag Library) é um conjunto de tags
personalizadas que contêm várias funcionalidades (manipulação de documentos
XML, execução de cláusulas SQL, etc.) necessárias ao bom funcionamento de
aplicações JSP, ou seja, trata-se de uma biblioteca (LIBrary) de tags, cada uma delas
executando determinado processamento, permitindo a execução de código Java
em uma página JSP sem, contudo, precisar codificar nesta linguagem.
Para utilizar uma taglib, deve-se definir qual a taglib desejada (atributo
uri) e um nome que se conhece por prefixo que identificará as tags da biblioteca
respectiva. Por exemplo, para utilizar a taglib core, faz-se como abaixo:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
138
Grupo Multitecnus© , 2013
Taglibs permitem a construção de páginas JSP mais simples. Por exemplo, seguem
abaixo dois códigos JSP para listar os valores de 1 a 10: o da esquerda, contendo
scriptlet, o que a torna difícil de ler, ao passo que o código à direita faz uso de
Taglibs, tornando-o mais elegante e fácil de manter:
<body>
<%
for(int i=1; i<=10; i++)
{
%>
<%= i %> <br/>
<%
}
%>
</body>
</html>
<body>
<c:forEach var="i" begin="1" end="10" >
<c:out value="${i}" /> 
<br />
</c:forEach>
</body>
</html>
139
Grupo Multitecnus© , 2013
As tags JSTL podem ser agrupadas de acordo com suas funcionalidades:
- Core ( prefix: c )
- Internationalization ( prefix: fmt )
- SQL ( prefix: sql )
- XML ( prefix: x )
- Functions ( prefix: fn )
Obs.: Os prefixos entre parênteses são especificados pela convenção Java, de
acordo com a documentação da Oracle, encontrada em:
http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
Segue, para cada biblioteca, a uri correspondente:
- Core: http://java.sun.com/jsp/jstl/core
- Internationalization: http://java.sun.com/jsp/jstl/fmt
-SQL: http://java.sun.com/jsp/jstl/sql
- XML: http://java.sun.com/jsp/jstl/xml
- Functions: http://java.sun.com/jsp/jstl/functions
140
Grupo Multitecnus© , 2013
3.2.3.1. JSTL Core
Esta biblioteca fornece funcionalidades úteis para um projeto, sendo:
- Operações de uso geral
- Operações de repetição
- Operações condicionais
- Operações de manipulação de URL
Para utilizá-la, deve-se inserir, no topo do corpo do JSP, o cabeçalho:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > 
141
Grupo Multitecnus© , 2013
A seguir, são listadas as tags de Core (JSTL básica).
a) <c:out /> : exibe um valor
Atributos:
value: o que será impresso
default: conteúdo a ser exibido caso value seja nulo.
escapeXml: "true" se a tag deve gerar uma "sequência de escape" para
os casos em que deve-se exibir um caracter especial (como
o caractere aspas duplas)
Por exemplo:
- Crie um projeto web dinâmico no Eclipse.
- Insira o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> e
o código: <c:out value="Utilizando JSTL Core"/> no documento.
%142
Grupo Multitecnus© , 2013
Observe o erro apontado pelo Eclipse:
Para resolvê-lo:
- Acesse o endereço: http://tomcat.apache.org/taglibs/standard/
- Clique em download da versão JSTL 1.1
- Clique em binaries/
- Clique em: jakarta-taglibs-standard-1.1.2.zip
143
Grupo Multitecnus© , 2013
- Descompacte o arquivo obtido (jakarta-taglibs-standard-1.1.2.zip)
- Copie os arquivos jstl.jar e standard.jar para o diretórioWEB-INF/lib da aplicação
- No Eclipse, importe os arquivos .jar por meio do Build Path:
144
Grupo Multitecnus© , 2013
- Não há mais erros no código:
Porém, a abaMarkers (parte inferior do Eclipse) mostra duas dependências:
145
Grupo Multitecnus© , 2013- Para resolver a primeira dependência, clique com o botão direito sobre ela e, em
seguida, em Quick Fix :
146
Grupo Multitecnus© , 2013
Surge a janela do Quick Fix. Selecione a primeira opção de Select a fix:
Mark the associated raw classpath entry as a publish/export dependency.
e, por último, no botão Finish.
Repita os passos anteriores para a segunda dependência.
147
Grupo Multitecnus© , 2013
Pronto. Só falta executar o JSP (utilizou-se o Apache 7.0), o que exibe a mensagem:
Utilizando JSTL Core 
no navegador, como mostrado abaixo:
148
Grupo Multitecnus© , 2013
Ou, se preferir, gerando o arquivo WAR, carregando o JSP em um navegador fora
do ambiente do Eclipse. Abaixo, pode-se ver o resultado no Firefox:
149
Grupo Multitecnus© , 2013
Obs1.: Outra forma de resolver o problema das dependências:
- Copie os arquivos jstl.jar e standard.jar para o diretórioWEB-INF/lib da aplicação
(no exemplo, \workspace\jstl\dwp.jstl\WebContent\WEB-INF\lib)
- Clique em lib (deWEB-INF) e, em seguida, em File -> Refresh (ou dê um toque na
tecla F5) para atualizar o ambiente. Observe que os arquivos .jar que faltavam
são incorporados ao projeto:
150
Grupo Multitecnus© , 2013
Observe, porém, a sinalização de erro na janela de código:
151
Grupo Multitecnus© , 2013
Para resolver o problema, no diretórioWEB-INF/lib (Project Explorer), clique com o
botão direito do mouse sobre jstl.jar e, depois, dê um clique em Add to Build Path:
Repita esta ação para standard.jar.
152
Grupo Multitecnus© , 2013
Pronto. O problema está resolvido. Agora, só falta executar o JSP.
153
Grupo Multitecnus© , 2013
Obs2.: Verifique a diferença de código-fonte do HTML gerado, em função do valor
do atributo escapeXml. Por exemplo, se o documento contiver o seguinte
trecho:
<c:out value="Utilizando \"JSTL Core\"" escapeXml="false" />
Será gerado o código-fonte:
Utilizando "JSTL Core"
Porém, se o trecho do código JSP for como abaixo:
<c:out value="Utilizando \"JSTL Core\"" escapeXml="true" />
ou (sem especificar escapeXml explicitamente):
<c:out value="Utilizando \"JSTL Core\"" />
Será gerado o seguinte código-fonte:
Utilizando &#034;JSTL Core&#034;
154
Grupo Multitecnus© , 2013
Obs3.: Como o valor da variável v necessita exibir as aspas duplas no corpo da
mensagem, a string pode ser delimitada, neste caso, por aspas simples:
<c:out value= ' Utilizando "JSTL Core" ' />
Neste caso, não é necessário o uso da barra invertida.
b) <c:set > : atribui o resultado de uma expressão a uma variável.
<c:set var="v" value='Utilizando "JSTL Core"' />
Para exibir o conteúdo da variável "v", basta utilizar c:out e a sintaxe da
Expression Language (escrevendo o nome da variável delimitada por chaves,
antecedidas por um cifrão ($), tudo delimitado por aspas), como abaixo:
<c:out value="${v}" default="Utilizando \"JSTL Core\"" />
155
Grupo Multitecnus© , 2013
Expression Language - EL
São expressões utilizadas para construir páginas dinâmicas, evitando-se o
uso de scriptlets.
Uma expressão é delimitada pelo marcador ${expressão}, para avaliação
imediata (immediate evaluation), ou pelo marcador #{expressão}, para avaliação
tardia (deferred evaluation), onde a avaliação da expressão, neste último caso,
somente é realizada quando necessário8. Assim, a avaliação pode acontecer em
diferentes estágios do ciclo de vida da página, como, por exemplo, nos casos em
que se utiliza o framework JSF9. Componentes JSF precisam que a expressão seja
avaliada durante o ciclo de vida JSF e não pelo motor (engine) JSP.
8Mais detalhes em: http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html
9Mais detalhes em: http://www.multitecnus.com/java/framework.pdf
156
Grupo Multitecnus© , 2013
São operadores da EL:
Observe que há, para alguns operadores (como o de comparação de igualdade, por
exemplo), uma forma alternativa de se executar uma operação. Assim, fazer
${1 == 1} é o mesmo que fazer ${1 eq 1}, e ambas as expressões produzem true
como resultado.
Operador Descrição
+ adição
- subtração/menos unário
* multiplicação
/ divisão (ou div)
% resto da divisão (ou mod)
== igual a (ou eq)
!= diferente de (ou ne)
< menor que (ou lt)
> maior que (ou gt)
<= menor ou igual a (ou le)
>= maior ou igual a (ou ge)
&& E lógico (ou and)
|| OU lógico (ou or)
! negação booleana unária (ou not)
empty verifica se a variável possui valor nulo
157
Grupo Multitecnus© , 2013
c) <c: remove > : elimina a variável. Por exemplo, o código:
<c:set var="v" value='Utilizando "JSTL Core"' />
<c:out value="${v}" />
<br />
<c:remove var="v" />
<c:out value="${v}" default="variável removida!" />
produz a seguinte saída:
Utilizando "JSTL Core" 
variável removida!
158
Grupo Multitecnus© , 2013
d) <c:if> : estrutura condicional.
O código abaixo:
<c:set var="v" value="0" />
<c:if test = "${v == 0 }" >
<c:out value='v = ${v}' />
</c:if>
produz a seguinte saída:
v = 0
Obs1: O atributo "test" logo após "<c:if" tem seu uso obrigatório!
Obs2: Não há existe a estrutura else. Caso seja necessário, utilize "choose".
159
Grupo Multitecnus© , 2013
e) <c:catch> : captura exceções ocorridas no corpo do documento. Por exemplo,
<%! int x; %>
<c:catch var="excecao">
<% int x=1/0; %>
</c:catch>
<c:if test="${excecao != null}">
<p>
Exceção: Classe : tipo => ${excecao} 
<br />
Mensagem : ${excecao.message} 
</p>
</c:if>
produz a seguinte saída:
Exceção: Classe : tipo => java.lang.ArithmeticException: / by zero 
Mensagem : / by zero 
160
Grupo Multitecnus© , 2013
f) <c:choose> : estrutura condicional semelhante a switch/case. Por exemplo,
- Crie uma página HTML contendo o trecho:
<form action="jstl_choose.jsp" method="get">
<input type="text" name="valor" />
<input type="submit" value="Enviar" />
</form>
- Crie o arquivo JSP (jstl_choose.jsp) contendo o trecho abaixo:
<body>
<c:set var="v" value='<%= request.getParameter("valor") %>' />
<c:choose>
<c:when test="${v == 0}">Zero</c:when>
<c:when test="${v == 1}">Um</c:when>
<c:otherwise>${v} está fora do limite!</c:otherwise>
</c:choose>
</body> 
- Carregue o arquivo HTML no navegador e envie um inteiro para vê-lo por extenso.
161
Grupo Multitecnus© , 2013
g) <c:forEach> : estrutura de repetição. Por exemplo,
- Crie o arquivo JSP (jstl_foreach.jsp) contendo o trecho abaixo (o parâmetro step
com valor igual a 1 é opcional):
<body>
<c:set var="vi" value='<%= request.getParameter("valori") %>' />
<c:set var="vf" value='<%= request.getParameter("valorf") %>' />
<c:forEach var="i" begin="${vi}" end="${vf}" step="1">
<c:out value="${i}" />
<c:if test="${i % 10 == 0}">
<br />
</c:if>
</c:forEach>
</body> 
- Crie uma página HTML contendo o trecho abaixo, e o carregue no navegador:
<form action="jstl_foreach.jsp" method="get">
Início <input type="text" name="valori" /> <br />
Fim <input type="text" name="valorf" /> <br />
<input type="submit" value="Enviar" />
</form>
162
Grupo Multitecnus© , 2013
h) <c:forTokens> : separa um token (um conjunto de símbolos) em partes de
acordo com o delimitador especificado. Por exemplo,
considerando-se que a string "str1;str2;str3" é formada por
substrings separadas pelo caractere ponto e vírgula (;), atribuir
a string (ou variável que contenha a string) ao parâmetro item,
e ";" ao parâmetro delims. O parâmetro var recebe cada uma
das substrings, a cada etapa da separação:
- Crie o arquivo JSP (jstl_fortokens.jsp) contendo o trecho abaixo:
<body>
<c:forTokens items="str1;str2;str3" delims=";" var="str">
<c:out value="${str}"/>
<%= "<br />" %>
</c:forTokens>
</body> 
163
Grupo Multitecnus© , 2013
i) <c:import> : importa uma URL (absoluta ou relativa) e a exibe na página
corrente. Por exemplo,
- Crie o arquivo JSP (jstl_import.jsp) contendo o trecho abaixo:
<body>
<p>Taglib import</p>
<c:import url="http://www.multitecnus.com/java" />
</body> 
Obs.: Se você desejar recuperar o conteúdo da página, ao invés de exibi-la,
especifique a variável (atributo var) que irá receber o conteúdo da página,
<body>
<c:import var="local" url="http://www.multitecnus.com/java" />
<c:out value="${local}" />
</body> 
164
Grupo Multitecnus© , 2013
j) <c:url> : cria uma URL automatizando a codificação de caracteres especiais e a
reescrita de URL (URL rewriting).
Obs.1: URL rewriting é a capacidade de a Servlet utilizar sessões mesmo que o
navegador não esteja habilitado para o uso de cookies.
Para resolver este problema, é necessário que a URL contenha o valor de
identificação da sessão (JSESSIONID) na requisição.
Por exemplo, criar uma URL com a linha abaixo,
<c:url var="ender" value="./destino.jsp" /> 
Faz com que a requisição de destino.jsp em localhost, na porta 9080, seja
executada como:
http://localhost:9080/dwp.jstl/destino.jsp;jsessionid=E1BE0BE30257B0AEF45566CBDDA62D4C
Obs.2: Também pode ser utilizado: HttpServletResponse.encodeURL (String url).
165
Grupo Multitecnus© , 2013
k) <c:param> : adiciona um parâmetro à URL. Por exemplo:
<c:url var="ender" value="./destino.jsp">
<c:param name="v1" value="1" />
<c:param name="v2" value="2" />
</c:url>
faz com que a URL contenha cada parâmetro e seu valor (v1=1 & v2=2):
http://localhost:9080/dwp.jstl/destino.jsp;jsessionid=C82419CCF9FE7C741FC5816D3FA3DB38?v1=1&v2=2
l) <c:redirect > : redireciona para a URL especificada. Por exemplo:
<c:redirect url="http://www.multitecnus.com" />
166
Grupo Multitecnus© , 2013
3.2.3.2. JSTL Formatting
Para utilizar esta biblioteca, deve-se inserir, no topo do corpo do JSP, o
cabeçalho:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
Por meio de Formatting pode-se:
a) Exibir messagens especificando-se o idioma (português, inglês, etc.);
b) Formatar datas e números;
c) Especificar o fuso horário (time zone).
167
Grupo Multitecnus© , 2013
Exemplo 1: Exibir mensagens em função do idioma do usuário (pt_BR: português
do Brasil ou en_US: inglês americano):
a) Dê um clique em File -> File:
168
Grupo Multitecnus© , 2013
b) Na janela que surge, dê um clique em src:
c) No campo File name, digite:messages_pt_BR.properties. Clique em Finish.
169
Grupo Multitecnus© , 2013
d) Como conteúdo deste arquivo, digite:
c1=Campo 1
c2=Campo 2
c3=Campo 3
Salve-o.
170
Grupo Multitecnus© , 2013
e) Repita as operações anteriores para o arquivo messages_en_US.properties:
c1=Field 1
c2=Field 2
c3=Field 3
f) Crie, ainda, o arquivo messages.properties:
c1=Sem descrição de campo 1
c2=Sem descrição de campo 2
c3=Sem descrição de campo 3
Este último arquivo é carregado se o idioma especificado não possuir um arquivo
de propriedades, podendo carregar informações do idioma local por padrão.
171
Grupo Multitecnus© , 2013
g) Dê um clique com o botão direito sobreWebContent:
Clique, em seguida, em JSP File.
172
Grupo Multitecnus© , 2013
Na janela que surge, digite: jstlFmt.jsp e, em seguida, clique em Finish.
173
Grupo Multitecnus© , 2013
Adicione ao código-fonte, logo após a cláusula <%@ page, o cabeçalho:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
No corpo do documento (entre as tags <body> e </body>) digite o seguinte
conteúdo:
<fmt:setLocale value="pt_BR" />
<fmt:bundle basename="messages" >
<fmt:message key="c1" /><br/>
<fmt:message key="c2" /><br/>
<fmt:message key="c3" /><br/>
</fmt:bundle>
<fmt:setLocale value="en_US" />
<fmt:bundle basename="messages" >
<fmt:message key="c1" /><br/>
<fmt:message key="c2" /><br/>
<fmt:message key="c3" /><br/>
</fmt:bundle>
Execute o arquivo JSP.
174
Grupo Multitecnus© , 2013
Caso surja a janela Server para reiniciar o servidor, clique em OK .
175
Grupo Multitecnus© , 2013
Se tudo ocorrer bem, será produzida a saída abaixo:
sendo:
Campo 1
Campo 2
Campo 3
produzido por <fmt:setLocale value="pt_BR" />, e
Field 1
Field 2
Field 3
produzido por <fmt:setLocale value="en_US" />.
176
Grupo Multitecnus© , 2013
Especificar um idioma sem arquivo .properties, como, o espanhol (value="es"):
<fmt:setLocale value="es" />
<fmt:bundle basename="messages" >
<fmt:message key="c1" /><br/>
<fmt:message key="c2" /><br/>
<fmt:message key="c3" /><br/>
</fmt:bundle>
Faz com que o arquivomessages.properties seja acionado, o que resulta em:
177
Grupo Multitecnus© , 2013
Exemplo 2: Exibir números em um formato especificado: <ftm:formatNumber
Parâmetros:
value : valor a ser formatado
var : variável que receberá o valor numérico formatado
minFractionDigits : quantidade mínima de dígitos decimais
maxFractionDigits : quantidade máxima de dígitos decimais
minIntegerDigits : quantidade mínima de dígitos da parte inteira
maxIntegerDigits : quantidade máxima de dígitos da parte inteira
groupingUsed : utilizar separador de dígitos (no Brasil, "." a cada 3 dígitos)
currencySymbol : símbolo representativo da moeda
currencyCode : código de 3 letras baseado no padrão ISO 4217. O real é
representado pelo código BRL.
pattern : padrão (como os utilizados em planilhas eletrônicas) a ser
utilizado na formatação.
type : tipo de formatação: currency (moeda), number (número)
ou percent (porcentagem)
178
Grupo Multitecnus© , 2013
Os códigos abaixo produzem os resultados respectivos:
< fmt:formatNumber type="number" value="89.999" /> : 89,999
<fmt:formatNumber type="number" pattern="000.000" value="9.99" /> : 009,990
< fmt:formatNumber type="number" pattern="#00.000" value="9.99" /> : 09,990
< fmt:formatNumber type="number" pattern="##0.0" value="9.99" /> : 10,0
< fmt:formatNumber type="number" pattern="##00.0#" value="1000" /> : 1000,0
< fmt:formatNumber type="number" maxFractionDigits="2" value="99.999" /> : 100
< fmt:formatNumber type="number" maxFractionDigits="2" value="10.100" /> : 10,1
<fmt:formatNumber type="number" maxFractionDigits="2" value="10.991" /> : 10.99
< fmt:formatNumber type="number" maxIntegerDigits="2" value="99.999" /> : 99,999
< fmt:formatNumber type="number" maxIntegerDigits="2" value="979.999" /> : 79,999
Obs.: Os valores utilizam a notação em ponto flutuante (ponto separando a casa 
decimal), enquanto que a saída será formatada de acordo com o padrão da 
localidade (por exemplo, vírgula separando as casas decimais no Brasil).
179
Grupo Multitecnus© , 2013
<fmt:formatNumber type="currency" value="12.34" /> : R$ 12,34
< fmt:formatNumber type="currency" value="12.345" /> : R$ 12,34
< fmt:formatNumber type="currency" value="12.346" /> : R$ 12,35
< fmt:formatNumber type="percent" value="0.10" /> : 10%
< fmt:setLocale value="en_US" /> 
< fmt:formatNumber value="123456789.00" type="currency" /> : $123,456,789.00
< fmt:setLocale value="pt_BR" /> 
< fmt:formatNumber value="123456789.00" type="currency" /> : R$ 123.456.789,00
< fmt:formatNumber value="123456789.00" type="currency" 
groupingUsed="true" /> : R$ 123.456.789,00
< fmt:formatNumber value="123456789.00" type="currency" 
currencySymbol="T#" /> : T# 123.456.789,00
180
Grupo Multitecnus© , 2013
Exemplo 3: Converter strings em número: <fmt:parseNumber
Parâmetros:
value : valor a ser convertido
var : variável que receberá o valor numérico
integerOnly: converter apenas o trecho que representa a parte inteira
parseLocale : especifica a localidade (formato)
pattern : padrão (como os utilizados em planilhas eletrônicas) a ser
utilizado na formatação.
type : tipo de formatação: currency (moeda), number (número)
ou percent (porcentagem)
181
Grupo Multitecnus© , 2013
Por exemplo:
a) Criar um arquivo HTML contendo o seguinte:
<form action="jstlFmt.jsp" >
N1: <input type="text" name="n1" /><br />
N2: <input type="text" name="n2" /><br />
<input type="submit" value="Enviar" />
</form>
b) Criar o arquivo jstlFmt.jsp contendo o seguinte:
1) <fmt:parseNumber value="${param.n1}" type="number" /><br />
2) <fmt:parseNumber value="${param.n1}" type="number" integerOnly="true"/><br />
3) <fmt:parseNumber value="${param.n2}" type="number" /><br />
c) Executar o arquivo HTML enviando:
N1: 123,45 (com a vírgula como separador da casa decimal)
N2: 123.45 (com o ponto como separador da casa decimal)
produz o seguinte:
1) 123.45
2) 123
3) 12345
182
Grupo Multitecnus© , 2013
Exemplo 4: Formatação de datas: <fmt:formatDate
Parâmetros:
value : valor a ser convertido
var : variável que receberá a data formatada
type : data (date), hora (time) ou ambos (both)
dateStyle : pode ser: full, long, medium short ou default
timeStyle : pode ser: full, long, medium short ou default
pattern : padrão (como os utilizados em planilhas eletrônicas) a ser
utilizado na formatação.
timeZone : fuso horário da data a ser exibida
183
Grupo Multitecnus© , 2013
Pro exemplo, o trecho de código abaixo:
<c:set var="d" value="<%=new java.util.Date()%>" />
1) <fmt:formatDate type="date" dateStyle="medium" value="${d}" />
2) <fmt:formatDate type="date" value="${d}" />
3) <fmt:formatDate type="time" value="${d}" />
4) <fmt:formatDate type="both" value="${d}" />
5) <fmt:formatDate type="both" dateStyle="short" value="${d}" />
6) <fmt:formatDate type="both" timeStyle="short" value="${d}" />
7) <fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${d}" /><br />
8) <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${d}" />
9) <fmt:formatDate pattern="dd-MM-yyyy" value="${d}" />
produz o seguinte:
1) 23/11/2012
2) 23/11/2012
3) 10:23:41
4) 23/11/2012 10:23:41
5) 23/11/12 10:23:41
6) 23/11/2012 10:23
7) 23/11/12 10:23
8) 23 novembro de 2012 10h23min41s BRST
9) 23-11-2012
184
Grupo Multitecnus© , 2013
Exemplo 5: Formatação de datas: <fmt:parseDate
Parâmetros:
value : valor a ser convertido
var : variável que receberá a data
type : data (date), hora (time) ou ambos (both)
dateStyle : pode ser: full, long, medium short ou default
timeStyle : pode ser: full, long, medium short ou default
pattern : padrão a ser utilizado na formatação.
timeZone : fuso horário da data a ser exibida
parseLocale : especifica a localidade (formato)
185
Grupo Multitecnus© , 2013
Por exemplo, o trecho de código abaixo:
<c:set var="ds" value="23/11/2012" />
<fmt:parseDate value="${ds}" var="d" pattern="dd/MM/yyyy" type="date" />
<fmt:formatDate type="date" dateStyle="medium" value="${d}" />
produz o seguinte:
23/11/2012
Obs.1: O resultado obtido é uma data e não uma string contendo o formato de uma
data. Assim, fazer:
<c:set var="ds" value="23/11/2012" />
<fmt:parseDate value="${ds}" var="d" pattern="dd/MM/yyyy" type="date" />
equivale a fazer:
<c:set var="d" value="<%=new java.util.Date() %>" />
186
Grupo Multitecnus© , 2013
Obs.2: O parâmetro pattern utiliza:
H : hora no formato 24 horas (3 horas da madrugada = 3h e 3 horas da tarde = 15h)
h : hora no formato 12 horas (3 horas da madrugada = 3h e 3 horas da tarde = 3h)
Assim, assumindo como hora atual: 13h51, o código:
<c:set var="d" value="<%=new java.util.Date() %>" />
1) <fmt:formatDate pattern="dd-MM-yyyy HH:mm:ss" value="${d}" /><br />
2) <fmt:formatDate pattern="dd-MM-yyyy hh:mm:ss" value="${d}" />
exibe o seguinte:
1) 23-11-2012 13:51:23
2) 23-11-2012 01:51:23
187
Grupo Multitecnus© , 2013
3.2.3.3. JSTL SQL
Para utilizar a biblioteca Database, deve-se inserir, no topo do corpo do
JSP, o cabeçalho:
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 
Por meio desta biblioteca pode-se manipular bancos de dados.
188
Grupo Multitecnus© , 2013
Exemplo:
a. Utilizando o MySQL como SGBD:
- Criar o BD multitecnus
- Criar a tabela produto:
CREATE TABLE `multitecnus`.`produto` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(20) COLLATE latin1_swedish_ci DEFAULT NULL,
`preco` DOUBLE(15,3) DEFAULT NULL,
PRIMARY KEY USING BTREE (`id`) COMMENT ''
) ENGINE=InnoDB
AUTO_INCREMENT=1 AVG_ROW_LENGTH=1638
CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='' ;
189
Grupo Multitecnus© , 2013
- Popular a tabela :
INSERT INTO `produto` (`id`, `nome`, `preco`) VALUES
(1,'martelo',25.3),
(2,'prego',0.05),
(3,'alicate',29.8),
(4,'chave de fenda',11.45),
(5,'fita isolante',5.25);
COMMIT;
190
Grupo Multitecnus© , 2013
b. Criar o arquivo context.xml no diretório META-INF com o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8" ?>
<Context >
<Resource
name="DSMultitecnus"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="10"
maxWait="100"
url="jdbc:mysql://localhost/multitecnus"
username="root"
password="mysql"
description="JSTL - SQL"
closeMethod="close"
/>
</Context>
191
Grupo Multitecnus© , 2013
c. Criar um arquivo JSP com o conteúdo abaixo:
<body>
<sql:query var="retorno" dataSource="DSMultitecnus"
sql="select * from `produto`" />
Produto<br />
<c:forEach var="campo" items="${retorno.rows}">
<p>
Id : <c:out value="${campo.id}" /><br />
Nome: <c:out value="${campo.nome}" /><br />
<fmt:formatNumber type="currency" value="${campo.preco}" />
</p>
</c:forEach>
</body>
d. Executar o arquivo JSP.
192
Grupo Multitecnus© , 2013
O arquivo JSP executado produz como saída:
Produto
Id : 1
Nome: martelo
R$ 25.30
Id : 2
Nome: prego
R$ : 0.05
Id : 3
Nome: alicate
R$ : 29.8
Id : 4
Nome: chave de fenda
R$ : 11.45
Id : 5
Nome: fita isolante
R$ : 5.25
193
Grupo Multitecnus© , 2013
3.2.3.1. JSTL XML
Para utilizar a biblioteca XML, deve-se inserir, no topo do corpo do JSP, o
cabeçalho:
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> 
Por meio desta biblioteca pode-se manipular dados XML. Antes, porém,
copie os arquivos xalan.jar10 e xercesImpl.jar11 para o projeto, incluindo-os em seu
CLASSPATH (Build Path -> Add to Build Path).
10Obtido de xalan-j_2_7_1-bin-2jars.zip, disponível em: http://archive.apache.org/dist/xml/xalan-j/binaries/
11Obtido de xerces-J-bin.2.11.0.zip, disponível em: http://www.apache.org/dist/xerces/j/
194
Grupo Multitecnus© , 2013
As tags de XML são:
parse : analisa dados XML
out : exibição de valores (para expressões do tipo XPath12)
set : atribui a uma variável o valor de uma expressão XPath
if : execução condicional (se)
forEach : repetição sobre os nós de um documento XML
choose : execução condicional junto com when e otherwise
transform : Aplica uma transformação XSL em um documento XML
param : define um parâmetro na folha de estilo XSLT
12XPath é uma linguagem de manipulação de nós em arquivos XML. Seus principais operadores são: / e //.
Veja mais sobre o assunto em: http://www.w3.org/TR/xpath/
13XSLT (eXtensible Stylesheet Language Transformation) permite transformar documentos XML em outros
documentos XML (como XHTML, por exemplo). Veja mais em: http://www.w3.org/TR/xslt
195
Grupo Multitecnus© ,

Continue navegando