JJAW
JJAW
JJAW
ELISAMARA DE OLIVEIRA
Professor autor/conteudista
EMÍLIO CELSO DE SOUZA
É vedada, terminantemente, a cópia do material didático sob qualquer
forma, o seu fornecimento para fotocópia ou gravação, para alunos
ou terceiros, bem como o seu fornecimento para divulgação em
locais públicos, telessalas ou qualquer outra forma de divulgação
pública, sob pena de responsabilização civil e criminal.
SUMÁRIO
Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1. WEB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1. O nascimento da www e da Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2. O Protocolo HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3. Servidores Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4. Aplicações Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.1. Módulo web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
1.4.2. Contexto de uma aplicação e o arquivo WEB.XML . . . . . . . . . . . . . .16
3. Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1. Definição de Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2. Localização das classes de um Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3. Criação de Servlets – Até a versão 2.5 (Java EE 5.0) . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4. Estrutura do Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.5. Métodos do ciclo de vida de um Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.6. Transferência de requisições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.7. Redirecionamento de Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.8. Anotações em Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.9. Considerações sobre mapeamento do Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.10. ServletConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.11. ServletContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4. Sessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1. Definição de gerenciamento de sessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.2. Modelo do controle de sessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.3. A classe HttpSession . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.4. Campos ocultos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.5. Reescrita de URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.6. Escopo de armazenamento de dados na memória do servidor . . . . . . . . . . . . . . . 49
6. Diretivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1. Diretiva page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7. Formulários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8. Definição de objetos implícitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
9. Declarações de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
11. Ações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
13. Bean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
14. Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
14.1. Atribuindo valores para as propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
14.2. Obtendo valores das propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
17. Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
17.1. Bibliotecas de tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
17.2. Biblioteca Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
17.3. Biblioteca Sql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
17.4. Biblioteca Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
17.5. Biblioteca XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
19. JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
19.1. A arquitetura MVC (Model–View–Controller) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
19.2. O MVC de JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
19.3. Exemplo de uma aplicação JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
19.4. Tags JSF Fundamentais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
19.5. Principais Tags HTML JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
20. Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
20.1. Anotações em beans gerenciáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
20.2. Escopos de beans gerenciáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Glossário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
INTRODUÇÃO
Iremos realizar a investigação de outra vertente importante do mundo Java: os conceitos de
Java web. Para tanto, torna-se imprescindível um bom conhecimento e domínio do que foi estudado
até a disciplina que trata do Java SE avançado.
Aqui, cliente é o browser e servidor é o local em que a aplicação está hospedada. Por exemplo,
suponha que você deseja acessar o site do banco no qual você mantém uma conta corrente. O
acesso é realizado a partir de um navegador através de uma interface gráfica desenhada, na sua
maior parte, por HTML. Essas informações são enviadas a um servidor, que as recebe e as processa,
gerando uma resposta que pode ser um extrato, um comprovante de pagamento, dentre outras.
Além dos conceitos da linguagem Java, o mecanismo de acesso ao banco de dados é fundamental
nesse contexto web. O banco de dados pode fazer parte do mesmo servidor em que a aplicação
web está hospedada, ou em outro servidor, exclusivo para os dados.
Uma grande quantidade de códigos nos exercícios será proposta, pois não se trata mais de
simples programas escritos em uma única classe, mas de diversas classes e códigos HTML,
interagindo entre si.
Pág. 6 de 130
1. WEB
Saiba Mais
ARPANET, em inglês ,de Advanced Research Projects Agency Network (ARPANET) do Departamento
de Defesa dos Estados Unidos, foi a primeira rede operacional de computadores à base de comutação
de pacotes, e o precursor da Internet foi criada só para fins militares.
A ARPANET ou ARPANet foi, pode-se dizer, a “mãe” da internet. Desenvolvida pela agência
Americana ARPA em 1969, tinha o objetivo de interligar as bases militares e os departamentos de
pesquisa do governo americano. Esta rede teve o seu berço dentro do Pentágono e foi batizada
com o nome de ARPANET No início da década de 1970, universidades e outras instituições que
faziam trabalhos relacionados com a defesa, tiveram permissão para se conectarem à ARPANet e
em meados de 1975 existiam aproximadamente 100 sites. Pesquisadores que trabalhavam
na ARPANet estudaram como o crescimento da rede alterou o modo como as pessoas a utilizavam.
No final dos anos 70, a ARPANet tinha crescido tanto que o seu protocolo de comutação de
pacotes original, chamado Network Control Protocol (NCP), tornou-se inadequado. Foi então que
a ARPANet começou a usar um novo protocolo chamado TCP/IP. Fonte: https://pt.wikipedia.org/wiki/
ARPANET
Do âmbito militar o projeto passou para o campo acadêmico com o objetivo de:
[...] coligar universidades para que fosse possível uma transmissão de dados de
forma mais eficaz, rápida e segura. No Brasil, a internet iniciou no final da década de
1980 quando no Laboratório Nacional de Computação Científica (LNCC), localizado
no Rio de Janeiro, conseguiu acesso à Bitnet, através de uma conexão de 9 600 bits
por segundo, estabelecida com a Universidade de Maryland (TOTALIZE, 2014).
Com o surgimento da WWW (World Wide Web) na década de 1990, a Internet avançou rapidamente
alcançando quase todos os países do planeta, disseminando e interligando informações e pessoas
por todo o mundo (MULLER, 2011).
Pág. 7 de 130
1.2. O Protocolo HTTP
Saiba Mais
HTTP - Hyper Text Transfer Protocol é um protocolo de comunicação utilizado para transferência de
páginas HTML do computador para a WWW na Internet. Por isso, os endereços dos websites (URLs)
utilizam no início a expressão “http://”, definindo o protocolo usado.
Esta informação é necessária para estabelecer a comunicação entre a URL e o servidor Web que
armazena os dados, enviando então a página HTML solicitada pelo usuário. Fonte: adpatado de
<http://www.significados.com.br/http/>.
• Baseado em Request-Response;
• Cliente abre conexão e envia request para o servidor;
• Cliente recebe response e fecha conexão;
• Comunicação sem estado (stateless);
• Para o servidor cada request é o primeiro request enviado pelo cliente;
• Cada recurso é identificado por um exclusivo Uniform Resource Identifier (URI);
• URL (Uniform Resource Locator) são URIs que especificam protocolos de Internet (HTTP,
FTP, mailto);
Fonte: http://www.wonko.info/ipt/sse/php/server-side.jpg
Pág. 8 de 130
Aconteceu
Coordenado pela World Wide Web Consortium e a Internet Engineering Task Force, culminou na
publicação de uma série de Requests for Comments; mais notavelmente o RFC 2616, de junho de
1999, que definiu o HTTP/1.1. Em junho de 2014 foram publicados 6 RFCs para maior clareza do
protocolo HTTP/1.1. Em março de 2015, foi divulgado o lançamento do HTTP/2. A atualização deixará
o navegador com um tempo de resposta melhor e mais seguro. Ele também melhorará a navegação
em smartphones. Fonte: https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol
A primeira linha de um HTTP request tem três partes, separadas por espaço:
• Nome do método;
• O path do recurso solicitado (URI);
• A versão do HTTP sendo utilizado.
Pág. 9 de 130
• Método OPTIONS: Por meio desse método, o cliente obtém as propriedades do servidor.
• Método DELETE: Informa por meio do URL o objeto a ser deletado.
• Método TRACE: Para enviar mensagem do tipo loopback para teste.
• Método PUT: Aceita criar ou modificar algum objeto do servidor.
• Método CONNECT: Comunicar com servidores Proxy. Os dois principais métodos do request
são GET e POST.
http://localhost:1234/hello/HelloServlet?userid=10&nome=Ze
Login jose
Senha 1234
Enviar <FORM action=”LoginServlet”>
Login<INPUT type=”text” name=”login”>
Senha<INPUT type=”text” name=”senha”>
<INPUT type=”submit” name=”enviar”>
</FORM>
Pág. 10 de 130
Figura 3 – Cabeçalho do método GET
Pág. 11 de 130
uma conexão, o servidor analisa os dados recebidos através da conexão, em busca de uma requisição
HTTP, e então processa a requisição e, por meio da mesma conexão, retorna o resultado.
O servidor (no nosso caso, o Tomcat ou o GlassFish) recebe informações do browser, processa
as informações e retorna uma resposta no formato HTML para o cliente (browser), como mostra
a figura 5.
Requisição (request)
Internet
Aplicacao
web
Cliente Servidor
http://www.sitequalquer.com/index.html
ou IP: 200.69.188.18
http://200.69.188.18/index.html Arquivo “index.html” na pasta web
Pág. 12 de 130
É comum, para fins de testes ou de desenvolvimento, executar um programa no servidor, sendo
o servidor o próprio computador cliente. Ou seja, não é necessário ter uma infraestrutura complexa
para testar uma aplicação, como mostra a figura 7.
http://200.69.188.18:8080/index.html Aplicacao
(internet) web
http://localhost:8080/index.html
IP: 20
Arquivo “inde
Browser Servidor
Atividade reflexiva
Reflita e discuta com seus colegas sobre a facilidade e os usos das máquinas virtuais para testes, já
que através delas é possível emular diversos ambientes e condições.
• Orientadas à apresentação: Páginas interativas contendo linguagens tais como HTML, XML,
DHTML, XHTML etc .
• Orientadas aos serviços: Acesso aos serviços externos, como os web services.
• Java Servlets;
• Páginas JSP;
• Web services.
Pág. 13 de 130
A iteração entre o cliente e o servidor ocorre de acordo com os passos descritos a seguir:
1
Web HttpServlet
2 4
Client HTTP
Request Web
Componentes
Request
3
5 Database
6
HttpServlet
Response Web
HTTP Componentes
Response
Database
Fonte: http://docs.oracle.com/javaee/6/tutorial/doc/geysj.html
• Servlets: São classes Java que processam requisições dinamicamente e constroem a resposta.
Recomendados para controlarem a camada de apresentação (controller) de aplicações
orientadas à apresentação e para implementar serviços em aplicações orientadas aos serviços
(web services são normalmente implementados como Servlets).
• Páginas JSP: Documentos texto que são executados como Servlets. Recomendadas para
páginas baseadas em HTML, WML, DHTML, Web Designers.
Pág. 14 de 130
Mesmo alguns frameworks, como JavaServer Faces ou Struts, são constituídos por Servlets.
Todos os componentes web devem estar dentro de um web container. Um web container fornece
serviços tais como:
Componentes Web (Servlets, JSPs) e componentes estáticos (imagens, arquivos) são chamados
de recursos web que devem ser empacotados dentro de um módulo web. Um módulo web é a menor
unidade que pode ser instalada (deployed) em um servidor web. Um módulo web corresponde a
uma aplicação web.
Um módulo web possui uma estrutura específica. O diretório inicial é a raiz da aplicação, em
que JSPs, applets, classes utilitárias e recursos estáticos (html, imagens) são armazenados.
Pág. 15 de 130
Figura 9 – Estrutura do módulo web
Assembly Root
WEB-INF
lib classes
Web pages
web.xml
glassfish-web.xml
(optional)
All server-side
.class files for this
web module
Library archive
files
Fonte: http://docs.oracle.com/javaee/6/tutorial/doc/bnadx.html
Se a sua aplicação não possui nenhum Servlet, filtro ou Listener, então não precisa de um
descritor web.xml. Um módulo web pode ser instalado (deployed) com um pacote WAR ou como
uma estrutura de diretórios e arquivos desempacotados.
Cada aplicação possui seu próprio contexto, que consiste em um espaço em memória e em
disco reservado para cada aplicação e uma área exclusiva para cada aplicação.
• No disco, o contexto recebe o nome da própria aplicação, o pacote .war ou o nome da pasta
inicial (root) da aplicação.
• Cada aplicação possui acesso somente ao seu próprio contexto.
• Dentro do contexto podem ser armazenados parâmetros e atributos visíveis por todos os
componentes, independenteemente de sessão de usuário.
• Um contexto é implementado pelo container através da interface javax.Servlet.ServletContext
Pág. 16 de 130
Figura 10 – Estrutura do módulo web – diretórios
nome-do-contexto
WEB-INF
classes
lib
web.xml
Fonte: elaborada pelo autor
Quando criamos um novo projeto web, de uma forma geral o nome do projeto representa o nome
do contexto, embora seja possível alterar esse nome.
O contexto é representado por um arquivo XML presente em uma pasta específica do servidor,
com as informações de localização da aplicação. Os passos para definição do contexto são:
Exemplo:
Pág. 17 de 130
O acesso a um arquivo (HTML, JSP etc.) localizado no nosso novo contexto é acessado, então,
da seguinte forma:
Arquivo: início.jsp
Pasta: C:\Aplicacao\web
Contexto: app
http://localhost:8080/app/início.jsp
Existe um arquivo web.xml para cada contexto definido para as aplicações. Este arquivo é
chamado de descritor de implantação do aplicativo Web e deve estar na pasta WEB-INF.
No exemplo da estrutura de pasta anterior, o arquivo servirá para as páginas JSP usadas na
aplicação e para as classes referentes aos Servlets.
Atenção: Caso contenha algum erro de descrição do XML a aplicação não será iniciada.
Esse arquivo era obrigatório para uma aplicação web até a versão 2.5 do Servlet. A partir do
Servlet 3.0 (JEE 6.0), a maior parte das configurações dispensa o uso desse arquivo.
<context-param>
<param-name>qtd</param-name>
<param-value>1</param-value>
</context-param>
Pág. 18 de 130
Quadro 5 - Configuração de um parâmetro de Servlet
<Servlet>
<Servlet-name>Cadastrar</Servlet-name>
<Servlet-class>com.ead.Servlet.Cadastrar</Servlet-class>
<init-param>
<param-name>tipo</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</Servlet>
<Servlet-mapping>
<Servlet-name>Cadastrar</Servlet-name>
<url-pattern>/Cadastrar</url-pattern>
</Servlet-mapping>
<session-config>
<session-timeout>60</session-timeout >
</session-config>
<error-page>
<error-code>404</error-code>
<location>/erro.jsp</ location>
</error-page >
Quadro 9 - Configuração da página inicial de uma aplicação (as páginas serão chamadas automaticamente ao
chamar o contexto)
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
Pág. 19 de 130
No material complementar a tabela 1 apresenta uma breve descrição das principais tags usadas
no arquivo web.xml.
A tabela 2 traz os principais códigos de erro usados como conteúdo de <error-code> (elemento
filho de <error-page>).
Pág. 20 de 130
2. CONFIGURANDO SERVIDOR, CRIANDO PROJETO, CRIANDO E
EXECUTANDO UM SERVLET
Fonte: https://tomcat.apache.org/
Clicando na opção Tomcat 7.0 chegamos às opções de download, conforme mostrado na figura
12. Escolher a opção “zip” indicada.
Pág. 21 de 130
Figura 12 - Opções de download do Tomcat
Fonte: http://tomcat.apache.org/download-70.cgi
Esse arquivo deve ser descompactado em uma pasta de sua preferência. Nesta disciplina
usaremos a pasta C:\Servidor como local para o servidor. Vamos descompactar o arquivo apache-
tomcat-7.0.42.zip nesta pasta, resultando em C:\Servidor\apache-tomcat-7.0.42.
Pág. 22 de 130
Ao selecionar esta opção, seguimos os passos descritos a seguir. É importante ficar atento aos
passos a fim de evitar falhas no projeto.
Na figura 14, temos as opções do projeto, em que informamos um nome para ele e, em seguida,
selecionamos o servidor de aplicações clicando no botão “New Runtime...”.
Pág. 23 de 130
Clicando no botão “New Runtime...” abrimos a janela para seleção do servidor, conforme
mostrado na Figura 14. Como estamos trabalhando com a versão 7.0 do Tomcat, selecionamos a
opção indicada na figura 15 para que o Eclipse reúna as configurações adequadas para essa versão.
Clicando em “Next” obtemos uma nova janela na qual indicamos a pasta de instalação do Tomcat
e a versão do JRE. A figura 16 mostra essas informações devidamente configuradas.
Pág. 24 de 130
Figura 16 - Configuração do servidor
Ao finalizar esta configuração devemos selecionar a versão do módulo web. Módulo web está
relacionado à versão do Servlet a ser utilizada no projeto. Para os componentes que necessitam
de configurações fora do Servlet, este arquivo ainda se faz necessário. Por isso, vamos mantê-lo
no projeto. A figura 17 mostra a seleção da versão, e para este exemplo manteremos a versão 3.0.
Pág. 25 de 130
Figura 17 - Seleção da versão do módulo web
Clicamos em Next até chegarmos à configuração mostrada na figura 18. Nesta tela
marcamos a opção “Generate web.xml deployment descriptor”. Depois clique em Finish e
nosso projeto está pronto.
Pág. 26 de 130
Figura 18 - Procedimento para criação de um projeto Java Web
1. Clique com o botão direito do mouse sobre o projeto, e selecione Servlet (Figura 19):
Pág. 27 de 130
2. Forneça o pacote e o nome da classe conforme indicado na figura 20:
Pág. 28 de 130
3. No próximo passo defina o nome para o Servlet (não precisa ser o mesmo nome que a classe).
Defina o mapeamento (url pattern) como “/exemplo”. Para alterar o nome do mapeamento,
selecione-o na janela e clique em “Edit...” (vide Figura 21):
Pág. 29 de 130
4. Clique em “Finish”. Observe que o Eclipse cria uma nova classe chamada ServletExemplo.
Nesta classe existem diversos comentários. Para tornar o código mais limpo, vamos remover
estes comentários, deixando a classe da forma mostrada na figura 22:
Pág. 30 de 130
5. Observe que a classe foi criada com dois métodos: doGet() e doPost(). Escreva o código
indicado na figura 23 no método doGet() (os detalhes serão apresentados em módulos
posteriores):
Pág. 31 de 130
7. Aceite as opções seguintes. Você verá o resultado da aplicação no browser embutido no
Eclipse, conforme figura 25:
8. Para visualizar o resultado no seu browser preferido, altere a opção no menu Window,
conforme indicado na figura 26:
Pratique o que você aprendeu até agora com os exercícios no arquivo anexo!
Pág. 32 de 130
3. SERVLETS
Servlets não possuem interface gráfica e suas instâncias são executadas dentro de um ambiente
Java denominado container. Isso significa que elas evitam todos os problemas de portabilidade
associados às diferentes interfaces de exibição.
O container gerencia as instâncias dos Servlets e provê os serviços de rede necessários para
as requisições e respostas. O container atua em associação com servidores Web recebendo as
requisições reencaminhada por eles.
Tipicamente existe apenas uma instância de cada Servlet, no entanto, o container pode criar
vários Servlets (múltiplas linhas de execução), como mostra a figura 27.
Request
cliente web Thread
Request Thread
cliente web
Thread Servlet
Request
cliente web
Thread
Request
cliente web
Depois de executado, um Servlet em geral residirá na memória do servidor. Isso evita a sobrecarga
da construção de um novo processo de Servlet para cada acesso, economiza memória e torna
Pág. 33 de 130
o acesso à página eficiente. Como os Servlets permanecem na memória, eles podem manter
referências a outros objetos Java.
Por exemplo, se seu servidor de banco de dados contém licenças de conexão simultânea
suficientes, uma conexão a banco de dados pode ser compartilhada entre as linhas de execução,
reduzindo assim a sobrecarga associada ao estabelecimento e manutenção da conexão. O esquema
de execução de um Servlet está ilustrado na figura 28:
Solicitação
browser Servidor HTTP
Contêiner SERVLET
SERVLET
Documento HTML
Resposta
Pág. 34 de 130
3.3. Criação de Servlets – Até a versão 2.5 (Java EE 5.0)
Quando o Servlet estava na versão 2.5, correspondendo ao JEE 5, o Servlet usava o arquivo de
configurações web.xml para definir suas configurações. O quadro 11 apresenta a classe que define
um Servlet.
package com.Servlet;
import java.io.IOException;
import javax.Servlet.ServletException;
import javax.Servlet.http.HttpServlet;
import javax.Servlet.http.HttpServletRequest;
import javax.Servlet.http.HttpServletResponse;
public class ServletExemplo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
}
Pág. 35 de 130
O Quadro 12 apresenta o Deployment Descriptor (web.xml).
Pág. 36 de 130
doXXX() depende do método HTTP, conforme o esquema:
GET doGet()
POST doPost()
HTTP request
Servlet
service(ServletRequest req. ServletResponse resp)
GenericServlet
service(ServletRequest req. ServletResponse resp)
HttpServlet
service(HttpServletRequest req. ServletResponse resp)
MeuServlet
doGet(...) doPost...)
O ciclo de vida de um Servlet é controlado pelo container. A classe HttpServlet fornece métodos
para controle do ciclo de vida do Servlet pelo container, como:
• init()
• destroy()
• service()
Pág. 37 de 130
Se o método service() for sobrescrito, os métodos doXXX() não serão chamados.
Request
Crie uma
instância do Localiza
servlet instância já
Container
inicializada
Chama
método init()
Chama
método
service()
Todos os métodos doXXX() recebem dois parâmetros, ambos criados pelo container e passados
para o Servlet como argumentos:
• HttpServletRequest: Define um objeto que fornece informações do request HTTP para o Servlet.
Provê dados, tais como parâmetros e valores enviados pelo browser, atributos e streams de
entrada, informações sobre o protocolo, endereço IP do cliente etc. Ele estende a interface
ServletRequest.
• HttpServletResponse: Define um objeto que permite ao Servlet enviar resposta ao cliente web.
Permite definir atributos no header HTTP e criar cookies. Ele estende a interface ServletResponse.
Pág. 38 de 130
3.6. Transferência de requisições
O Servlet pode receber uma requisição e transferir seu conteúdo para outro componente,
mantendo a execução (o controle) na Servlet atual. Este processo é usado normalmente quando
se deseja incluir e/ou remover atributos na requisição e transferi-la para outro recurso utilizá-la. O
mecanismo de transferência pode ocorrer de duas formas:
Servlet A
Servlet B
request.getRequestDispatcher(”ServletB”).forward(req,resp)
CLIENTE WEB
Servlet A Servlet B
request.getRequestDispatcher(”ServletB”).include(req,resp)
CLIENTE WEB
response.sendRedirect(“cadastro”);
Pág. 39 de 130
3.8. Anotações em Servlets
A versão 3.0 do Servlet corresponde ao Java EE 6.0 e incluiu algumas funcionalidades, além de
dispensar o uso do arquivo de configurações web.xml.
package com.Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.Servlet.ServletException;
import javax.Servlet.annotation.WebServlet;
import javax.Servlet.annotation.WebInitParam;
import javax.Servlet.http.HttpServlet;
import javax.Servlet.http.HttpServletRequest;
import javax.Servlet.http.HttpServletResponse;
@WebServlet(name=”ServletLogin”,urlPatterns = {“/login”}, initParams =
{
@WebInitParam(name = “usuario”, value = “admin”),
@WebInitParam(name = “senha”, value = “admin”)})
public class ServletLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
}
Pág. 40 de 130
Quadro 14 - Configuração equivalente na versão 2.5 do Servlet
<Servlet>
<Servlet-name>ServletLogin</Servlet-name>
<Servlet-class>com.Servlet.ServletLogin</Servlet-class>
<init-param>
<param-name>usuario</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>senha</param-name>
<param-value>admin</param-value>
</init-param>
</Servlet>
<Servlet-mapping>
<Servlet-name>ServletLogin</Servlet-name>
<url-pattern>/login</url-pattern>
</Servlet-mapping>
Consulte a tabela 5 do material complementar para ver a tabela com os atributos de @WebServlet.
Na tabela 6 do material complementar está a lista de atributos da anotação @WebInitParam. Na
tabela 7 do material complementar temos a lista de atributos da anotação @WebFilter.
Pág. 41 de 130
• Servlet Request Attribute Listener (javax.Servlet.ServletRequestAttributeListener)
• Http Session Listener (javax.Servlet.http.HttpSessionListener)
• Http Session Attribute Listener (javax.Servlet.http.HttpSessionAttributeListener)
• programa.do
• cadastro.do
• login.do
• etc.do
Ou seja, qualquer expressão pode ser usada, desde que tenha o termo “.do” anexado ao final.
Esse mecanismo é útil para Servlets que centralizam requisições e geram respostas adequadas
para cada uma destas requisições. Frameworks (JSF, por exemplo) utilizam esta abordagem.
3.10. ServletConfig
No ciclo de vida do Servlet, o método init() recebe como parâmetro uma referência ServletConfig,
fornecida pelo container. É a partir desta referência que são obtidos os valores de configuração do
Servlet, incluindo os parâmetros de inicialização.
Pág. 42 de 130
Quadro 15 - Método doGet() obtendo parâmetros de inicialização
3.11. ServletContext
Permite o acesso às configurações do contexto, ou seja, da aplicação. Ele é criado no momento
em que o servidor de aplicações é iniciado. Alguns métodos de ServletContext são:
Pág. 43 de 130
Quadro 16 - Configuração de parâmetro de inicialização de um contexto
<context-param>
<param-name>aplicacao</param-name>
<param-value>Contas a pagar</param-value>
</context-param>
Pág. 44 de 130
4. SESSÃO
1 HTTP Request
Se uma nova requisição é realizada, esta não possui nenhuma informação a respeito da requisição
anterior. Sendo assim, dizemos que uma requisição HTTP é por padrão stateless (não mantém
o estado entre requisições). No entanto, o servidor gera um número de identificação para cada
requisição realizada, e essa identificação é única para cada cliente.
Aplicações web, por natureza, diferentemente de aplicações desktop, não possuem uma “instância”,
portanto não possuem um espaço de memória onde se podem guardar variáveis que serão usadas
durante a execução do processo, no caso de uma visita a uma aplicação web durante uma sessão.
Muitas vezes é necessário preservar em memória uma informação sensível que não poderia ser
postada e uma reposta sem oferecer riscos, como o login e senha do usuário. Estes casos requerem
Pág. 45 de 130
que a informação seja preservada durante toda a visita do usuário ao site, entre as chamadas a
diversas páginas dele.
O container Java oferece um sistema robusto e sofisticado de controle de sessão, que permite
armazenar praticamente qualquer tipo de objeto na memória do servidor, preservando o seu valor
durante um limite de tempo que é renovado a cada requisição.
A cada requisição de página emitida pelo mesmo usuário através da mesma conexão e do
mesmo navegador (situação esperada na navegação normal em um site), o tempo de vida da sessão
é renovado e os valores armazenados são mantidos. Após o limite de tempo ter se esgotado, o
servidor descarta as informações de sessão, para preservar seus recursos.
Clientes Servidor
Sessão
Sessão
Sessão
Sessão
Pág. 46 de 130
Figura 34 - Transferência da sessão para o cliente
Clientes Servidor
Sessão
Sessão
Sessão
Sessão
O servidor fornece um identificador para a sessão (ID da sessão) que é enviada para o cliente.
Na próxima vez que o mesmo cliente realizar outra requisição, o ID é lido e enviado juntamente com
a requisição, de forma que o servidor reconhece o usuário. Assim, a cada requisição, a informação
desejada é transferida para o servidor e, então, é enviada de volta para o cliente.
O container cria um objeto HttpSession para um usuário quando ele inicia a aplicação. Há um
HttpSession para cada usuário ativo.
Se o usuário não executar nenhuma ação por um determinado período de tempo, o servidor
assume que o usuário está inativo e invalida a sessão por timeout. O tempo de permanência da
sessão é configurável, tanto no deployment descriptor como de forma programática.
Dentro da sessão podem ser armazenados parâmetros e atributos que são visíveis somente
dentro uma sessão de usuário, como pode ser visto na figura 35.
Pág. 47 de 130
Figura 35 – Escopos do contexto da sessão e do contexto
Por padrão, a sessão é armazenada no cliente através de cookies. É possível que os cookies
estejam desabilitados no cliente. Neste caso, a sessão pode ser armazenada em campos ocultos
ou através do mecanismo de reescrita de URL.
A desvantagem é que ele só funciona para uma sequência de formulários gerados dinamicamente,
e a técnica falha se houver um erro antes que os dados sejam permanentemente armazenados em
algum lugar.
Pág. 48 de 130
4.5. Reescrita de URL
Nem todos os navegadores suportam cookies e, mesmo que suportem, podem estar configurados
para não armazenarem-nos. Para contornar este problema, o Servlet pode ser configurado para
usar reescrita de URL, como alternativa de controlar sessão.
Por exemplo:
http://localhost:8080/execicio02/JSPPage;jsessionid=30F76DE281982B57B4BEFC2434B6F5E
• requisição (request);
• sessão (session);
• contexto (application).
Cada um tendo seus benefícios, aplicações e vantagens. A figura 36 ilustra estes três componentes
no servidor.
Pág. 49 de 130
Figura 36 - Web container com os objetos Request, Session e Context
Servidor Web
Aplicação web
ServlentContext
Clientes Web HttpServletRequest HttpSession
Na tabela 9 que está nos materiais complementares apresentaremos o tempo de vida para
casa situação.
Pratique o que você aprendeu até agora com os exercícios no arquivo anexo!
Pág. 50 de 130
5. JAVA SERVER PAGES (JSP)
Assim sendo, a arquitetura geral das páginas JSP tem muito em comum com os Servlets, tendo
em vista que a especificação JSP é definida como uma extensão da API Servlet. Além das classes e
interfaces para programar Servlets (pacotes javax.Servlet e javax.Servlet.http), as classes e interfaces
específicas à programação de Java Server Pages encontram-se nos pacotes javax.Servlet.
Quando um servidor compatível com JSP recebe a primeira solicitação para uma JSP, o container
de JSP traduz essa JSP em um Servlet Java que trata a solicitação atual e as solicitações futuras
para a JSP. Se houver algum erro na compilação do novo Servlet, esses erros resultam em erros
em tempo de tradução.
Alguns containers de JSP traduzem as JSPs para Servlets em tempo de instalação. Isso elimina
o overhead de tradução para o primeiro cliente que solicita cada JSP
Pág. 51 de 130
• Utilização de código Java: é possível utilizar os chamados scriplets, que são trechos de código
Java puro, inseridos dentro da página JSP, tendo assim as vantagens tanto da Orientação a
Objetos quanto de Java.
• As diretivas são mensagens para o container de JSP que permite ao programador especificar
as configurações de uma página, incluir conteúdo a partir de outros recursos e especificar
bibliotecas de marcas personalizadas para utilização em uma JSP.
• As ações encapsulam funcionalidades em marcas predefinidas que os programadores podem
incorporar a uma JSP. As ações são frequentemente realizadas com base nas informações
enviadas ao servidor como parte de uma solicitação feita pelo cliente. Eles também podem
criar objetos Java para a utilização em scriptlets JSP.
• Os scriptlets permitem inserir código Java que interaja com os componentes em uma JSP
(e, possivelmente, outros componentes de aplicativos web) para realizar processamento de
solicitações.
Durante o processamento de uma requisição, várias páginas JSP podem estar envolvidas.
Diversos objetos podem ser criados, tanto usando diretivas JSP, como por ações definidas na página
JSP ou ainda por trechos de código Java embutidos na página JSP.
Qualquer objeto criado pode ser associado com um atributo de escopo, que define onde existe
uma referência ao objeto e quando a referência é removida. Assim sendo, temos seguintes atributos:
Pág. 52 de 130
6. DIRETIVAS
As diretivas são elementos da página que não dependem de quaisquer solicitações, e funcionam
como um pré-processamento para a página. A sintaxe básica de uma diretiva é:
As diretivas são:
Exemplos:
Pág. 53 de 130
7. FORMULÁRIOS
Um formulário consiste em um ou mais campos de entrada de dados, descritos pela tag <input>,
em que o atributo type permite a criação de campos de texto, senhas, caixa e lista de seleção,
menus, botão de opção, entre outros. A forma geral é:
Formulários são usados para enviar dados pela web. Sozinhos, formulários são inúteis, eles
devem estar vinculados a um programa que irá processar seus dados. Esses programas podem
ser elaborados em diversas linguagens, incluindo o ASP.Net.
• form: define o formulário. Dentro desse elemento existe um atributo obrigatório, o action, que
diz o endereço do programa para onde os dados do formulário serão enviados.
• O atributo opcional method diz a forma em que o formulário será enviado, e pode ter o valor
get (que é o default) ou post. Frequentemente usa-se post que esconde a informação (get
manda a informação através da URL).
Geralmente os elementos de um formulário são inseridos com a tag <input .. > e o tipo do
elemento. A tabela 11 do material complementar apresenta uma lista com o conjunto de elementos
usados em um formulário.
Pág. 54 de 130
8. DEFINIÇÃO DE OBJETOS IMPLÍCITOS
É possível criar, dentro de scriptlets na página JSP, instâncias de uma classe Java e manipulá-
las a fim de produzir um conteúdo dinâmico. Por exemplo, podemos criar um objeto de uma classe
que acessa uma base de dados e então usar métodos desse objeto para exibir na página uma
consulta ou transação com a base de dados. Ou seja, através da manipulação desse objeto, quer seja
acessando seus métodos e suas variáveis, podemos gerar conteúdo dinâmico para a página JSP.
Além de objetos como esses, que estão completamente sob o controle do programador, o
container JSP se encarrega de instanciar automaticamente, durante a execução de uma página
JSP, alguns objetos. Tais objetos podem ser usados dentro da página JSP e são conhecidos como
objetos implícitos. Assim como todo objeto em Java, cada objeto implícito é uma instância de uma
classe ou interface e segue uma API correspondente.
Pág. 55 de 130
9. DECLARAÇÕES DE VARIÁVEIS
Um conjunto de variáveis pode ser declarado separadamente em uma página, desde que estejam
contidas nas tags:
Exemplo:
<%!
int idade;
double salario;
String endereco;
%>
Pág. 56 de 130
10. EXPRESSÕES OU SCRIPTLETS
São mais largamente usadas em páginas JSP. Todo código JSP deve ser escrito dentro das tags.
Exemplos:
<%
String nome = request.getParameter(“txtNome”);
int codigo = request.getParameter(“txtCodigo”);
%>
<%
if (idade < 18) {
out.println(“<b>Você é menor de idade</b>”);
}
%>
<%
if (idade < 18) {
%>
<b>Você é menor de idade</b>
<%
}
%>
Pág. 57 de 130
11. AÇÕES
São informações empregadas na fase de execução. Elas podem ser separadas em dois grupos:
1. Ações padrões
2. Ações personalizadas
As ações padrão são definidas pela especificação JSP e, as personalizadas, em tags personalizadas.
Ambas empregam a sintaxe XML.
Exemplo:
Suponha que se queira incluir na página atual, a página chamada DadosPessoais.jsp com o
conteúdo:
<%
String código = request.getParameter(“txtCodigo”);
String nome = request.getParameter(“txtNome”);
String email = request.getParameter(“txtEmail”);
%>
<jsp:include page=”DadosPessoais.jsp”>
<jsp:param name=”txtCodigo” value = “100” />
<jsp:param name=”txtNome” value = “João” />
<jsp:param name=”txtEmail” value = “joão@ninguem.com” />
</jsp:include>
Observe o fechamento das tags. No caso da tag include, houve uma linha para fechamento, com
um conteúdo entre a abertura e o fechamento. Neste caso a tag é chamada de tag com conteúdo
não vazio ou de corpo não vazio.
No caso da tag jsp:param, o fechamento ocorreu na mesma linha. Esta tag é chamada de , ou
sem conteúdo.
Pág. 58 de 130
12. PASSANDO PARÂMETROS PARA UMA PÁGINA JSP VIA URL
Normalmente uma página JSP recebe os dados de um formulário. É possível executar uma
página JSP sem a necessidade de um formulário.
<%
String código = request.getParameter(“txtCodigo”);
String nome = request.getParameter(“txtNome”);
String email = request.getParameter(“txtEmail”);
%>
http://localhost:8080/Cadastro.jsp?txtCodigo=10&txtNome=João&txtEmail=joao@ninguem.com.br
Pág. 59 de 130
• Exemplo 1: envio de dados usando o método GET. Assumindo que o programa a seguir se
chame arquivo.jsp e que faça parte de um contexto chamado arquivos, seu acesso é realizado
através da seguinte url:
http://localhost:8080/arquivos/arquivo.jsp?txtNome=Carlos&txtIdade=10&txtSalario=1000
Pág. 60 de 130
• Exemplo 2: No exemplo a seguir, não é necessário informar nenhum parâmetro: o programa,
chamado abreArquivo.jsp, se encarrega de abrir o arquivo e exibir seus dados no browser:
Neste caso é conveniente ter um formulário HTML para realizar o envio, como:
Pág. 61 de 130
Quadro 18 – Código de leitura do formulário
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html;
charset=iso-8859-1” />
<title>Untitled Document</title>
</head>
<body bgcolor=”#FFCC99”>
<form method=”post” action=”arquivo.jsp”>
<table width=”425” border=”0”>
<tr>
<td width=”83”>Nome:</td>
<td width=”332”>
<input name=”txtNome” type=”text” id=”txtNome”
size=40/>
</td>
</tr>
<tr>
<td>Idade:</td>
<td>
<input name=”txtIdade” type=”text” id=”txtIdade”
/>
</td>
</tr>
<tr>
<td>Salário:</td>
<td>
<input name=”txtSalario” type=”text”
id=”txtSalario” />
</td>
</tr>
<tr>
<td colspan=”2”>
<input name=”btnEnviar” type=”submit”
id=”btnEnviar” value=”Enviar” />
<input name=”btnLimpar” type=”reset”
id=”btnLimpar” value=”Limpar” />
</td>
</tr>
</table>
</form>
</body>
</html>
Pág. 62 de 130
13. BEAN
JavaBeans consiste em uma tecnologia que permite escrever componentes Java acessíveis
como propriedades. São necessárias classes Java para que funcionem corretamente e estas
classes devem:
JavaBeans são, portanto, classes Java que encapsulam informações a serem executadas em
páginas JSP.
Um objeto instanciado a partir destas classes é chamado de bean. Veja o exemplo a seguir.
Classe Java:
package com.javabeans;
import java.io.Serializable;
public class Pessoa implements Serializable{
private String nome;
private int idade;
private char sexo;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public char getSexo() {
return sexo;
}
public void setSexo(char sexo) {
this.sexo = sexo;
}
}
Pág. 63 de 130
Nesta classe, cada par setter / getter representa no JSP, uma propriedade, cujo nome é obtido
removendo-se o prefixo set e/ou get, e passando a primeira letra para minúsculo.
A utilização desta propriedade requer que uma instância da classe seja criada, mas a nomenclatura
JavaBeans não utiliza código Java. Os elementos usados na página JSP que manipulam beans são:
<jsp:useBean >
<jsp:setProperty >
<jsp:getProperty >
Pág. 64 de 130
14. VALORES
A segunda forma é usando o objeto implícito param através de “Expression Language (EL)”:
Pág. 65 de 130
15. DEFINIÇÃO DE JSTL
JSTL é uma API Java que contém um conjunto de tags agrupadas de acordo com sua aplicabilidade.
O objetivo é simplificar o desenvolvimento de páginas JSP, eliminando boa parte de código escrito
em scriptlets.
A JSTL encapsulou, em tags simples, toda a funcionalidade que diversas páginas web
precisam, como controle de laços (for), comandos de decisão (if .. else), manipulação de dados
xml, internacionalização da aplicação, além de acesso e manipulação de bancos de dados.
Na data da elaboração deste material, a API JSTL foi obtida em: https://mvnrepository.com/artifact/
javax.servlet.jsp.jstl/javax.servlet.jsp.jstl-api/1.2.2
Pág. 66 de 130
16. EXPRESSION LANGUAGE (EL)
JSTL faz uso extensivo de Expression Language (EL). EL representa um conjunto de operadores
e objetos implícitos, semelhantes àqueles definidos no JSP, mas com o objetivo de tornar possível
o uso do JSTL.
Por padrão ${algumaCoisa} procura por uma variável com o nome algumaCoisa em algum dos
escopos, porém podemos deixar explícito o escopo usando um nome de variável que representa
cada um dos escopos.
Cada uma dessas variáveis representa um objeto Java. EL também possui operadores aritméticos,
relacionais e lógicos. A tabela 15 do conteúdo complementar mostra quais são estes operadores
e como usá-los.
Pág. 67 de 130
17. BIBLIOTECAS
• <c:out>
• <c:set>
• <c:remove>
• <c:catch>
• <c:if>
• <c:choose>
• <c:forEach>
• <c:forTokens>
• <c:param>
• <c:url>
• <c:import>
• <c:redirect>
• <c:when>
Pág. 68 de 130
<c:out>
Atributos:
Utilização:
Para utilizar tags da biblioteca Core nas páginas JSP é necessário inserir no cabeçalho:
Exemplos de aplicação:
<c:set>
Atributos:
Pág. 69 de 130
Apresentando o conteúdo da variável:
<c:out value=“${nome}”/>
<c:remove>
Observe as instruções a seguir:
A variável idade, primeiro foi criada, apresentada, e depois, removida do escopo através da tag
<c:remove>. O texto no corpo de <c:out > ... </c:out> é apresentado porque a variável não tem valor
default nem existe mais.
<c:catch>
Atributos:
<c:catch var=“erro”>
<c:set target=“${usuario}” property=“SeuNome” value=“Zé”/>
</c:catch>
Pág. 70 de 130
Exceção gerada:
<c:out value=“${erro}”>Nenhuma</c:out>
<c:if>
Atributos:
Ou:
Atributos:
Pág. 71 de 130
<c:choose>
<c:when test=“${usuario == ‘Vivaneide Rocha’}”>
Usuário cadastrado!
</c:when>
<c:otherwise>
Usuário não cadastrado!
</c:otherwise>
</c:choose>
<c:forEach>
Executa o corpo da tag várias vezes.
Atributos:
Pág. 72 de 130
<c:forTokens>
Interage com os símbolos de uma string:
Atributos:
1
nome
2
idade
<c:url>
Cria uma string representando uma URL.
Atributos:
var variável (opcional – caso omitido, a URL será impressa na página) que receberá a url
Pág. 73 de 130
Apresenta o resultado de uma estrutura de repetição:
resultado.jsp?txtNome=Felipe&txtEmail=felipe%40felipe
Aqui convém relembrar que os dados para um formulário podem ser enviados através da barra
de endereços do browser. Por exemplo, seja o arquivo chamado recebe.jsp, que contém os campos
nome e idade a serem preenchidos:
<%
String nome = request.getParameter(“txtNome”);
String email = request.getParameter(“txtEmail”);
...
%>
recebe.jsp?txtNome=Felipe&txtEmail=felipe%40felipe
• <sql:query>
• <sql:update>
• <sql:transaction>
• <sql:param>
• <sql:setDataSource>
Pág. 74 de 130
<sql:setDataSource>
Define um DataSource e o exporta como variável de escopo ou DataSource padrão
Atributos:
<sql:update>
Executa instruções SQL do tipo INSERT, UPDATE e DELETE.
Atributos:
Exemplo:
<sql:setDataSource
var=”dataSource” driver=”sun.jdbc.odbc.JdbcOdbcDriver”
url=”jdbc:odbc:Driver={Microsoft Access Driver
(*.mdb)};dbq=C:/jstl.mdb”
scope=”session” />
<sql:update dataSource=”${dataSource}”>
INSERT INTO CLIENTES VALUES (5,’USER’)
</sql:update>
Pág. 75 de 130
<sql:query>
Executa uma instrução SELECT.
Atributos:
Exemplo:
<sql:setDataSource
var=”dataSource” driver=”sun.jdbc.odbc.JdbcOdbcDriver”
url=”jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};dbq=C:/
jstl.mdb”
scope=”session” />
<sql:query var = “users” dataSource=”${dataSource}”>
select ID, NOME from CLIENTES
</sql:query>
<table border=1>
<c:forEach var=”row” itens=”${users.rows}”>
<tr>
<td><c:out value=”${row.ID}”/></td>
<td><c:out value=”${row.NOME}”/></td>
</tr>
</c:forEach>
</table>
<sql:param>
Atribui o valor para um parâmetro “?” numa query
Atributos:
Pág. 76 de 130
Exemplo:
<sql:update dataSource=”${dataSource}”>
UPDATE CLIENTES SET NOME=’CARLOS’ WHERE ID=?
<sql:param value=”${param.cod}” />
</sql:update>
<sql:transaction>
Define um contexto transacional dentro do qual <> e <> serão utilizados.
Atributos:
Exemplo:
<sql:transaction>
<sql:update>UPDATE CLIENTES set NOME=? where ID=?
<sql:param value=”${vnome}” />
<sql:param value=”${vID}” />
</sql:update>
</sql:transaction>
1. Formatação de datas.
2. Formatação de números.
3. Formatação de horas.
4. Formatos customizáveis.
• <fmt:formatNumber>
• <fmt:parseNumber>
• <fmt:formatDate>
• <fmt:timeZone>
• <fmt:parseDate>
Pág. 77 de 130
<fmt:formatNumber>
Atributos:
Exemplos:
Saída: R$ 9.876.543,21
Saída: 12,300
Saída: 123.456,79
Pág. 78 de 130
<fmt:parseNumber>
Atributos:
Exemplo:
Saída: 5
<fmt:formatDate>
Atributos:
Exemplo:
Pág. 79 de 130
Saída:
18 de Agosto de 2006
18.08.06
<fmt:parseDate>
Atributos:
Exemplo:
Saída:
Pág. 80 de 130
3. Fluxo condicional.
4. Iterações.
5. Transformações.
• <x:parse>
• <x:out>
• <x:set>
• <x:if>
<x:parse>
Faz o parsing de um documento XML
Atributos:
Exemplo:
<x:out>
Avalia uma expressão XPath e imprime o resultado na página.
Atributos:
Exemplo:
Pág. 81 de 130
<x:set>
Avalia uma expressão XPath e atribui o resultado a uma variável de escopo.
Atributos:
Exemplo:
<x:if>
Executa o corpo da tag caso uma expressão XPath seja avaliada em verdadeiro.
Atributos:
Exemplo:
Pratique o que você aprendeu até agora com os exercícios no arquivo anexo!
Pág. 82 de 130
18. DEFINIÇÃO DE JSF E FRAMEWORK
A tecnologia JavaServer Faces (JSF) é constituída de um framework para desenvolvimento de
aplicações web, executada em um servidor Java e que retorna ao cliente uma interface gráfica.
Um framework é uma aplicação “quase” completa, com partes faltantes. Essas partes são
justamente as implementações peculiares de cada problema. Apresenta as características:
A B A B
F
C
C
Impossível criar um framework F = Domínio do
A, B e C = Implementações específicas framework
Pág. 83 de 130
A API JSF providencia justamente a parte comum às aplicações, ou seja, o domínio do framework.
O desenvolvedor é o responsável pelas partes complementares ou aplicações específicas.
Pág. 84 de 130
19. JSF
MVC é usado em padrões de projeto de software, mas o MVC abrange mais da arquitetura de
uma aplicação do que é típico para um padrão de projeto. Cada um dos elementos da arquitetura
MVC é descrito a seguir:
• View: Refere-se à parte visual da aplicação como definida pela camada Model. É a parte do
sistema que interage com o usuário.
• Controller: Responsável pelo processamento das informações, como a manipulação de eventos
e execução de propriedades.
1
Request
Browser JPS page Data
4
Response store
3 Business
Java bean
logic
Fonte: <https://www.ibm.com/support/knowledgecenter/SSRTLW_9.1.1/com.ibm.etools.struts.doc/images/cstrdoc001.gif>.
Pág. 85 de 130
Figura 40 - Arquitetura MVC Model 2
(Controller)
1 Servlet Data
Request store
Browser
In
st
an 2
3 tia
te
(Model)
Java bean
5
(View) Business
Response
JSP page 4 logic
Some text
View Acessa
Páginas XHTML
Pág. 86 de 130
19.3. Exemplo de uma aplicação JSF
Para melhor compreender o uso do JSF, caro aluno, vamos mostrar uma aplicação de exemplo
com o objetivo de ilustrar o uso das tags JSF, das classes que representam os beans e da regra
de navegação.
O JSF 2.x utiliza Facelets desenvolvidos em XHTML, diferentemente das versões anteriores do
JSF que adotavam JSP como suas páginas que renderizam a visualização.
sucesso.xhtml
index.xhtml
erro.xhtml
Esse exemplo representa uma simulação de login. A página index.xhtml é a página em que o
usuário fornece seus dados de usuário e senha. Se estiver correto, ele é direcionado para sucesso.
xhtml e, caso contrário, direcionado para erro.xhtml.
Pág. 87 de 130
Quadro 20 – arquivo index.xhtml
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:h=”http://java.sun.com/jsf/html”
xmlns:f=”http://java.sun.com/jsf/core”>
<h:head>
<title>Login</title>
</h:head>
<h:body>
<f:view>
<h:form>
<h3>Por favor, informar seu usuário e sua senha.</h3>
<table>
<tr>
<td>Nome:</td>
<td>
<h:inputText value=”#{usuarios.nome}”/>
</td>
</tr>
<tr>
<td>Senha:</td>
<td>
<h:inputSecret value=”#{usuarios.senha}”/>
</td>
</tr>
</table>
<p>
<h:commandButton value=”Login”
action=”#{usuarios.validarUsuario}”/>
</p>
</h:form>
</f:view>
</h:body>
</html>
Pág. 88 de 130
Os valores dos campos de entrada são ligados às propriedades do bean de nome usuarios.
O bean usuários é o que em JSF chamamos de Bean Gerenciado (Managed Bean), e é definido
na classe mostrada no quadro 21.
package com.jsf2;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean(name = “usuarios”)
@SessionScoped
public class UsuariosBean {
private String nome, senha;
public void setNome(String nome) {
this.nome = nome;
}
public void setSenha(String senha) {
this.senha = senha;
}
public String getNome() {
return nome;
}
public String getSenha() {
return senha;
}
A anotação @ManagedBean possui, além do atributo name, o atributo eager, de tipo boolean,
que somente é considerado quando o escopo do bean é gerenciável para application. Caso o valor
Pág. 89 de 130
desse atributo seja true e o escopo application, o bean gerenciável será criado e colocado nesse
escopo quando a aplicação iniciar.
É importante observar que esse botão não acessa uma propriedade do bean, mas um método.
Este método representa um action a ser executado, ou seja, um evento de ação padrão. O conteúdo
deste método executa a tarefa de validação do usuário e retorna a navegação entre as páginas,
como mostra o quadro 22.
O retorno “/sucesso” indica que o usuário será transferido para sucesso.xhtml, e o retorno “/
erro”, para a página erro.xhtml. A transferência ocorre através de um objeto RequestDispacher.
Pág. 90 de 130
Quadro 23 – Página sucesso.xhtml
Pág. 91 de 130
adicionar texto arbitrário a uma página. Essas tags são definidas pelo namespace “http://java.sun.
com/jsf/core”, indicado no início da página xhtml. A tabela 16 do material complementar mostra
estas tags.
Pág. 92 de 130
20. BEANS
Na versão 1.2 do JSF, para que uma classe se tornasse um bean gerenciável, era necessário
registrá-la através do faces-config.xml. Isso trazia um inconveniente, pois na medida em que crescia
o número de beans gerenciáveis, o arquivo de configuração também crescia na mesma proporção. E
com um número grande desses beans, se tornava complicado gerenciar todas as alterações em três
lugares distintos, porém relacionados: o faces-config.xml, a página JSF e o próprio bean gerenciável.
Pág. 93 de 130
Quadro 25 - Arquivo faces-config.xml
<?xml version=”1.0”?>
<faces-config xmlns=”http://java.sun.com/xml/ns/javaee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd”
version=”1.2”>
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>sucesso</from-outcome>
<to-view-id>/sucesso.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>erro</from-outcome>
<to-view-id>/erro.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>usuarios</managed-bean-name>
<managed-bean-class>com.jsf2.UsuariosBean</managed-
bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
No JSF 2.0 não é necessário registrar um bean no arquivo de configuração. Podem-se utilizar
anotações para isso. Dessa forma, o bean e o seu registro ficam no mesmo lugar, na mesma classe
Java. Isso facilita bastante o controle dos beans gerenciáveis, como também deixa mais limpo o
faces-config.xml. Porém, em alguns casos, você será obrigado a registrar os beans no arquivo de
configuração, por falta de alternativa via anotações.
• @NoneScoped: os beans gerenciáveis de escopo none não são instanciados nem salvos em
nenhum escopo. Eles são instanciados, sob demanda, por outros beans gerenciáveis. Um bean
gerenciável de escopo somente pode instanciar outros beans gerenciáveis de escopo none.
Pág. 94 de 130
• @RequestScoped: os beans gerenciáveis de escopo request são instanciados e permanecem
disponíveis durante uma mesma requisição HTTP. Eles podem instanciar outros beans
gerenciáveis de escopo: none, request, view, session e application.
• @ViewScoped: os beans gerenciáveis de escopo view permanecem disponíveis enquanto o
usuário permanecer em uma mesma página de uma aplicação. Eles podem instanciar beans
de escopo: none, view, session e application.
• @SessionScoped: os beans gerenciáveis de escopo session são salvos na sessão HTTP de
um usuário. Podem instanciar beans de escopo: none, session e application.
• @ApplicationScoped: os beans gerenciáveis de escopo application permanecem disponíveis
equanto à aplicação estiver no ar e podem ser acessados por todos os usuários da aplicação.
Podem instanciar outros beans de escopo: none e application.
• @CustomScoped: os beans gerenciáveis de escopo custom são beans que possuem um
tempo de vida personalizado. Por exemplo, você pode definir um escopo de conversação,
como existe no JBoss Application Server, no qual um bean permanece disponível para um
conjunto de páginas.
Pág. 95 de 130
21. NAVEGAÇÃO CONDICIONAL
Diferentemente da navegação implícita, a navegação condicional é definida juntamente com as
regras de navegação da aplicação, no arquivo faces-config.xml.
A primeira condição satisfeita fará com que a próxima página a ser mostrada no fluxo de
navegação seja aquela definida na tag <to-view-id>. Para que um <navigation-case> seja satisfeito,
basta que o resultado de um método do bean gerenciável, ou da página de origem, seja igual ao valor
da tag <from-outcome>. A navegação condicional possibilita definir uma verificação a mais dentro
de um <navigation-case>, com o uso da nova tag <if>. O esquema do quadro 26 mostra um exemplo.
<navigation-rule>
<from-view-id>/confirmacao.xhtml</from-view-id>
<navigation-case>
<from-outcome>index</from-outcome>
<if>#{clienteBean.novoCadastro}</if>
<to-view-id>/cadastro.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>index</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
• Estado dos componentes: Mantém automaticamente o estado dos componentes web entre
uma requisição e outra.
• Renderização de componentes: Endereça várias plataformas clientes web.
• Processamento de formulários: Provê mecanismos para o processamento de telas com um
ou vários formulários (sub-views).
Pág. 96 de 130
• Validação: Provê mecanismos para validação de campos e mensagens de erro.
• Internacionalização: Suporte nativo para internacionalização.
• Componentes Visuais: Provêm componentes básicos padrões que podem ser estendidos.
Permite adicionar bibliotecas de terceiros.
• Árvore de componentes: Realiza o alinhamento de um componente dentro de outro para formar
uma interface gráfica. Cada componente possui acesso ao seu pai e filho.
• Facets: Permite adicionar componentes independentes da ordem da árvore. Define uma
relação especial com o componente externo. Muito utilizado em tabelas para definição de
‘cabeçalho’ e ‘rodapé’.
• Eventos: Permite acionamento de listeners sob determinados eventos, exemplo: alteração do
valor de um campo.
Pág. 97 de 130
22. FASES DO CICLO DE VIDA DO JSF
Por trás dos bastidores, FacesServlet aceita requisições de entrada e controla o ciclo de vida
da aplicação através da classe javax.faces.lifecycle.Lifecycle. Usando uma “fábrica”, ela cria um
objeto do tipo javax.faces.context.FacesContext, que contém todos os processos.
O objeto Lifecycle usa o objeto FacesContext em seis fases que compõem o ciclo de vida de
uma aplicação JSF. Cada fase tem uma ação importante em sua aplicação e tem papel importante
no desenvolvimento da aplicação, como mostra a figura 43.
Faces
request
Restore Apply Process Process Process
view requests events validations events
Faces
response Invoke Update
Render Process Process
response events application events model values
Conversion errors/
render response
Validations/conversion
errors/render response
Pág. 98 de 130
◊ Uma mensagem de erro é armazenada no FacesContext e depois mostrada posteriormente
na fase de Renderizar a Resposta;
◊ O ciclo de vida pula a fase de Renderizar a Resposta quando esta se completou.
3. Processar Validações: Depois do valor de cada componente ser atualizado, na fase de
processo de validações, os componentes serão validados naqueles valores, se necessário.
Um componente que necessita de validação deve fornecer a implementação da lógica de
validação. Por exemplo, em um carrinho de compras, podemos determinar a quantidade
mínima e máxima a ser digitada. O valor requisitado é um inteiro (verificado na fase anterior)
e, como passou pela fase 2, nessa fase pode ser barrado por estar além do determinado
(com uma quantidade mínima ou máxima diferente da estipulada).
4. Atualizar Valores do Modelo: Alcança-se essa fase após todos os componentes serem
validados. Nesta fase são atualizados os dados do modelo do aplicativo. Na página em
que foi criada para enviar um texto, a informação digitada foi armazenada no Managed
Bean durante esta fase. Por ter passado pelo processo de validação, temos garantias que
o valor armazenado será garantido nessa fase. Entretanto, os dados podem violar a lógica
de negócios, cuja validação ocorre na fase seguinte.
5. Invocar Aplicação: Durante esta fase, a implementação JSF manipula quaisquer eventos
do aplicativo, tal como enviar um formulário ou ir a outra página através de um link. Esses
eventos são ações que retornam geralmente uma string que está associada a uma navegação
a qual se encarrega de chamar a página determinada.
6. Renderizar Resposta: Esta é a fase final, na qual é renderizada a página. Se este é um
pedido inicial para esta página, os componentes são acrescentados à apresentação neste
momento. Se este é um postback, os componentes já foram acrescidos à apresentação. Se há
mensagens de conversão ou erros de validação e a página contém um ou mais componentes
<message /> ou um componente <messages />, estes serão exibidos. Reciprocamente,
se a página não contém um componente de mensagem, nenhuma informação aparecerá.
JSF suporta três tipos de eventos: ValueChange, Action e Phase, descritos no que se segue.
Pág. 99 de 130
23. EVENT
O componente <h:selectOneMenu> é muitas vezes usado para atualizar uma página, atualizar
informações com base no item selecionado ou mesmo para acessar outra página.
<f:view>
<h:head>
<title>ValueChangeListenet</title>
</h:head>
<h:form>
<table border=”1”>
<tr>
<td>
<h:selectOneMenu value=”#{aluno.curso}”
onchange=”submit()”
valueChangeListener=”#{aluno.valueChangeCurso}”>
<f:selectItems value=”#{aluno.cursos}”/>
</h:selectOneMenu>
</td>
<td>
<h:outputText value=”#{aluno.curso}”/>
</td>
</tr>
</table>
</h:form>
</f:view>
Se for desejável uma execução Ajax, a estrutura deve ser como mostrada a seguir:
<f:view>
<h:head>
<title>ValueChangeListenet</title>
</h:head>
<h:form>
<a4j:region>
<table border=”1”>
<tr>
<td>
<h:selectOneMenu value=”#{aluno.curso}” >
<f:selectItems value=”#{aluno.cursos}”/>
<f:ajax listener=”#{aluno.valueChangeCurso2}”
render=”resultado”/>
</h:selectOneMenu>
</td>
<td>
<h:outputText id=”resultado”value=”#{aluno.
curso}”/>
</td>
</tr>
</table>
</a4j:region>
</h:form>
</f:view>
A execução de uma tarefa assíncrona (baseada em Ajax), consiste na API Ajax For JSF (a4j)
disponível com algumas bibliotecas que manipulam Ajax. As mais populares são RichFaces e
PrimeFaces.
Requisição
Restaurar Aplicar Processar
Processar Processar
visão valores de validações
eventos eventos
requisição
Renderizar resposta
Nenhum dado
Resposta finalizada Resposta finalizada
requisitado
Erros de conversão/
renderizar resposta Validação ou erros de conversão/
Renderizar resposta
Fonte: <http://www.devmedia.com.br/imagens/javamagazine/wmmejsfp1fig01.jpg>.
Para confirmar como todas as fases do ciclo de vida são usadas e quais são, basta criar um
simples PhaseListener e mandá-lo gerar a saída antes e depois de cada fase.
package br.jsf2.listener;
public class TestPhaseListener implements javax.faces.event.
PhaseListener {
public void afterPhase(PhaseEvent event) {
event.getFacesContext().getExternalContext().
log(“AFTER: “+event.getPhaseId());
}
public void beforePhase(PhaseEvent event) {
event.getFacesContext().getExternalContext().
log(“BEFORE: “+event.getPhaseId());
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
Com a classe criada, o próximo passo é registrar esta classe TestPhaseListener no arquivo de
configurações do JSF (faces-config.xml).
…
<lifecycle>
<phase-listener>
br.jsf2.listener.TestPhaseListener
</phase-listener>
</lifecycle>
…
Para exemplificar, suponha uma caixa de textos que receba números representando um dado
monetário. Devemos vincular um conversor ao campo atual com pelo menos dois dígitos após o
ponto decimal, veja:
<h:inputText value=”#{user.amount}”>
<f:convertNumber minFractionDigits=”2”/>
</h:inputText>
Para testar, caro aluno, digite um valor, acrescentando vírgula para separar os centavos e
verifique o resultado. O JavaServer Faces atribuiu 2 casas decimais, no mínimo, como a quantidade
de dígitos decimais.
A manipulação de datas obedece a um padrão específico. Por exemplo, se desejar formatar uma
data para o padrão brasileiro, considere os símbolos: d – dia, M – mês e y – ano. Assim, o padrão
para formatação de datas segue o exemplo a seguir:
Apresentaremos aqui, caro aluno, os passos para criar e manipular propriedades para uma
interface JSF.
Supondo que esse arquivo exista, o próximo passo é definir um grupo de propriedades apropriadas
ao seu aplicativo. Por exemplo, suponha que se deseja criar a interface mostrada na figura 45.
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:h=”http://java.sun.com/jsf/html”
xmlns:f=”http://java.sun.com/jsf/core”>
<f:view>
<h:head>
<f:loadBundle basename=”com.jsf2.messages” var=”msgs” />
<title><h:outputText value=”#{msgs.title}”/></title>
</h:head>
<h:body>
<h:form>
<h1><h:outputText value=”#{msgs.enterPayment}”/></h1>
<h:panelGrid columns=”3”>
<h:outputText value=”#{msgs.amount}”/>
<h:inputText id=”amount” label=”#{msgs.amount}”
value=”#{payment.amount}” >
<f:convertNumber minFractionDigits=”2”/>
</h:inputText>
<h:message for=”amount” />
<h:outputText value=”#{msgs.creditCard}”/>
<h:inputText id=”card” label=”#{msgs.creditCard}”
value=”#{payment.card}” />
<h:panelGroup/>
<h:outputText value=”#{msgs.expirationDate}”/>
<h:inputText id=”date”
label=”#{msgs.expirationDate}”
value=”#{payment.date}”>
<f:convertDateTime pattern=”MM/yyyy”/>
</h:inputText>
<h:message for=”date” />
</h:panelGrid>
<h:commandButton value=”#{msgs.process}” action=”process”/>
</h:form>
</h:body>
</f:view>
</html>
Analisando o código, podemos perceber que todo o texto da interface não está definido no
código, mas são representados por propriedades de um objeto chamado msgs. Esse objeto foi
definido na linha:
Uma vez definido o arquivo e o objeto referenciado na página jsp, é necessário realizar esta
alteração no arquivo faces-config.xml:
<application>
<message-bundle>com.corejsf.messages</message-bundle>
</application>
Existem diversas variáveis pré-definidas na API JSF, especialmente no que diz respeito às
mensagens de erro para o usuário. Consulte a documentação para maiores detalhes.
Pratique o que você aprendeu até agora com os exercícios no arquivo anexo!
Web services é a tecnologia ideal para comunicação entre sistemas, sendo muito usado em
aplicações B2B (Business 2 Business). A comunicação entre os serviços é padronizada, possibilitando
a independência de plataforma e de linguagem de programação.
Por exemplo, um sistema de reserva de passagens aéreas feito em Java e rodando em um servidor
Linux pode acessar, com transparência, um serviço de reserva de hotel feito em .net rodando em
um servidor Microsoft.
Para comunicar com o Web service, é necessário uma implementação do protocolo SOAP (Simple
Object Access Protocol) definido no W3C. Esse protocolo é o responsável pela independência que
o Web service precisa.
SOAP processor
Response
Discrete
WSDL business
logic
Application
Service
Request
SOAP
client SOAP processor
One-Way
Application
WSDL
Application
UDDI
registry Service
Os Web services são “escritos” basicamente em SOAP e WSDL, ambas baseadas em XML. Como
SOAP é a mensagem e WSDL o descritor desta mensagem, é importante compreender o conceito
de XML e XSD, usados posteriormente para interpretar informações no formato XML, através do
JAX-WS.
Um Web service é uma lógica de aplicativo acessível a programas através de protocolos web de
um modo independente de plataforma. Um Web service expõe a lógica de aplicativo ou de código.
Esse código pode realizar diversas tarefas.
O conceito de Web services é baseado em um conjunto de protocolos web, como HTTP, XML,
SOAP, WSDL e UDDI e podem ser implementados em qualquer plataforma. O Web service é acessado
por uma aplicação, de qualquer natureza, como mostrado na figura 47.
Application Application
XML
4 1 2 3
Request
(service invocation)
SOAP SOAP
SOAP é um protocolo simples e leve baseado em XML que proporciona troca de informações
em cima do protocolo HTTP. É um protocolo para acessar Web services.
A arquitetura tem sido desenhada para ser independente de qualquer modelo particular de
programa e de outras implementações específicas.
Os dois maiores objetivos do SOAP são a simplicidade e extensibilidade, e esse protocolo obedece
a esses requisitos, pois trafega em cima do HTTP e o HTTP é suportado por todos os servidores e
browsers do mercado, com diferentes tecnologias e linguagens de programação.
<SOAP-ENV:envelope>
<SOAP-ENV:header>
<!--Especifica outros dados da mensagem(é opcional)-->
</SOAP-ENV:header>
<SOAP-ENV:body>
<!--O elemento BODY contém a mensagem em si-->
</SOAP-ENV:body>
</SOAP-ENV:envelope>
<SOAP-ENV:envelope>
<SOAP-ENV:body>
<!--A resposta do servidor-->
</SOAP-ENV:body>
</SOAP-ENV:envelope>
<soap:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/
soap:encodingstyle=http://schemas.xmlsoap.org/soap/encoding/>
<!--Dados da mensagem aqui-->
</soap:Envelope>
À medida que se avança na estrutura do SOAP, é possível ver que sua codificação é bastante
simples.
<soap:Header>
<!--Aqui definimos o namespace como sendo “r” para personalizar nosso
documento SOAP, você pode criar o seu próprio namespace-->
<r:mercado xmlns:r=”http://www.mercadao.com.br/valores/”
soap:actor=”http://www.mercadao.com.br/descricao” />
<r:lingua>port</r:lingua>
<r:dinheiro>REAL</r:dinheiro>
</r:mercado>
</soap:Header>
• encodingStyle: esse atributo serve para definir um estilo de codificação do documento. Veja:
<soap:Envelope
xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/
soap:encodingstyle=http://schemas.xmlsoap.org/soap/encoding/>
Mensagem aqui
</soap:Envelope>
<soap:Header>
<r:mercado xmlns:r=”http://www.mercadao.com.br/valores/”/>
<r:lingua soap:mustUnderstand=”0”>port</r:lingua>
<r:dinheiro soap:mustUnderstand=”1”>REAL</r:dinheiro>
</r:mercado>
</soap:Header>
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
• One-Way – A operação pode receber uma mensagem, mas não irá retornar uma resposta.
• Request-response – A operação pode receber uma requisição e retornar uma resposta.
• Solicit-response – A operação pode enviar uma requisição e esperar por uma resposta.
O elemento soap:binding tem dois atributos, style e transport. O atribiuto style pode ser o “rpc”
ou “documento”, o transport define o protocolo SOAP a ser usado, no caso o http.
Para construir um documento XML com JAXB, primeiro vincule o esquema do documento
XML que deseja construir. Depois, crie uma árvore de conteúdo. Por último, empacote a árvore de
conteúdo em um documento XML.
O diagrama da figura 48 mostra os processos para acessar e construir documentos XML com
base em aplicações Java.
Application
Unmarshal Content
objects
XML JAXB
document
API
Marshal
Fonte: <https://www.ibm.com/developerworks/cn/websphere/library/techarticles/0910-
jaxb-cbe-ejb3monitor/image001.jpg>. Acesso em: 04 out. 2017.
A seguir apresentaremos um exemplo de um Web service JAX-WS. Após criar o Web service,
escreveremos um cliente Java Servlet.
Nosso Web service se chamará OperacoesWS e seu conteúdo será o apresentado no quadro 31.
package com.webservice;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
@WebService(serviceName = “OperacoesWS”)
public class OperacoesWS {
@WebMethod(operationName = “reverterTexto”)
public String reverterTexto(@WebParam(name = “texto”)
String texto) {
return new StringBuilder(texto).reverse().toString();
}
@WebMethod(operationName = “ListarCidades”)
public List<String> ListarCidades(@WebParam(name = “estado”)
String estado) {
List<String> lista = new ArrayList<String>();
if(estado.equals(“SP”)){
lista.add(“São Paulo”);
lista.add(“Campinas”);
lista.add(“Ribeirão Preto”);
}
else if(estado.equals(“AC”)){
lista.add(“Rio Branco”);
lista.add(“Sena Madureira”);
lista.add(“Cruzeiro do Sul”);
}
return lista;
}
}
Os parâmetros para cada anotação são apresentados nas tabelas 21, 22 e 23 do material
complementar.
A execução deste Web service produz o resultado mostrado na figura 49, usando-se o servidor
Tomcat:
http://localhost:8084/Operacoes/OperacoesWS
http://localhost:8084/Operacoes/OperacoesWS?wsdl
Ele permite o download do WSDL para verificar os dados fornecidos pelo cliente. O conteúdo
do WSDL é mostrado no quadro 32.
O cliente, como dito anteriormente, é um Servlet. Este Servlet recebe de um formulário um texto
e um estado, e apresenta o resultado. O código para o cliente é mostrado no quadro 33.
Uma vez que o Web service é exposto, o cliente executa seus métodos (remotos) seguindo a
forma tradicional.
Fonte: https://docs.oracle.com/cd/E26401_01/doc.122/e20925/T511175T626069.htm
Async queue
Fonte: https://docs.oracle.com/cd/E26401_01/doc.122/e20925/T511175T626069.htm
O procedimento de uma chamada assíncrona não é tão trivial como uma chamada síncrona,
veja as etapas:
Chamar um web service envolve fazer uma chamada por uma rede que poderia potencialmente
causar atrasos por fatores acima de seu controle (por exemplo, tráfico pesado de rede). Em muitos
No nosso exemplo de aplicação, o WSDL deve ser alterado para que operações assíncronas
sejam permitidas. Isso é mostrado no quadro 34.
Na aplicação cliente, uma chamada assíncrona deve ser prevista, como mostra o quadro 35. No
código do quadro 34, junto com a chamada do Web service, observa-se que a resposta do serviço
ReverterTexto é manipulada por meio de um objeto AsynchHandler. Enquanto isso, um objeto Future
verifica se foi retornado um resultado e inativa o thread até que o resultado seja concluído.
...
<portType name=”OperacoesWS”>
<operation name=”ListarCidades”>
<input wsam:Action=”http://webservice.com/OperacoesWS/
ListarCidadesRequest” message=”tns:ListarCidades” />
<output wsam:Action=”http://webservice.com/OperacoesWS/
ListarCidadesResponse” message=”tns:ListarCidadesResponse” />
</operation>
<operation name=”reverterTexto”>
<input wsam:Action=”http://webservice.com/OperacoesWS/
reverterTextoRequest” message=”tns:reverterTexto” />
<output wsam:Action=”http://webservice.com/OperacoesWS/
reverterTextoResponse” message=”tns:reverterTextoResponse” />
</operation>
<jaxws:bindings>
<jaxws:enableAsyncMapping>
true
</jaxws:enableAsyncMapping>
</jaxws:bindings>
</portType>
...
Pudemos constatar que todas as classes que criamos no Java SE puderam ser aproveitadas
nas nossas aplicações web. Constatamos, também, a importância da orientação a objetos, quando
definimos classes capazes de interagir com outros tipos de aplicações além da web, por exemplo,
aplicações swing.
Da mesma forma que usamos o mecanismo de acesso a dados baseado em JDBC, podemos
também utilizar outros frameworks, como o Hibernate, o JPA, o Ibatis, dentre outros, todos usando
classes capazes de serem reaproveitadas. Todas essas aplicações utilizam tudo o que estudamos.
Comunicação sem estado (stateless) - é um protocolo de comunicação que considera cada requisição
como uma transação independente que não está relacionada a qualquer requisição anterior, de
forma que a comunicação consista de pares de requisição e resposta independentes. Um protocolo
sem estado não requer que o servidor retenha informação ou estado de sessão sobre cada parceiro
de comunicação para a duração de várias requisições. Em contraste, um protocolo que exija a
manutenção do estado interno no servidor é conhecido como um protocolo com estado. Fonte:
wikipedia.
Postback - é uma medida tomada por uma página interativa, quando a página inteira e seus conteúdo
são enviados para o servidor para processamento de algumas informações e, em seguida, o servidor
mostra a mesma página de volta ao seu navegador. Fonte: wikipedia.
Request-Response - os objetos Response e Request ainda existem e podem usados em páginas ASP.
NET. Estes objetos representam a informação chegando no servidor Web a partir do navegador(Request)
e a informação saindo do servidor para o navegador(Response). O objeto Request representa o objeto
input e o objeto Response representa o objeto output. Fonte: macoratti.net.
IBM . Struts framework and model-view-controller design pattern. Disponível em: <https://www.ibm.
com/support/knowledgecenter/SSRTLW_9.5.0/com.ibm.etools.struts.doc/topics/cstrdoc001.html>. Acesso em:
28 jun. 2014.
JUNIOR, E. P. Web services: uma solução para aplicações distribuídas na internet. Disponível em:
<http://www.apostilando.com/download.php?cod=415&categoria=Internet. Acesso em: 14 Ago. 2014.
KALIN, M. Java Web services: Implementando. Porto Alegre: Alta Books Editora, 2010.
MULLER, Nicolas. Internet, intranet e extranet o que são, e quais as diferenças?. Disponível em:
<http://www.oficinadanet.com.br/artigo/1276/internet_intranet_e_extranet_o_que_sao_e_quais_as_diferencas>.
Acesso em: 07 ago. 2014.
REDDY, L. Creating SOAP Web services with JAX-WS. Disponível em: <http://www.developer.com/java/
creating-soap-web-services-with-jax-ws.html>. Acesso em: 28 jun. 2014.