• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Java web
 

Java web

on

  • 4,622 views

 

Statistics

Views

Total Views
4,622
Views on SlideShare
4,622
Embed Views
0

Actions

Likes
1
Downloads
92
Comments
1

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt
  • Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt

Java web Java web Presentation Transcript

  • Java Básico – Módulo 1 Java Web Java Web Régis Melo @regismelo@regismelo 1
  • Java Básico – Módulo 1 Java Web MissãoApresentar, motivar e exercitar a plataformaJava voltada para desenvolvimento deaplicações WEB. @regismelo 2
  • Java Básico – Módulo 1 Java Web Metodologias• Exposição e discussão teóricas;• Exercícios práticos de projeto e modelagem em laboratório. @regismelo 3
  • Java Básico – Módulo 1 Java Web O que esse curso não cobre ou não é?Não Cobre:• Conceitos gerais de Java e da plataforma J2SE.Não é:• Um curso para aprender Java – este é um curso para se aprofundar na plataforma, estudando os recursos voltados para web. @regismelo 4
  • Java Básico – Módulo 1 Java Web Programa I. Iniciando II. Introdução aos Applets III. Introdução a Servlets IV. Revisão do protocolo HTTP V. Trabalhando com dados de formulários VI. Processamento e ciclo de vida de um Servlet VII. Obtendo informações do ambiente VIII. Controle de Fluxo e Colaboração IX. Cookies X. Gerenciamento de Sessões XI. Java Server Pages XII. Tag Libs@regismelo 5
  • Java Básico – Módulo 1 Java Web Antes de iniciar…Vamos nos apresentar• Nome;• Empresa;• Experiência com programação;• Razões de estar fazendo esse treinamento;• Expectativas desse curso. @regismelo 6
  • Java Básico – Módulo 1 Java Web Livros sugeridos@regismelo 7
  • Java Básico – Módulo 1 Java Web Módulo I Iniciando@regismelo 8
  • Java Básico – Módulo 1 Java Web "People only see what they are prepared to see." Ralph Waldo Emerson@regismelo 9
  • Java Básico – Módulo 1 Java Web Iniciando• Nesse curso, abordaremos uma série de tecnologias do J2EE – Java 2 Enterprise Edition;• Iremos nos focar nos assuntos relacionados ao desenvolvimento para web. @regismelo 10
  • Java Básico – Módulo 1 Java Web Plataforma J2SE e J2EE@regismelo 11
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• No início as páginas eram apenas institucionais;• Não havia necessidade de dinamismo;• Serviços não eram oferecidos nas páginas;• Tecnologias utilizadas  HTML e eventualmente Applets. @regismelo 12
  • Java Básico – Módulo 1 Java WebPágina da Sefaz, em Dezembro de 1998@regismelo 13
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• Com o passar do tempo, percebeu-se a necessidade de interação;• O problema era como tornar as página dinâmicas;• Diversas tecnologias surgiram com esse fim. @regismelo 14
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• CGI – Common Gateway Interface – Surgiu em meados de 1996; – Na época era uma das única soluções para criação de web sites dinâmicos; – Em 1996, existiam cerca de 100.000 web sites e o browser mais utilizado era o Netscape Navigator 2.0 (o primeiro browser a suportar JavaScript – outra tecnologia para tornar páginas dinâmicas) @regismelo 15
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• CGI – Common Gateway Interface Um programa CGI pode ser implementado em diversas linguagens @regismelo 16
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• CGI – Ciclo de Vida @regismelo 17
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• CGI – Common Gateway Interface – A escalabilidade é um dos principais problemas de aplicações CGI; – Para cada cliente, um novo processo é executado; – Se você tem um cliente, você tem um “executável” rodando; – Se você tem 1.000.000 de clientes… @regismelo 18
  • Java Básico – Módulo 1 Java Web Hello World em CGI/Perl#!/usr/local/bin/perl# simple Hello World scriptprint "Content-type: text/plainnn";print Hello World!; Toda a produção da página fica dentro de um programa que roda do lado servidor. @regismelo 19
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• ASP – Active Server Pages – Tecnologia bastante madura para o desenvolvimento de página dinâmicas; – É uma tecnologia desenvolvida pela Microsoft (não é multi-plataforma); – Excelentes ferramentas de desenvolvimento; – Diferente do CGI, é bastante escalável. @regismelo 20
  • Java Básico – Módulo 1 Java Web Hello World em ASP<%Dim I%> Código é embutido dentro da página HTML.<% <% e %> delimitam o código queFor I = 1 To 5 Step 1 será processado no servidor%> <FONT SIZE="<%= I %>">Hello World</FONT><BR><%Next%> @regismelo 21
  • Java Básico – Módulo 1 Java Web Hello World em ASPHello WorldHello WorldHello WorldHello WorldHello World@regismelo 22
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• PHP – Linguagem de programação Server Side, HTML embedded; – Em teoria, similar ao ASP. @regismelo 23
  • Java Básico – Módulo 1 Java Web Hello World em PHP<HTML><HEAD></HEAD><BODY>This is in Html<BR><?php echo “Hello World<BR>"; ?></BODY></HTML>@regismelo 24
  • Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web “As tecnologias Java para web surgiram para resolver os problemas de escalabilidade, facilidade de uso e portabilidade.” @regismelo 25
  • Java Básico – Módulo 1 Java Web Página da Sefaz, Junho/2004@regismelo 26
  • Java Básico – Módulo 1 Java Web Módulo II Applets - Conceitos@regismelo 27
  • Java Básico – Módulo 1 Java Web Tecnologias Java para Web - Applets• Os applets surgiram em meados de 1996;• Applets = primeira tecnologia Java voltada para web;• Foram amplamente utilizadas para dar dinamismo as páginas;• As páginas HTML eram estáticas – o dinamismo era resolvido utilizando applets;• Código Java, executado do lado cliente. @regismelo 28
  • Java Básico – Módulo 1 Java Web AppletsExemplo deuma applet @regismelo 29
  • Java Básico – Módulo 1 Java Web Applets• Algumas aplicações que necessitam de interatividade intensiva, utilizam applets. @regismelo 30
  • Java Básico – Módulo 1 Java Web Applets - ExemploBiblioteca gráfica Classe que devepara “desenhar” ser extendida para criar uma nova appletimport java.applet.Applet;import java.awt.Graphics;class HelloWorld extends Applet{ public void paint(Graphics g){ g.drawString(“Hello World!”, 160, 70); } Método especial da applet chamado} pelo browser para “desenhar” o conteúdo da applet @regismelo 31
  • Java Básico – Módulo 1 Java Web Applets – Exemplo A página HTML que utiliza a applet<html><body><h1> O Applet Hello World” </h1><applet code = “HelloWorld.class” width = 400 height = 100></applet></body> Tag HTML utilizada para</html> referenciar a applet @regismelo 32
  • Java Básico – Módulo 1 Java Web Applets – Exemplo@regismelo 33
  • Java Básico – Módulo 1 Java Web Applets - Problemas• Código Java executado do lado cliente = necessidade de uma JVM no lado cliente;• Os browsers passaram a incorporar JVMs;• Atualização de versão das applets é feita de forma automática, porém...• Necessidade de constante atualização das JVMs. @regismelo 34
  • Java Básico – Módulo 1 Java Web Applets - Problemas• Para complicar, recentemente a instalação padrão dos principais browsers deixou de vir com suporte a JVMs;• As applets caíram em desuso... @regismelo 35
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter1.pdf)1.1 Servlets1.2 The Advantages of Servlets Over "Traditional" CGI – Efficient – Convenient – Powerful – Portable – Secure – Inexpensive1.3 JavaServer Pages1.4 The Advantages of JSP – Versus Active Server Pages (ASP) – Versus PHP – Versus Pure Servlets – Versus Server-Side Includes (SSI) – Versus JavaScript – Versus Static HTML @regismelo 36
  • Java Básico – Módulo 1 Java Web Módulo IIIIniciando no mundo dos Servlets@regismelo 37
  • Java Básico – Módulo 1 Java Web O que são Servlets?• Sevlets são a resposta da tecnologia Java a programação CGI(Common Gateway Interface);• Eles são programas que rodam em um servidor Web, agindo como uma camada intermediária entre uma requisição feita por um browser, ou outro cliente (em geral HTTP), com outras aplicações e banco de dados. @regismelo 38
  • Java Básico – Módulo 1 Java Web O que são Servlets?@regismelo 39
  • Java Básico – Módulo 1 Java Web Hello World com Servletsimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 40
  • Java Básico – Módulo 1 Java Web O que são Servlets?• Servlets são multi-thread (não sofrem com problemas de escalabilidade como as aplicações CGI) @regismelo 41
  • Java Básico – Módulo 1 Java Web Servlets x CGI• Eficientes – Em CGI cada requisição gera um novo processo no servidor. A JVM cria threads de execução para cada requisição;• Convenientes – Servlets já possuem todas as ferramentas para tratar documentos HTML, Cabeçalhos HTTP, Cookies, Gerenciamento de sessão etc. @regismelo 42
  • Java Básico – Módulo 1 Java Web Servlets x CGI• Poderosos – Servlets podem “falar” diretamente com o servidor Web (programas CGI precisam de uma API específica para cada servidor); – Servlets podem compartilhar dados facilitando a implementação de recursos compartilhados como pool conexões com o BD etc; @regismelo 43
  • Java Básico – Módulo 1 Java Web Servlets x CGI• Poderosos – Servlets podem manter dados entre as requisições, facilitando os mecanismos de gerenciamento de sessão etc. @regismelo 44
  • Java Básico – Módulo 1 Java Web Servlets x CGI• Portáveis – Feitos em Java e implementam um API padrão;• Seguros – CGI são executados como scripts shell do sistema;• Baratos – Existem servidores bons e gratuitos. @regismelo 45
  • Java Básico – Módulo 1 Java Web Entendendo o Hello World Classes do pacote java.io utilizadas para produzir Pacote com implementação das a saída do servlet interfaces e classes de Servletimport java.io.*;import javax.servlet.*; Implementação de Servletimport javax.servlet.http.*; para funcionar com HTTPpublic class HelloWorld extends HttpServlet{ ....} Servlets HTTP devem herdar dessa classe @regismelo 46
  • Java Básico – Módulo 1 Java Web Entendendo o Hello World Método chamado quando um usuário faz uma requisição public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ ...}Exceção geral disparada quando o servlet tem algum problema Encapsula os dados relativos a requisição (request) e o resultado Exceção disparada quando que será produzido (response) problemas na produção da página acontecem @regismelo 47
  • Java Básico – Módulo 1 Java Web Entendendo o Hello World Representa a saída Informa o tipo de conteúdo(a página que será produzida) que será produzido { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close();Produz o resultado } Finaliza o processo de geração da página @regismelo 48
  • Java Básico – Módulo 1 Java Web Entendendo o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 49
  • Java Básico – Módulo 1 Java Web Como rodar Servlets?• Para rodar Servlets é necessário instalar um servidor web que implemente a especificação de Servlets;• Pelo fato de Servlet ser uma especificação, e não uma implementação, o código escrito em um servidor de um fornecedor deverá funcionar sem alterações em outro servidor de outro fornecedor. @regismelo 50
  • Java Básico – Módulo 1 Java Web Como rodar Servlets?• A especificação da API de Servlets está atualmente na versão 2.4;• Existem dezenas de fornecedores e projetos open source que disponibilizam servidores compatíveis com a especificação de Servlets;• O software servidor é conhecido como container. @regismelo 51
  • Java Básico – Módulo 1 Java Web ContainersAlguns containers disponíveis: SUN Microsystems Atualmente conhecido como SUN One A solução IBM é conhecida como WebSphere BEA WebLogic Líder do mercado em soluções pagas JRUN – Solução da Macromedia Boa integração com seus produtos Borland Application Server @regismelo 52
  • Java Básico – Módulo 1 Java Web ContainersUtilizaremos nesse treinamento o Jakarta TomCat @regismelo 53
  • Java Básico – Módulo 1 Java Web TomCat• O TomCat é um servidor open source;• Fruto do projeto Jakarta, sub-projeto do projeto Apache;• O projeto Jakarta constrói aplicativos open source para java;• É a atual “reference implementation” da API Servlets e JSP;• Bastante utilizado e robusto. @regismelo 54
  • Java Básico – Módulo 1 Java Web TomCat• O TomCat pode ser obtido no site http://jakarta.apache.org/tomcat;• A versão que utilizaremos nesse treinamento é o TomCat 4.1.24, que suporta a especificação 2.3 da API Servlet (e JSP 1.2 que abordaremos mais a frente);• O arquivo disponível para instalação é o tomcat-4.1.24-LE-jdk14.exe. @regismelo 55
  • Java Básico – Módulo 1 Java Web Instalando o TomCat• Opções da instalação: TomCat rodará como um serviço (use somente em um ambiente de produção) @regismelo 56
  • Java Básico – Módulo 1 Java Web Instalando o TomCat• Ao final da instalação: Porta que o TomCat ficará escutando Usuário/senha utilizado para Administrar o TomCat @regismelo 57
  • Java Básico – Módulo 1 Java Web Instalando o TomCat• Depois da instalação concluída, você pode iniciar o servidor;• Para isso, utilize o ícone “Start TomCat”;• Ou carregue-o digitando o comando <tomcat>/bin/startup.bat ou <tomcat>/bin/startup.sh (linux/unix);• O TomCat é feito em Java, por isso, o mesmo código roda em qualquer S.O. que tenha uma JVM. @regismelo 58
  • Java Básico – Módulo 1 Java Web TomCat rodando@regismelo 59
  • Java Básico – Módulo 1 Java Web TomCat rodando• Para verificar se o TomCat está rodando corretamente, digite no seu browser: http://localhost:8080 Porta selecionada na instalação @regismelo 60
  • Java Básico – Módulo 1 Java Web TomCat rodando@regismelo 61
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Vamos agora configurar uma aplicação que irá rodar no TomCat;• As aplicações no TomCat, ficam em geral no diretório <tomcat>/webapps;• Vamos criar um diretório chamado curso debaixo dessa pasta: <tomcat>/webapps/curso @regismelo 62
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Essa pasta conterá nosso site;• A API de Servlets, a partir da versão 2.2, prevê uma estrutura padrão de diretórios das aplicações web;• Isso significa que da sua aplicação web, bem como seus arquivos de configuração se comportarão da mesma forma independente do produto que você esteja utilizado. @regismelo 63
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Document Root É a pasta raiz da sua aplicação web. Nela, colocaremos nossos arquivos HTML, JSP, etc.• WEB-INF Pasta padrão que conterá informações de configuração do seu site e suas classes (veja mais a frente). @regismelo 64
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• WEB-INF/web.xml Arquivo XML que descreve os servlets e outros componentes de sua aplicação.• WEB-INF/classes Contém as classes Java (e recursos associados) requeridos por sua aplicação (o nosso HelloWorld.class ficará nesse diretório). @regismelo 65
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• WEB-INF/lib Contém arquivos JAR requeridos por sua aplicação (como por exemplo, drivers JDBC). @regismelo 66
  • Java Básico – Módulo 1 Java Web Nossa estrutura de diretório Nossa aplicação Nossos servlets ficarão aqui@regismelo 67
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Após a estrutura de diretórios ter sido criada, podemos compilar nossa classe HelloWorld;• Podemos compilar essa classes usando nosso compilador favorito (Javac, Jikes ou a sua IDE). @regismelo 68
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• IMPORTANTE: Para compilar nossos servlets é necessário ter o arquivo servlet.jar no nosso classpath. Ele está disponível em <tomcat>/common/lib @regismelo 69
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Após compilado o arquivo, devemos copiar o nosso HelloWorld.class para o diretório: <tomcat>/webapps/curso/WEB-INF/classes @regismelo 70
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Antes de testar nossa aplicação precisamos configurar o TomCat para carregar nossos Servlets;• Essa configuração será feita no arquivo <tomcat>/conf/web.xml;• Precisamos apenas dizer que o TomCat irá carregar os servlets a partir de um determinada URL padrão. @regismelo 71
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Procure a entrada abaixo no arquivo <tomcat>/conf/ web.xml Perceba que essa entrada está comentada @regismelo 72
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>• Essa entrada diz que sempre que o usuário digitar... http://<servidor>:<porta>/<app>/servlet/<nomeServlet> O TomCat tentará carregar uma classe com o nome <nomeServlet> que herda de HttpServlet. @regismelo 73
  • Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Essa linha, originalmente está comentada por questões de segurança;• Devemos retirar o comentário dessa linha para nosso servlet funcionar: @regismelo 74
  • Java Básico – Módulo 1 Java Web Relembrando o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 75
  • Java Básico – Módulo 1 Java Web Exercício• Primeiro, instalar e configurar o TomCat;• Iniciar o TomCat;• Digitar o código do slide anterior e salvá-lo em um arquivo chamado HelloWorld.java;• Compilar o código e copiar o .class para <tomcat>/webapps/curso/WEB-INF/classes;• Verificar se o HelloWorld funciona digitando no browser: http://localhost:8080/curso/servlet/HelloWorld 45 minutos @regismelo 76
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter1.pdf)1.5 Installation and Setup – Obtain Servlet and JSP Software – Bookmark or Install the Servlet and JSP API Documentation – Identify the Classes to the Java Compiler – Package the Classes – Configure the Server – Start the Server – Compile and Install Your ServletsCore Servlets and JSP Pages (CSAJSP-Chapter2.pdf)2.1 Basic Servlet Structure2.2 A Simple Servlet Generating Plain Text Compiling and Installing the Servlet Invoking the Servlet2.3 A Servlet That Generates HTML2.4 Packaging Servlets Creating Servlets in Packages Compiling Servlets in Packages Invoking Servlets in Packages @regismelo 77
  • Java Básico – Módulo 1 Java Web Módulo IV Revisão do protocolo HTTP@regismelo 78
  • Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP• A web que conhecemos hoje funciona com o protocolo HTTP, que significa Hyper Text Transfer Protocol;• HTTP é um protocolo, bastante simples, de transferência de dados;• É um padrão, definido pela W3C (http 1.1  RFC 2616) @regismelo 79
  • Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP@regismelo 80
  • Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP• HTTP é um protocolo stateless, ou seja, não mantém estado;• Cada requisição estabelece uma conexão com o servidor, recebe os dados e fecha a conexão. @regismelo 81
  • Java Básico – Módulo 1 Java Web HTTP - Requisição• Quando um cliente faz uma requisição, ele especifica um comando, chamado método, que especifica o tipo de ação que ele quer efetuar;• A primeira linha da requisição também especifica a URL e a versão do protocolo: GET /index.jsp HTTP/1.0 @regismelo 82
  • Java Básico – Módulo 1 Java Web HTTP - Requisição• Após enviado o comando, o cliente pode enviar informações adicionais (tipo do browser, versão, etc): GET /index.jsp HTTP/1.0 User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95) Accept: image/gif, image/jpeg, text/*, */* @regismelo 83
  • Java Básico – Módulo 1 Java Web HTTP - Requisição• A requisição também pode ser feita com um método POST POST /index.jsp HTTP/1.0 User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95) Accept: image/gif, image/jpeg, text/*, */* @regismelo 84
  • Java Básico – Módulo 1 Java Web HTTP - RequisiçãoQual a diferença entre o método GET e o POST?• GET, envia dados através da URI (tamanho limitado) <uri>?dados• Um exemplo de um site que usa GET para enviar informações: http://www.google.com/search?q=cejug @regismelo 85
  • Java Básico – Módulo 1 Java Web HTTP - RequisiçãoQual a diferença entre o método GET e o POST?• POST envia os dados para o servidor como um fluxo de bytes – dados não aparecem na URL;• Útil para grandes formulários a informação não deve ser exibida na URL (senhas, por exemplo);• Desvantagem – usuário não pode fazer bookmarks da URL. @regismelo 86
  • Java Básico – Módulo 1 Java Web HTTP - Resposta• Feita uma requisição, o servidor envia uma resposta;• A primeira linha da resposta indica um código de status e sua descrição HTTP/1.0 200 OK @regismelo 87
  • Java Básico – Módulo 1 Java Web HTTP - RespostaAlguns códigos HTTP:• 200  Código default, sucesso;• 400  Erro de sintaxe na requisição;• 404  Recurso não existe no servidor;• 405  Método não permitido.Para consultar a lista completa, acesse: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html @regismelo 88
  • Java Básico – Módulo 1 Java Web HTTP - Resposta• Após a linha de status, o servidor envia os cabeçalhos de resposta: Date: Saturday, 23-May-00 03:25:12 GMT Server: Tomcat Web Server/3.2 MIME-version: 1.0 Content-type: text/html Content-length: 1029 Last-modified: Thursday, 7-May-00 12:15:35 GMT @regismelo 89
  • Java Básico – Módulo 1 Java Web HTTP – Resumindo@regismelo 90
  • Java Básico – Módulo 1 Java Web TCP Monitor• Uma boa forma de entender o protocolo HTTP é vê-lo funcionando;• O programa TCP Monitor exibe as requisições feitas pelos clientes e a resposta feita por um servidor;• O TCP Monitor é um utilitário, parte do projeto AXIS, do projeto Jakarta, e pode ser baixado em http://ws.apache.org/axis/ @regismelo 91
  • Java Básico – Módulo 1 Java Web Configurando o TCP Monitor• Primeiro passo – carregar o programa: java -cp axis.jar org.apache.axis.utils.tcpmon @regismelo 92
  • Java Básico – Módulo 1 Java Web Configurando o TCP MonitorSegundo passo – configurar Porta que será criada na nossa máquina O host para qual a requisição será direcionada Clique em adicionar depois de configurar @regismelo 93
  • Java Básico – Módulo 1 Java Web Configurando o TCP MonitorTerceiro passo – faça uma requisição normalmente doseu browser para a porta configurada: http://localhost:88 @regismelo 94
  • Java Básico – Módulo 1 Java Web Configurando o TCP MonitorE finalmente, veja os detalhes da requisição HTTP: @regismelo 95
  • Java Básico – Módulo 1 Java Web Exercício• Faça uma requisição ao seu próprio servidor e veja informações sobre a requisição;• Faça requisições a outros sites usando o TCP Monitor e descubra detalhes sobre alguns servidores. @regismelo 96
  • Java Básico – Módulo 1 Java Web Módulo V Trabalhando com dados de formulários@regismelo 97
  • Java Básico – Módulo 1 Java Web Dados vindos de formulários• Conforme vimos na nossa revisão de HTTP, dados podem ser postados utilizando os método GET e POST;• Iremos aprender nesse módulo como “capturar” esses dados nos nossos servlets. @regismelo 98
  • Java Básico – Módulo 1 Java Web Relembrando HTML e Formulários… Para onde o formulário Como o formulário será submetido será submetido <html> <form action="meuServlet" method=“get"> <input name="nome" type="text" value="Digite seu nome aqui!" size="40" maxlength="40"> </form> </html>@regismelo 99
  • Java Básico – Módulo 1 Java Web Dados vindos de formulários• No exemplo anterior, o formulário irá postar os dados para uma URL, no mesmo servidor, chamada meuServlet;• Precisamos criar um servlet para receber os dados desse formulário• Já sabemos criar um servlet, mas como receber os parâmetros passados? @regismelo 100
  • Java Básico – Módulo 1 Java Web Relembrando o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 101
  • Java Básico – Módulo 1 Java Web A Interface HttpServletRequest• A instância de HttpServletRequest passada como parâmetro para o método doGet encapsula os dados vindos da requisição;• Através dela poderemos saber todos os dados relativos a requisição;• A interface HttpServletRequest herda de ServletRequest. @regismelo 102
  • Java Básico – Módulo 1 Java Web A Interface ServletRequestPrincipais métodos:• getParameter( String name )  - Retorna o valor relativo a um determinado parâmetro passado; - Esse parâmetro pode ser um dado de um formulário submetido ou um dado passado na URL; - O retorno de getParameter sempre é String! - Cuidado  O nome do parâmetro é sensitive case. - Cuidado  Se o parâmetro não existir na requisição, getParameter retorna null. @regismelo 103
  • Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• getParameterValues( String name )  - Retorna os valores relativos a um determinado parâmetro passado; - Use esse método quando um dado de um formulário tiver mais de um valor (um “select”, por exemplo) - O retorno de getParameterValues é um array de Strings. - Cuidado  O nome do parâmetro é sensitive case. - Cuidado  Se o parâmetro não existir na requisição, getParameterValues retorna null. @regismelo 104
  • Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• java.util.Map getParameterMap()  - Retornar todos os parâmetros passados na requisição, no formato de um Map. @regismelo 105
  • Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• getMethod()  - Retorna o método utilizado para submeter os dados (GET, POST ou PUT).• getQueryString()  - Retorna a query postada (URL).• getParameterNames()  - Retorna um Enumeration de Strings contendo o nome de todos os parâmetros passados na requisição. @regismelo 106
  • Java Básico – Módulo 1 Java Web Construindo um formulário<html><form action="./servlet/Formulario" method="get"> <p> <input name="nome" type="text" value="Digite seu nome aqui!" size="40" maxlength="40"> </p> <p>Interesses:</p> <SELECT NAME=“preferencias" MULTIPLE> <OPTION VALUE=“1"> Musica </OPTION> <OPTION VALUE=“2"> Computadores </OPTION> <OPTION VALUE=“3"> Ocio </OPTION> </SELECT> <p> <input type="submit" name="Submit" value="Submit"> </p></form></html>@regismelo 107
  • Java Básico – Módulo 1 Java Web Servlet Formulariopublic class Formulario extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println("<HTML><HEAD><TITLE></TITLE>"); String nome = request.getParameter("nome"); out.println( "Nome --> " + nome + "<p>"); String[] dados = request.getParameterValues(“preferencias"); if ( dados == null ) out.println( "Dados é null." ); else for( int i=0; i < dados.length; i++ ) out.println( dados[i] ); }} @regismelo 108
  • Java Básico – Módulo 1 Java Web Entendedo o exemplo• Os dados do formulário são submetidos via GET;• Isso significa que também podemos disparar o servlet fazendo uma requisição na URL do tipo:http://localhost:8080/curso/servlet/Formulario ?nome=blabla&preferencias=1& preferencias=2 @regismelo 109
  • Java Básico – Módulo 1 Java Web Alterando o exemplo• Vamos alterar o exemplo anterior para que ele exiba todos os parâmetros passados;• Vamos utilizar o método getParameterNames para descobrir quais parâmetros foram passados para o formulário;• E o getParameterValues para obter os valores da requisição. @regismelo 110
  • Java Básico – Módulo 1 Java Web Servlet Formulario2public class Formulario2 extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponseresponse ) throws IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.println( "<p><b> " + paramName + "</b><p>"); String[] paramValues = request.getParameterValues(paramName); for( int i=0; i < paramValues.length; ++i ) { out.print( "--> " + paramValues[i]); } }} @regismelo 111
  • Java Básico – Módulo 1 Java Web Suportando Post• Para fazer com que o servlet suporte GET, implementamos o método doGet;• Para fazer com que o servlet suporte POST, devemos implementar o método doPost. public void doPost( HttpServletRequest request, HttpServletResponse response ) @regismelo 112
  • Java Básico – Módulo 1 Java Web Suportando Post• Normalmente, é interessante suportar tanto get quanto post;• Para isso, é só implementar os dois métodospublic void doPost( HttpServletRequest request, HttpServletResponse response ) { ... }public void doGet ( HttpServletRequest request, HttpServletResponse response ) { ... } @regismelo 113
  • Java Básico – Módulo 1 Java Web Exercício• Construa um servlet que recebe as requisições de um formulário e exiba no browser;• Crie um servlet que mostre a lista de fatoriais entre 0 e 10;• Altere o servlet fatorial de forma que ele receba o valor máximo do fatorial a ser calculado e exiba o resultado do cálculo em uma tabela HTML. @regismelo 114
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter3.pdf)3.1 The Role of Form Data3.2 Reading Form Data from Servlets3.3 Example: Reading Three Explicit Parameters3.4 Example: Reading All Parameters3.5 A Resume Posting Service3.6 Filtering Strings for HTML-Specific Characters Code for Filtering Example @regismelo 115
  • Java Básico – Módulo 1 Java Web Módulo VIProcessamento e ciclo de vida de um Servlet@regismelo 116
  • Java Básico – Módulo 1 Java Web Servlet = Multi-Thread• Como já mencionamos, servlets são multi-thread;• A mesma instância do servlet processa diversas requisições. @regismelo 117
  • Java Básico – Módulo 1 Java Web Servlet = Multi Thread• Portanto, é importante programarmos os servlets de modo “thread safe”;• Isso significa – nada de propriedades de instância sendo utilizadas!• Cuidado com o acesso a recursos que podem ser danificados com o acesso multi-thread (arquivos, por exemplo). @regismelo 118
  • Java Básico – Módulo 1 Java Web Servlet Não Thread Safepublic class Problema extends HttpServlet{ public String nome; public void doGet ( HttpServletRequest request, HttpServletResponse response ) { nome = request.getParameter(“nome”); doSomething(); } public void doSomething() { deletarCliente(nome); Nome é uma propriedade } Não thread safe, compartilhada} pela mesma Instância do servlet  Problemas  @regismelo 119
  • Java Básico – Módulo 1 Java Web Servlet Thread Safepublic class Solucao extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) { String nome = request.getParameter(“nome”); doSomething(nome); } public void doSomething( String nome ) { deletarCliente(nome); } Nome é uma variável local.} Sem problemas com threads!  @regismelo 120
  • Java Básico – Módulo 1 Java Web Interface SingleThreadModel• Você pode sinalizar ao container para serializar o acesso a um servlet;• Basta fazer que seu servlet implemente a interface SingleThreadModel;• O Container pode garantir isso tornando o acesso ao servlet synchronized ou criando um pool de servlets, despachando cada acesso a um novo servlet. @regismelo 121
  • Java Básico – Módulo 1 Java Web Interface SingleThreadModel@regismelo 122
  • Java Básico – Módulo 1 Java Web Interface SingleThreadModel• Cuidado! O acesso serializado ao servlet diminui drasticamente a performance!!• Use-o somente quando for extremamente necessário (acesso a um arquivo no disco, por exemplo).• Na versão 2.4 da API de Servlets, SingleThreadModel está deprecated. @regismelo 123
  • Java Básico – Módulo 1 Java Web SingleThreadModelpublic class Solucao extends HttpServlet implements SingleThreadModel{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) { doSomething(); } } @regismelo 124
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet@regismelo 125
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet• O ciclo de vida de um servlet é controlado pelo container;• Quando o servidor recebe uma requisição, ela é repassada para o container que a delega a um servlet. O container: 1 – Carrega a classe na memória; 2 – Cria uma instância da classe do servlet; 3 – Inicializa a instância chamando o método init()• Depois que o servlet foi inicializado, cada requisição é executado em um método service() • O container cria um objeto de requisição (ServletRequest) e de resposta (ServletResponse) e depois chama service() passando os objetos como parâmetros; • Quando a resposta é enviada, os objetos são destruídos.• Quando o container decidir remover o servlet da memória, ele o@regismelo chamando o método destroy() finaliza 126
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – init()• O método init() é disparado quando o servlet é carregado;• Você deve sobrescrevê-lo quando necessitar inicializar o servlet de alguma forma;• A sintaxe do método é: public void init(ServletConfig config) throws ServletException Sobrescreva esse public void init() método caso throws ServletException necessite inicializar algo @regismelo 127
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – init()• Caso você tenha algum problema na inicialização do Servlet, você deverá disparar a exceção UnavailableException (subclasse de ServletException). ... public void init() throws ServletException { String dir = getInitParameter(“diretorio”); // Problemas ao ler configuracao? if ( dir == null ) throw new UnavailableException(“Erro na configuracao!”) } @regismelo 128
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – service()• O método service() é o método que irá disparar o doGet ou doPost.• Ele é um método abstrato na sua declaração em GenericServlet. HttpServlet implementa esse método repassando a chamada para doGet ou doPost. @regismelo 129
  • Java Básico – Módulo 1 Java Web Diagrama de classes• Servlets não necessariamente estão ligados a aplicações web. Essa é a razão de existir a classe GenericServlet e a implementação HttpServlet @regismelo 130
  • Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – destroy()• O método destroy() é chamado pelo container antes do servlet ser destruído;• O momento em quem o servlet será desativado é decidido pelo container;• É a última oportunidade para “limpar a casa”. public void destroy() { ... } @regismelo 131
  • Java Básico – Módulo 1 Java Web Processamento em Background• Um servlet pode fazer mais que simplesmente servir clientes;• Ele pode trabalhar entre os acessos;• Essa é uma habilidade interessante para processos muito demorados;• Um cliente pode, por exemplo, disparar um processo e eventualmente ficar consultando o resultado do processamento. @regismelo 132
  • Java Básico – Módulo 1 Java Web …Processamento em Background• Para exemplificar, vamos criar um servlet que calcule números primos;• Para fazer com que o processamento demore bastante, vamos iniciar a busca por números primos a partir de 1.000.000 (hum milhão);• Vamos utilizar um thread para ficar realizando o processamento em background. @regismelo 133
  • Java Básico – Módulo 1 Java Web ServletBackgroundimport java.io.*; import java.util.*;import javax.servlet.*; import javax.servlet.http.*;public class ServletBackground extends HttpServletimplements Runnable{private long lastprime = 0; // Ultimo primo encontradoDate lastprimeModified = new Date();Thread searcher; // Thread para buscapublic void init() throws ServletException { searcher = new Thread( this ); searcher.setPriority( Thread.MIN_PRIORITY ); searcher.start();}// ... Continua  @regismelo 134
  • Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuaçãopublic void run() { long candidate = 1000001L; // um milhao e um // Loop para buscar eternamente primos... while (!searcher.interrupted()) { if (isPrime(candidate)) { lastprime = candidate; lastprimeModified = new Date(); } candidate += 2; // Nos. pares não são primos // Dormir por 200ms... try { Thread.sleep(200); } catch (InterruptedException ignored) { } } @regismelo 135}
  • Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuaçãoprivate static boolean isPrime(long candidate) { long sqrt = (long) Math.sqrt(candidate); for (long i = 3; i <= sqrt; i += 2) { if (candidate % i == 0) return false; } return true;}public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); if (lastprime == 0) { out.println(“Procurando o 1o. primo..."); } else {out.println(“O último primo encontrado foi " + lastprime); out.println(" em " + lastprimeModified); } @regismelo 136}
  • Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuação public void destroy() { // Sinalizar para o thread parar... searcher.interrupt(); }} @regismelo 137
  • Java Básico – Módulo 1 Java Web Exercício• Crie um servlet que exibe (usando System.out.println) os devidos eventos do ciclo de vida (init, service e destroy);• Implementa o exemplo ServletBackground e observe-o funcionar. @regismelo 138
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter2.pdf)2.6 The Servlet Life Cycle – The init Method – The service Method – The doGet, doPost, and doXxx Methods – The SingleThreadModel Interface – The destroy Method @regismelo 139
  • Java Básico – Módulo 1 Java Web Módulo VII Obtendo informações do ambiente@regismelo 140
  • Java Básico – Módulo 1 Java Web Obtendo informações• Em alguns casos é bastante importante conhecer informações do ambiente cliente e servidor;• Por exemplo, você pode decidir utilizar JavaScript ou não, dependendo da capacidade do browser que fez a requisição;• Ou, até mesmo, exibir a página utilizando uma outra língua, dependo do cliente que fez a requisição. @regismelo 141
  • Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• getLocale()  - Retorna o “Locale” associado ao cliente; - Locale é um objeto java, que dá informações relativas a localização; - As informações são extraídas a partir de Accept- Language. Se o cliente não prover esse cabeçalho HTTP, getLocale retorna o Locale default do servidor. @regismelo 142
  • Java Básico – Módulo 1 Java Web Localizacaopublic class Localizacao extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( "<p> getDisplayName --> " + request.getLocale().getDisplayName() ); out.println( "<p> getCountry --> " + request.getLocale().getCountry() ); out.println( "<p> getDisplayLanguage --> " + request.getLocale().getDisplayLanguage() ); out.println( "<p> getISO3Country --> " + request.getLocale().getISO3Country() ); out.println( "<p> getISO3Country --> " + request.getLocale().getISO3Language() ); out.close(); } } @regismelo 143
  • Java Básico – Módulo 1 Java Web Rodando o exercício anterior@regismelo 144
  • Java Básico – Módulo 1 Java Web Obtendo informaçõesDicas com relação ao Locale• getISO3Country  - Retorna 3 bytes indicando o país; - Você pode obter a lista dos países em http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html - Alguns países: - BRA – Brasil; - USA – Estados Unidos; - ARG – Argentina @regismelo 145
  • Java Básico – Módulo 1 Java Web Obtendo informaçõesDicas com relação ao Locale• getISO3Language  - Retorna 3 bytes indicando a linguagem preferencial do cliente; - Você pode obter a lista das linguagens em http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt - Algumas linguagens: - por – Português; - eng – Inglês. @regismelo 146
  • Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• String getHeader( String name )  - Obtém o valor associado a um determinado header• Enumeration getHeaderNames()  - Obtém o nome de todos os headers da requisição- Headeres úteis: - user-agent – Indica o browser e o S.O. do cliente; - refer – Indica de onde o usuário veio (a URL). @regismelo 147
  • Java Básico – Módulo 1 Java Web HttpHeaderpublic class HttpHeaderExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Enumeration enum = request.getHeaderNames(); String header; while( enum.hasMoreElements() ) { header = (String)enum.nextElement(); out.println( "<p> " + header + " --> "); out.println( request.getHeader( header ) ); } out.close(); }} @regismelo 148
  • Java Básico – Módulo 1 Java Web HttpHeader@regismelo 149
  • Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• String getRemoteAddr()  - Retorna o endereço IP do cliente que fez a requisição• String getRemoteHost()  - Retorna o nome do cliente que fez a requisição.- Com esses métodos você consegue saber quem acessa o seu site. @regismelo 150
  • Java Básico – Módulo 1 Java Web HttpAddrExemplopublic class HttpAddrExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( "<p> getRemoteAddr --> " + request.getRemoteAddr() ); out.println( "<p> getRemoteHost --> " + request.getRemoteHost() ); out.close(); }} @regismelo 151
  • Java Básico – Módulo 1 Java Web HttpAddrExemplo@regismelo 152
  • Java Básico – Módulo 1 Java Web Exercício• Construa um servlet que a partir da requisição do cliente exibe qual o browser está sendo utilizado e qual S.O.;• Além disso, o servlet deverá exibir o IP do cliente;• O Servlet deverá mostrar a frase: “The quick brown fox jumps over the lazy dog” ou “A rápida raposa castanha pula sobre o cachorro preguiçoso” Dependendo da língua preferida do usuário. Dica  Para mudar as configurações de língua, no Internet Explorer acesse o menu Tools/Internet Options/Languages. @regismelo 153
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP PagesCHAPTER 5 (CSAJSP-Chapter5.pdf) Accessing the Standard CGI Variables 5.1 Servlet Equivalent of CGI Variables 5.2 A Servlet That Shows the CGI VariablesCHAPTER 6 (CSAJSP-Chapter6.pdf) Generating the Server Response: HTTP Status Codes 6.1 Specifying Status Codes 6.2 HTTP 1.1 Status Codes and Their Purpose 6.3 A Front End to Various Search EnginesCHAPTER 7(CSAJSP-Chapter7.pdf) Generating the Server Response: HTTP Response Headers 7.1 Setting Response Headers from Servlets 7.2 HTTP 1.1 Response Headers and Their Meaning 7.3 Persistent Servlet State and Auto-Reloading Pages 7.4 Using Persistent HTTP Connections 7.5 Using Servlets to Generate GIF Images@regismelo 154
  • Java Básico – Módulo 1 Java Web Módulo VIIIControle de fluxo e colaboração@regismelo 155
  • Java Básico – Módulo 1 Java Web Controle de Fluxo• Utilizando técnicas de controle de fluxo você pode redirecionar uma requisição;• Redirecionar, significa ir para uma outra página ou um outro servlet;• Você pode, por exemplo, receber uma requisição gerada a partir de uma página estática, fazer um processamento, e desviar para uma página dinâmica. @regismelo 156
  • Java Básico – Módulo 1 Java Web Controle de Fluxo• A primeira maneira de redirecionar uma página é retornando para o browser um cabeçalho HTTP de forma que ele gere uma nova requisição para outra página; @regismelo 157
  • Java Básico – Módulo 1 Java Web Controle de FluxoMétodo de HttpServletResponse• void sendRedirect(String location)  - Retorna um status HTTP que força o cliente a fazer uma nova requisição a nova location. - OBS: Você só pode utilizar esse método antes do response ser enviado para o cliente, do contrário, o método disparará IllegalStateException. @regismelo 158
  • Java Básico – Módulo 1 Java Web SendRedirectExemplopublic class SendRedirectExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { // Faça alguma coisa aqui ... response.sendRedirect( “http://www.sagaranatech.com“ ); // Oops!Nesse ponto você não pode mais gerar conteúdo! }} @regismelo 159
  • Java Básico – Módulo 1 Java Web Desvantagens do sendRedirect• O método sendRedirect retorna para o browser um código HTTP que faz com que ele faça outra requisição;• Isso significa que para o redirecionamento acontecer, outra requisição é necessária;• Essa é uma abordagem que pode ser lenta... @regismelo 160
  • Java Básico – Módulo 1 Java Web Redirecionamento• Existe uma outra forma de redirecionar, sem necessitar uma nova requisição;• É mais rápido redirecionar dentro do próprio servidor (sem realizar uma nova requisição);• Antes de ver como redirecionar, vamos aprender um pouco sobre “Servlet Collaboration”. @regismelo 161
  • Java Básico – Módulo 1 Java Web Servlet Collaboration• Eventualmente é interessante se comunicar com outros servlets dentro do mesmo servidor;• Damos a isso o nome de “colaboração”;• O seu servlet, por exemplo, pode fazer algum processamento e transferir a responsabilidade de lidar com a requisição para outro servlet. @regismelo 162
  • Java Básico – Módulo 1 Java Web Servlet Collaboration• Para suportar delegação, a API 2.1 de servlets inclue a interface javax.servlet.RequestDispatcher;• Utilize o método public RequestDispatcher ServletRequest.getRequestDispatcher(String path)• Dessa forma, você só pode redirecionar para recursos dentro do mesmo contexto. @regismelo 163
  • Java Básico – Módulo 1 Java Web Contextos?• Web Containers suportam a implantação de múltiplas aplicações web; – Definindo contextos separados para execução de servlets• No TomCat, essas aplicações estão na pasta webapps/• Todo diretório de contexto tem uma estrutura definida, que consiste de – Área de documentos do contexto (/), acessível externamente; – Área inacessível (/WEB-INF), que possui pelo menos um arquivo de configuração padrão (web.xml); – O WEB-INF pode conter ainda dois diretórios reconhecidos pelo servidor: o classpath da aplicação (WEB-INF/classes) e outro JARs para inclusão no classpath (/WEB-INF/lib). @regismelo 164
  • Java Básico – Módulo 1 Java Web Contextos• Contextos isolam as aplicações web;• A grande vantagem dos contextos é que uma aplicação não “quebra” outra aplicação;• Tudo está isolado, inclusive as classes que estão na memória. @regismelo 165
  • Java Básico – Módulo 1 Java Web Contextos@regismelo 166
  • Java Básico – Módulo 1 Java Web Servlet Collaboration• Voltando para o RequestDispatcher... public RequestDispatcher ServletRequest.getRequestDispatcher(String path)• O objeto RequestDispatcher possui dois métodos importantes: – forward( ServletRequest request, ServletResponse response )  - Redireciona para a página; – include( ServletRequest request, ServletResponse response )  - Inclue a página no response. @regismelo 167
  • Java Básico – Módulo 1 Java Web ForwardExemploimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;public class ForwardExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); rd.forward( request, response ); }} @regismelo 168
  • Java Básico – Módulo 1 Java Web IncludeExemploimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;public class IncludeExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); rd.include( request, response ); }} @regismelo 169
  • Java Básico – Módulo 1 Java Web IncludeExemplo2public class IncludeExemplo2 extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); RequestDispatcher rd = request.getRequestDispatcher("/Menu.html" ); rd.include( request, response ); out.println( "Regis Melo" ); rd = request.getRequestDispatcher("/Bottom.html" ); rd.include( request, response ); }} @regismelo 170
  • Java Básico – Módulo 1 Java Web Definindo atributos• Na API de Servlets, você pode disponibilizar informações entre servlets através da requisição;• O tempo de vida dessas informações é curto – somente o tempo da requisição. @regismelo 171
  • Java Básico – Módulo 1 Java Web Definindo atributosMétodos da interface ServletRequest• setAttribute( String name, Object o )  - Disponibiliza uma informação que só será visível para essa requisição;• removeAttribute( String name )  - Remove um atributo da requisição• Object getAttribute( String name )  - Obtém o atributo da requisição• Enumeration getAttributeNames()  - Retorna o nome de todos os atributos na requisição. @regismelo 172
  • Java Básico – Módulo 1 Java Web ForwardExemplo// import ...public class ForwardExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); request.setAttribute( “cdCliente”, new Integer(10) ); rd.forward( request, response ); } Esse atributo estará disponível} para a página que está sendo redirecionada @regismelo 173
  • Java Básico – Módulo 1 Java Web Exercício• Defina um arquivo HTML representando um header, outro representando um footer;• Faça com que seu servlet inclua esses dois arquivos e exiba um conteúdo qualquer. @regismelo 174
  • Java Básico – Módulo 1 Java Web Exercício• Crie um novo servlet que receberá os dados de um formulário e gravará no banco de dados;• Caso os dados sejam gravados com sucesso, redirecione para uma página estática, mostrando sucesso;• Caso algum erro aconteça, redirecione para uma página de erro. @regismelo 175
  • Java Básico – Módulo 1 Java Web Exercício• Ainda no mesmo exercício, crie um link na sua aplicação que listará os dados de uma tabela no banco de dados;• Você deverá criar dois servlets - um deverá fazer a consulta no banco de dados, e disponibilizar na requisição os registros utilizando um ArrayList. Após feito isso, esse servlet deverá redirecionar para outro servlet que construirá a página a partir do ArrayList disponibilizado na requisição. @regismelo 176
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter15.pdf)15.1 Forwarding Requests 354 Using Static Resources 354 Supplying Information to the Destination Pages 355 Interpreting Relative URLs in the Destination Page 357 Alternative Means of Getting a RequestDispatcher 35815.2 Example: An On-Line Travel Agent 35815.3 Including Static or Dynamic Content 37515.4 Example: Showing Raw Servlet and JSP Output 37715.5 Forwarding Requests From JSP Pages 380@regismelo 177
  • Java Básico – Módulo 1 Java Web Módulo IX Cookies@regismelo 178
  • Java Básico – Módulo 1 Java Web Cookies• “Cookies são pequenas informações, enviadas pelo web server para um browser, que pode ser lida posteriormente do browser”;• Cookies foram introduzidos no Netscape Navigator (Netscape 0.94 beta);• Apesar de não serem um padrão oficial (definido pela IETF, Internet Engineering Task Force), cookies se tornaram um padrão de fato.• Atualmente, a especificação está padronizada através da RFC 2109 (http://www.ietf.org/rfc/rfc2109.txt) @regismelo 179
  • Java Básico – Módulo 1 Java Web Cookies• A API Servlet provê a classe javax.servlet.http.Cookie para trabalhar com cookies;• Todos os detalhes do cookie, são gerenciados pela API.• Para criar um cookie new javax.servlet.http.Cookie( String name, String value )• Para adicionar um cookie Cookie cookie = new Cookie( “ID”, “1975” ); response.addCookie( cookie ) @regismelo 180
  • Java Básico – Módulo 1 Java Web Cookies• Cuidado! – Os cookies são enviados no cabeçalho HTTP, portanto, você deve adicionar os cookies antes de fechar o response; – Por padrão, os browsers devem suportar, no máximo, 20 cookies por site, 300 por usuário e limitam o tamanho dos cookies a no máximo 4096 bytes. @regismelo 181
  • Java Básico – Módulo 1 Java Web Cookies• Para recuperar os cookies gravados, use: public Cookie cookie[ ] = request.getCookies()• Esse método, retorna um array de cookies que contém todos os cookies enviados pelo browser ou um array vazio, se nenhum cookie for enviado;• Cuidado! A API Servlet anterior a versão 2.1 podia retornar null se nenhum cookie fosse enviado. Por isso, considere que isso pode acontecer. @regismelo 182
  • Java Básico – Módulo 1 Java Web Cookies• O código abaixo, exibe todos os cookies com seus devidos valores: public class Biscoito extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Cookie[] cookies = request.getCookies(); for( int i=0, n = cookies.length; i < n; i++ ) { out.println( “<p>” ); out.println( “Name – “ + cookies[i].getName() ); out.println( “Valor – “ + cookies[i].getValue() ); } out.close(); } @regismelo 183 }
  • Java Básico – Módulo 1 Java Web Cookies• Uma boa dica para o uso de cookies é salvar um ID de usuário para personalizar o conteúdo;• Diversos sites realizam esse tipo de operação. A Amazon, por exemplo;• Porém, cuidado! O usuário poderá excluir ou até mesmo desabilitar os cookies.• Usar cookies “impunemente” é uma péssima prática. @regismelo 184
  • Java Básico – Módulo 1 Java Web Principais métodos da classe Cookie• setDomain(String pattern)  - Especifica o domínio relativo ao cookie. Normalmente é relativo ao seu site.• setMaxAge(int expiry)  - Indica em quanto tempo o cookie vai expirar (segundos). Um valor negativo, indica o default, que o cookie irá expirar quando o browser for fechado. Zero, indica que o cookie será deletado imediatamente (é necessário dar um response.addCookie para isso funcionar).• setSecure(boolean flag)  - Se TRUE, o cookie só será enviado em um canal seguro, como SSL. @regismelo 185
  • Java Básico – Módulo 1 Java Web Exercício• Construa um servlet que realiza um login e guarde o usuário que logou em um cookie;• Da próxima vez que o usuário acessar seu site, ao invés de pedir um login, exiba uma saudação ao usuário. @regismelo 186
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter8.pdf)CHAPTER 8 Handling Cookies8.1 Benefits of Cookies Identifying a User During an E-commerce Session Avoiding Username and Password Customizing a Site Focusing Advertising8.2 Some Problems with Cookies8.3 The Servlet Cookie API Creating Cookies Cookie Attributes Placing Cookies in the Response Headers Reading Cookies from the Client8.4 Examples of Setting and Reading Cookies8.5 Basic Cookie Utilities Finding Cookies with Specified Names Creating Long-Lived Cookies8.6 A Customized Search Engine Interface @regismelo 187
  • Java Básico – Módulo 1 Java Web Módulo X Gerenciamento de Sessões@regismelo 188
  • Java Básico – Módulo 1 Java Web Sessões• O protocolo HTTP não mantém estado, chama-se isso de stateless;• Isso causa um grande problema – cada requisição de um usuário é uma nova requisição;• Isso é ótimo para escalabilidade;• Mais péssimo quando se deseja saber “quem” é o usuário. @regismelo 189
  • Java Básico – Módulo 1 Java Web Sessões• E em que situação necessita-se saber “quem” é o usuário??• Imagine, um carrinho de compras como o da Amazon...• Se a cada requisição, temos um novo e desconhecido usuário, como iríamos manter os dados do carrinho de compras? @regismelo 190
  • Java Básico – Módulo 1 Java Web Sessões• Para esse tipo de situação os containers criaram a possibilidade de gerenciar sessões;• Sessões representam um cliente – São únicas para cada cliente e persistem entre requisições @regismelo 191
  • Java Básico – Módulo 1 Java Web Sessões• Sessões são representadas por objetos HttpSession e são obtidas a partir de uma requisição;• Entenda uma sessão como uma área de memória, reservada para um cliente no container;• Nessa área de memória, você pode colocar qualquer objeto java. @regismelo 192
  • Java Básico – Módulo 1 Java Web Sessões• Para obter uma sessão: HttpSession session = request.getSession( false ); Ou... False indica que se a sessão não estiver criada, ela não sera criada. Nesse caso, o método retornará null. HttpSession session = request.getSession()  getSession(), sem parâmetros, sempre cria uma sessão, caso ela não exista. @regismelo 193
  • Java Básico – Módulo 1 Java Web Sessões• Para saber se uma sessão é nova, use o método isNew() MyObject obj; if ( session.isNew() ) { obj = new MyObject(); } else { obj = session.getAttribute( “id” ); } @regismelo 194
  • Java Básico – Módulo 1 Java Web Principais Métodos de HttpSession• setAttribute( String name, Object o )  - Guarda um objeto na sessão.• Object getAttribute( String name )  - Obtém um determinado objeto armazenado na sessão. Caso ela não exista, o método retorna null.• removeAttribute( String name )  - Remove o atributo da sessão.• getId()  - Retorna o número da sessão. Toda sessão tem um número único. @regismelo 195
  • Java Básico – Módulo 1 Java Web Compartilhando dados na sessão• Como já dissemos os dados colocados em uma sessão ficam vivos entre requisições do usuário: Requisição 1  String[] vetor = { “1”, “2”, “3” }; HttpSession session = request.getSession(); session.setAttribute( “dados”, vetor ); Requisição 2  HttpSession session = request.getSession(); String[] dadosObtidos = (String[])session.getAttribute(“dados”); @regismelo 196
  • Java Básico – Módulo 1 Java Web Gerenciando Sessões• Não há como saber que o cliente não precisa mais de uma sessão;• Por isso, o container pode “expirar” uma sessão baseado na inatividade do usuário;• O tempo padrão configurado no TomCat é de 30 minutos. @regismelo 197
  • Java Básico – Módulo 1 Java Web Métodos para gerência de sessões• setMaxInactiveInterval(int segundos)  - Especifica o tempo máximo de inatividade, em segundos. Um valor negativo indica que a sessão nunca irá expirar.• Int getMaxInactiveInterval() - Recupera o valor do timeout.• invalidate() - Invalida (destrói) a sessão. Use-o, por exemplo, na opção de logoff do seu sistema. @regismelo 198
  • Java Básico – Módulo 1 Java Web Como os containers gerenciam sessões?• Os containers gerenciam sessões usando cookies especiais;• Esses cookies são os chamados cookies de sessão;• Em geral, esse mecanismo funciona bem. Porém o usuário pode desabilitar os cookies no browser;• Para contornar esse problema o container pode usar o mecanismo de reescrita de URL. @regismelo 199
  • Java Básico – Módulo 1 Java Web...Como os containers gerenciam sessões?• Reescrita de URL faz com que o número da sessão, HttpSession.getId(), seja passado como parâmetro na URL;• Para isso, sempre que você criar um hiperlink, use o método HttpServletResponse.encodeUrl: out.print( “<a href=‘” + response.encodeURL(“pagina.jsp” ) + “’>” );• Se o cliente suportar cookies, nada acontecerá. Se ele não suportar, o ID da sessão será passado como parâmetro: ex: http://www.cejug.org/pagina.jsp?jsessionid=KPT1275 @regismelo 200
  • Java Básico – Módulo 1 Java Web Escopo de objetos em Servlets• Servlets compartilham informações de várias maneiras; – Usando meios persistentes (banco de dados, arquivos, etc); – Usando objetos na memória por escopo (requisição, sessão, contexto); – Usando variáveis estáticas ou de instância.• Servlets oferecem 3 níveis diferentes de persistência na memória (ordem decrescente de duração) – Contexto da aplicação – vale enquanto a aplicação estiver na memória (ServletContext, obtido através do método getServletContext()); – Sessão – dura uma sessão do cliente (HttpSession); – Requisição – dura uma requisição (ServletRequest) @regismelo 201
  • Java Básico – Módulo 1 Java Web@regismelo 202
  • Java Básico – Módulo 1 Java Web Escalabilidade x Tamanho das sessões• Cuidado ao armazenar informações em sessões!• Se você guardar 100kb em uma sessão e tiver um usuário, você estará ocupando 100kb;• Se você tiver 1.000 usuários...• Se você tiver 1.000.000 de usuários... @regismelo 203
  • Java Básico – Módulo 1 Java Web Exercício• Vamos construir o site da Amazon;• Os requisitos são os seguintes: – Ter um carrinho de compras (usando sessões); – Identificar o usuário na sua próxima visita ao site (usando cookies); – Ter uma opção para listar o conteúdo do carrinho de compras; – Persistir os dados do carrinho de compras quando o usuário optar por finalizar a compra; – Ter uma opção de logout do site que invalidará a sessão. @regismelo 204
  • Java Básico – Módulo 1 Java Web Exercício@regismelo 205
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter9.pdf)CHAPTER 9 Session Tracking9.1 The Need for Session Tracking Cookies URL-Rewriting Hidden Form Fields Session Tracking in Servlets9.2 The Session Tracking API Looking Up the HttpSession Object Associated with the Current Request Looking Up Information Associated with a Session Associating Information with a Session Terminating Sessions Encoding URLs Sent to the Client9.3 A Servlet Showing Per-Client Access Counts9.4 An On-Line Store Using a Shopping Cart and Session Tracking Building the Front End Handling the Orders Behind the Scenes: Implementing the Shopping Cart and Catalog Items @regismelo 206
  • Java Básico – Módulo 1 Java Web Módulo XI Java Server Pages@regismelo 207
  • Java Básico – Módulo 1 Java Web Problemas com Servlets• Servlets forçam o programador a embutir código HTML dentro de código Java;• Grande desvantagem se a maior parte do que tem que ser gerado é HTML estático;• Servlets = Páginas que não podem ser mantidas por WebDesigners;• Mistura de funções – Programador x WebDesigner. @regismelo 208
  • Java Básico – Módulo 1 Java Web Introdução• Servlets – Código Java produzindo HTML;• JSP – Código HTML com trechos de código Java para produzir dinamismo;• Muito semelhante a ASP – Active Server Pages;• Todo o poder de Java e toda a API de Servlets disponível. @regismelo 209
  • Java Básico – Módulo 1 Java Web Exemplo<%@ page import=“java.text.*, java.util.*” %><HTML><BODY><% Date d = new Date(); String hoje = DateFormat.getDateInstance().format(d);%>Hoje é: <%=hoje%></BODY></HTML>@regismelo 210
  • Java Básico – Módulo 1 Java Web Entendendo o exemplo• A idéia é que o código Java contido entre os delimitadores “<%” e “%>” será interpretado pelo container;• Na verdade, toda página JSP primeiro é compilada como um servlet para só depois ser executada;• Isso significa que o código roda compilado (performance)! @regismelo 211
  • Java Básico – Módulo 1 Java Web Arquitetura Fase de Tradução e Fase de Processamento @regismelo 212
  • Java Básico – Módulo 1 Java Web Entendendo o exemplo• O processo de geração do servlet a partir da página JSP só acontece na primeira chamada a página (o container é esperto para saber quando é necessário gerar novamente o servlet da página JSP);• Percebe-se que o primeiro acesso, do primeiro usuário será mais lento que todos os demais acessos;• O servlet gerado a partir da página JSP é um servlet como outro qualquer, obedecendo alguns métodos básicos;• Como o servlet será gerado, poderá variar de container para container. @regismelo 213
  • Java Básico – Módulo 1 Java Web Processamento@regismelo 214
  • Java Básico – Módulo 1 Java Web@regismelo 215
  • Java Básico – Módulo 1 Java Web Sintaxe Básica Elementos de Script  Código Java que é incluído no servlet gerado a partir da página  Acesso a variáveis pré-definidas Diretivas  Permite controlar a estrutura do servlet Ações  Especifica componentes a serem usados.@regismelo 216
  • Java Básico – Módulo 1 Java Web Elementos de Script Expressões <%= expressão %> Scriptlets <% código %> Declarações de métodos e variáveis <%! código %>@regismelo 217
  • Java Básico – Módulo 1 Java Web Expressões <%= expressão %> <%=myBean.getName()%> Hoje é <%= new java.util.Date()%> Acesso às variáveis pré-definidas  request, response, session, out etc  Host: <%= request.getRemoteHost() %>@regismelo 218
  • Java Básico – Módulo 1 Java Web Scriptlets• Código que será incluído no método jspService() do servlet gerado a partir da página• <% código Java %>• Também permite acesso às variáveis pré- definidas• <% String nome = request.getParameter(“NOME”) %>• Pode ser “intercalado” com código HTML@regismelo 219
  • Java Básico – Módulo 1 Java Web Scriptlets <% if (Math.random() < 0.5) { %> Tenha um <B>bom</B> dia! <% } else { %> Tenha um <B>mau</B> dia! <% } %> <% if (Math.random() < 0.5) { out.println(“Tenha um <B>bom</B> dia!”); } else { out.println(“Tenha um <B>mau</B> dia!”); } %>@regismelo 220
  • Java Básico – Módulo 1 Java Web Declarações• <%! código %>• Variáveis e métodos que são inseridos no código do servlet gerado, fora do método jspService()• <%! int i = 0; %>• <%! public void function() { //código } %>@regismelo 221
  • Java Básico – Módulo 1 Java Web Diretivas• <%@ diretiva atributo=“valor” %>• Especificadas no início da página.• As principais são: – page • Permite alterar configurações do servlet gerado. – include • Permite a inclusão de um arquivo no servlet durante a geração deste. – taglib • Permite o uso de tags definidas pelo desenvolvedor.@regismelo 222
  • Java Básico – Módulo 1 Java Web page• import=“package.class” – <%@ page import=“java.util.*” %>• contentType=“MIME-Type” – <%@ page contentType=“text/plain” %>• isThreadSafe=“true|false” – Indica serialização do servlet ou não@regismelo 223
  • Java Básico – Módulo 1 Java Web page• session=“true|false” – Indica se a página vai pertencer a sessão corrente ou não. – Se for false não é possível acessar a variável session.• buffer=“sizekb|none” – Indica tamanho do buffer da variável out.• autoFlush=“true|false” – Indica se o buffer deve ser esvaziado quando cheio@regismelo 224
  • Java Básico – Módulo 1 Java Web page• extends=“package.class” – Indica qual a super-classe do servlet gerado.• info=“mensagem” – Indica uma String que pode ser obtida através do método getServletInfo()@regismelo 225
  • Java Básico – Módulo 1 Java Web page• errorPage=“url” – Especifica uma página que deve processar quaisquer exceções disparadas e não tratadas na página corrente• isErrorPage=“true|false” – Especifica se a página corrente é a página que pode processar as exceções não tratadas@regismelo 226
  • Java Básico – Módulo 1 Java Web include• <%@ include file=“url relativa” %>• Indicada para inclusão de partes comuns a várias páginas como cabeçalhos ou rodapés. <HTML> <TITLE>Curso de JSP</TITLE> <BODY> <%@ include file=“cabecalho.html” %> . . .@regismelo 227
  • Java Básico – Módulo 1 Java Web Exemplo<UL> <LI><B>Expressão.</B><BR> Your hostname: <%= request.getRemoteHost() %>. <LI><B>Scriptlet.</B><BR> <% out.println("Attached GET data: " + request.getQueryString()); %> <LI><B>Declaration (plus expression).</B><BR> <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= + +accessCount %> <LI><B>Directive (plus expression).</B><BR> <%@ page import = "java.util.*" %> Current date: <%= new Date() %></UL> @regismelo 228
  • Java Básico – Módulo 1 Java Web Exemplo@regismelo 229
  • Java Básico – Módulo 1 Java Web Variáveis Pré-Definidas• request – Instância da classe HttpServletRequest que permite acessar os parâmetros enviados através do método getParameter().• response – Instância de HttpServletResponse associada à resposta ao cliente.• out – Instância de PrintWriter usada para gerar saída para o cliente@regismelo 230
  • Java Básico – Módulo 1 Java Web Variáveis Pré-Definidas• session – Instância de HttpSession associada ao request• application – Obtida por getServletConfig().getContext()• page• exception@regismelo 231
  • Java Básico – Módulo 1 Java Web Escopo de Objetos@regismelo 232
  • Java Básico – Módulo 1 Java Web Ações• Utiliza XML na sua sintaxe• Controla o comportamento do interpretador JSP• Possibilita: – Inserção de arquivo – Uso de componentes JavaBeans – Chamar outra página – Criar código HTML para um plugin Java.@regismelo 233
  • Java Básico – Módulo 1 Java Web Ações• jsp:include• jsp:useBean• jsp:setProperty• jsp:getProperty• jsp:forward• jsp:plugin@regismelo 234
  • Java Básico – Módulo 1 Java Web jsp:include• Permite inserir arquivos na página gerada.• Difere da diretiva include no momento em que o arquivo é inserido. – Diretiva include insere o arquivo quando o servlet é gerado. Só é feito uma vez. – A ação insere o arquivo sempre que a página é requisitada.• <jsp:include page=“url relativa” />@regismelo 235
  • Java Básico – Módulo 1 Java Web jsp:useBean• Possibilita carregar um JavaBean e usá-lo na página JSP• <jsp:useBean id=“nome” class=“package.class” [scope=“page,request,session,application”]/>• Instancia um objeto da classe package.class e o associa à variável de nome name• É possível especificar um escopo para o Bean.• É possível utilizar um Bean já criado, desde que tenha mesmo id e mesmo escopo@regismelo 236
  • Java Básico – Módulo 1 Java Web jsp:useBean• <jsp:useBean ...> código• </jsp:useBean>• código só é executado quando o bean é instanciado.@regismelo 237
  • Java Básico – Módulo 1 Java Web jsp:setProperty• Permite modificar valores das propriedades do bean.• <jsp:setProperty name=“id” property=“propriedade” [value=“valor”] [param=“parâmetro”] />@regismelo 238
  • Java Básico – Módulo 1 Java Web jsp:getProperty• Obtém o valor de uma propriedade de um bean criado com um ação jsp:useBean.• <jsp:getProperty name=“id” property=“propriedade” />@regismelo 239
  • Java Básico – Módulo 1 Java Web Exemplo<HTML><BODY><P><jsp:useBean id="test" class="hall.SimpleBean" /><jsp:setProperty name="test" property="message" value="Hello WWW" /><H1>Message: <I><jsp:getProperty name="test" property="message" / > </I></H1></BODY></HTML>@regismelo 240
  • Java Básico – Módulo 1 Java Web jsp:forward• Permite passar o request para outra página.• <jsp:forward page=“url relativa” />@regismelo 241
  • Java Básico – Módulo 1 Java Web jsp:plugin• Permite inserir um applet Java na página.<jsp:plugin type="applet"code="Clock2.class" codebase="/examples/jsp/plugin/ap plet" jreversion="1.2" width="160" height="150" ></jsp:plugin>@regismelo 242
  • Java Básico – Módulo 1 Java Web Em resumo - JSP• JSP permite que o desenvolvedor mescle código Java com apresentação;• Bastante produtivo para o desenvolvimento de aplicações web;• Programador não precisa embutir apresentação HTML dentro do código (como servlets);• Todo o poder de Java para escrever aplicações WEB.@regismelo 243
  • Java Básico – Módulo 1 Java Web Exercício• Altere o site da Amazon (feito no módulo de servlets) reimplementado todas as interfaces para utilizar JSP. @regismelo 244
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages(CSAJSP-Chapter10) (CSAJSP-Chapter11.pdf)CHAPTER 10 JSP Scripting Elements CHAPTER 11 The JSP page Directive: Structuring Generated10.1 Scripting Elements Servlets Template Text 11.1 The import Attribute10.2 JSP Expressions Directories for Custom Classes Predefined Variables Example XML Syntax for Expressions 11.2 The contentType Attribute Using Expressions as Attribute Values Generating Plain Text Documents Example Generating Excel Spreadsheets10.3 JSP Scriptlets 11.3 The isThreadSafe Attribute Using Scriptlets to Make 11.4 The session Attribute Parts of the JSP File Conditional 11.5 The buffer Attribute Special Scriptlet Syntax 11.6 The autoflush Attribute10.4 JSP Declarations 11.7 The extends Attribute Special Declaration Syntax 11.8 The info Attribute10.5 Predefined Variables 11.9 The errorPage Attribute 11.10 The isErrorPage Attribute 11.11 The language Attribute 11.12 XML Syntax for Directives @regismelo 245
  • Java Básico – Módulo 1 Java Web Módulo XII Tags Personalizados - Tag Libraries -@regismelo 246
  • Java Básico – Módulo 1 Java Web Tag Libraries• Tags customizadas são mecanismos definidos na especificação JSP 1.1;• A idéia é criar tags personalizados que poderão ser utilizadas facilmente pelo webdesigner ou outro desenvolvedor qualquer;• Custom Tags são componentes web que rodam no servidor, e produzem código (assim como um servlet ou uma página JSP). @regismelo 247
  • Java Básico – Módulo 1 Java Web Tag Libraries - Motivação• Como fazer para imprimir a data de hoje usando JSP? <%@page import="java.util.*" %> <HTML> Hoje é: <% out.print( new Date() ); %> </HTML> %> Scriptlet @regismelo 248
  • Java Básico – Módulo 1 Java Web Tag Libraries - Motivação• Na implementação do slide anterior, caso seja necessário fazer o mesmo procedimento em diversas páginas, tem-se que duplicar o código;• Ou resolver o problema fazendo includes de pequenos pedaços de código. @regismelo 249
  • Java Básico – Módulo 1 Java Web Relembrando – Inclusão estática• As inclusões estáticas são resolvidas nas páginas JSP em tempo de compilação;• Por isso, são mais rápidas, porém, não devem ser utilizadas com códigos que mudam muito. <HTML> <%@include file=“menu.htm” %> ... </HTML> <a href=“opcao1”> Item1 </a> <a href=“opcao2”> Item2 </a> @regismelo 250
  • Java Básico – Módulo 1 Java Web Relembrando – Inclusão dinâmica• As inclusões dinâmicas são resolvidas no momento da requisição;• Mais lentas, indicadas para inclusões aonde o código incluído muda muito. <HTML> <jsp:include page=“menu.html”/> ... <a href=“opcao1”> Item1 </a> </HTML> <a href=“opcao2”> Item2 </a> @regismelo 251
  • Java Básico – Módulo 1 Java Web Tag Libraries - Motivação• Uma Tag provê uma maneira de tornar esses pequenos includes, componentes reutilizáveis;• “Tag libraries reduzem a necessidade de embutir grande quantidade de código Java nas páginas JSP, movendo a funcionalidade para classes de Tags”;• Tags podem ser utilizadas inclusive por pessoas que não entendem de programação Java. @regismelo 252
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira TagPassos necessários para criarmos nossa Tag Lib: – Declarar uma classe que herda de uma das classes relacionadas a bibliotecas de Tag; – Declarar um Tag Library Descriptor (TLD) que descreve a tag lib; – Referenciar a Tag no arquivo JSP e usá-la. @regismelo 253
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira Tagpackage br.com.softsite.tags; DiaHoje.javaimport javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;Import java.util.*;public class DiaHoje extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().write( new Date().toString() ); } catch(java.io.IOException e) { throw new JspException("IO Error: " + e.getMessage()); } return EVAL_BODY_INCLUDE; }} @regismelo 254
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira Tag Pacote que contém asEntendendo o código escrito: definições relacionadas a tag librariesimport javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;Import java.util.*;public class DiaHoje extends TagSupport { ...} Classe básica utilizada para criar uma nova tag @regismelo 255
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira TagO que é a classe TagSupport?• TagSupport é uma classe base utilizada para a criação de novas Tags;• Como veremos adiante, TagSupport, não é a única classe que poderá ser extendida para criarmos novas Tags. @regismelo 256
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira Tag Método chamadoEntendendo o código escrito: automaticamente pelo ... container public int doStartTag() throws JspException { try { pageContext.getOut().write( new Date().toString() ); } catch(java.io.IOException e) { Obtém o writer throw new (equivalente a JspException("IO Error: " + response.getWriter() e.getMessage()); em um Servlet) } return EVAL_BODY_INCLUDE; } ... @regismelo 257
  • Java Básico – Módulo 1 Java Web Construindo nossa primeira Tag• O método doStartTag é chamado automaticamente pelo container;• O writer pode ser obtido para escrever algum conteúdo (comumente HTML) através da chamada a pageContext.getOut()• O “return EVAL_BODY_INCLUDE” indica que o corpo da tag deverá continuar a ser processado normalmente (veremos com mais detalhes adiante). @regismelo 258
  • Java Básico – Módulo 1 Java WebClico de vidaTag Interface @regismelo 259
  • Java Básico – Módulo 1 Java Web Declarando a TLD<?xml version="1.0" encoding="ISO-8859-1" ?> curso.tld<!DOCTYPE taglib "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>dh</shortname> <info>My first Tag library</info> <tag> <name>diaHoje</name> <tagclass>br.com.softsite.tags.DiaHoje</tagclass> <bodycontent>EMPTY</bodycontent> </tag></taglib> @regismelo 260
  • Java Básico – Módulo 1 Java Web Estrutura do TLD – Elemento <taglib> tlib-version Versão da biblioteca de taglibs. jsp-version Especificação JSP requerida para essa biblioteca.(obrigatória) short-name O prefixo a ser utilizado pela diretiva taglib (obrigatória) description Texto descrevendo a biblioteca.@regismelo 261
  • Java Básico – Módulo 1 Java Web Estrutura do TLD – Elemento <tag>action O nome definido após o prefixo.tag-class O Nome completo da classe que implementa a interface Tag.body-content (Opcional) Se a tag não tem corpo o valor deve ser “empty”. Tags que possuem corpo devem utilizar o valor “JSP”. Existe outro valor, “tagdependent”, que informa ao container que ele não deve processar o conteúdo da tag: seu conteúdo será passado para a classe para interpretação. @regismelo 262
  • Java Básico – Módulo 1 Java Web Diretórios e Arquivos• Importante:  O Arquivo TLD normalmente fica dentro do diretório WEB-INF;  A classe representando a Tag librarie deverá ficar no WEB- INF/classes ou WEB-INF/lib (no caso de um JAR) @regismelo 263
  • Java Básico – Módulo 1 Java Web Usando a Tag DiaHoje.jsp<%@taglib uri="WEB-INF/curso.tld" prefix="ss" %><HTML> Hoje é: <ss:diaHoje /></HTML> Página JSP passa a usar um componente @regismelo 264
  • Java Básico – Módulo 1 Java Web A Classe TagSupport• A classe TagSupport é uma das Tags mais simples;• Utilize-a quando você deseja gerar algum resultado sem manipular o “corpo” da tag;• A única coisa que pode ser feita, é considerar ou desconsiderar o corpo da tag.• Exemplo: Tag sem corpo <ss:diaHoje /> <ss:iterate> Tag com corpo Hello World </ss:iterate> @regismelo 265
  • Java Básico – Módulo 1 Java Web De onde vem TagSupport?Classes concretas Herde dessas classes para começar uma nova tag @regismelo 266
  • Java Básico – Módulo 1 Java Web A Interface TagPrincipais métodos:• doStartTag  - Inicia o processamento da tag. - Normalmente, é o método responsável pela geração de HTML; - Tem dois retornos possíveis: EVAL_BODY_INCLUDE – Indica que o conteúdo da Tag será considerado; SKIP_BODY – O conteúdo da tag será desconsiderado. @regismelo 267
  • Java Básico – Módulo 1 Java Web A Interface TagPrincipais métodos:• doEndTag  - Finaliza o processamento da tag. - Pode indicar se a página continuará a ser processada EVAL_PAGE – Indica que o restante da página será processado; SKIP_PAGE – O restante da página não será processado. @regismelo 268
  • Java Básico – Módulo 1 Java Web A Interface TagPrincipais métodos:• release  - Utilizado para limpar a casa; - O container chamará esse método antes de retirar a classe da memória; - Cuidado: Ele não é chamado entre as requisições a mesma tag! @regismelo 269
  • Java Básico – Módulo 1 Java Web Exercício• Implemente o exercício anterior – classe diaHoje e observe o comportamento de uma tag. 45 minutos @regismelo 270
  • Java Básico – Módulo 1 Java Web A Classe TagSupportAlém dos métodos disponíveis na interface Tag, aclasse TagSupport provê:• doAfterBody  - Método disparado automaticamente após o processamento do corpo da tag (caso o método doStartTag retorne EVAL_BODY_INCLUDE); - Você pode utilizar esse método para, por exemplo, fazer um loop com uma tag exibindo seus itens diversas vezes; - Retornos possíveis: EVAL_BODY_AGAIN – O corpo da tag será processado novamente SKIP_BODY – O corpo não será processado novamente @regismelo 271
  • Java Básico – Módulo 1 Java Web Exemplo com TagSupport• Vamos imaginar, uma tag bem simples;• Ela deverá apenas fazer uma iteração e repetir o corpo da tag 10 vezes. Hello World• Exemplo: Hello World Hello World Hello World Hello World <ss:iterate> Hello World Hello World Hello World Hello World </ss:iterate> Hello World Hello World @regismelo 272
  • Java Básico – Módulo 1 Java Web Exemplo com TagSupport• Para construirmos essa Tag, precisaremos entender como a classe TagSupport trabalha com o corpo da Tag; <ss:iterate> Tag com corpo Hello World </ss:iterate> @regismelo 273
  • Java Básico – Módulo 1 Java Web Exemplo com TagSupport• O principal método que iremos trabalhar é o doAfterBody;• Ele tem dois retornos possíveis: EVAL_BODY_AGAIN – O corpo da tag será processado novamente SKIP_BODY – O corpo não será processado novamente @regismelo 274
  • Java Básico – Módulo 1 Java Webpackage br.com.softsite.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;Import java.util.*;public class Iterate extends TagSupport { private int total = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; Indica que o } corpo será public int doAfterBody() processado { if ( ++total < 10 ) return EVAL_BODY_AGAIN; Mostra o corpo da Tag, else outras 9 vezes return SKIP_BODY; }} @regismelo 275
  • Java Básico – Módulo 1 Java Web Entendendo o exemplo• A funcionalidade de “iterar” no corpo da Tag é propriciado pela interface IterationTag;• Relembre o diagrama de classes: @regismelo 276
  • Java Básico – Módulo 1 Java WebFluxo daInterfaceIteration Tag Observe os retornos possíveis de cada método @regismelo 277
  • Java Básico – Módulo 1 Java Web Não esqueça de adicioná-la a TLD!... curso.tld <tag> <name>diaHoje</name> <tagclass>br.com.softsite.tags.DiaHoje</tagclass> <bodycontent>EMPTY</bodycontent> </tag> <tag> <name>iterate</name> <tagclass>br.com.softsite.tags.Iterate</tagclass> <bodycontent>JSP</bodycontent> </tag></taglib> @regismelo 278
  • Java Básico – Módulo 1 Java WebCiclo de Vida deuma Tag @regismelo 279
  • Java Básico – Módulo 1 Java Web Cuidado!• No exemplo anterior, o sistema só irá exibir a tag 10 vezes da primeira chamada!• Na segunda vez que a tag for solicitada, a variável total já estará inicializada com o valor 10;• Esse “problema” acontece por que não é criada uma nova instância da tag (isso ajuda na performance mais pode criar problemas). @regismelo 280
  • Java Básico – Módulo 1 Java Web Cuidado!• Para corrigir o problema, devemos zerar a variável total no método doEndTag() ... public int doEndTag() { total = 0; return EVAL_PAGE; } ... @regismelo 281
  • Java Básico – Módulo 1 Java Web...public class Iterate extends TagSupport { private int total = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } public int doAfterBody() { if ( ++total < 10 ) return EVAL_BODY_AGAIN; else return SKIP_BODY; } public int doEndTag() { total = 0; return EVAL_PAGE; }}@regismelo 282
  • Java Básico – Módulo 1 Java Web Alterando a Iterate• Um requisito interessante para a nossa classe Iterate é poder passar um parâmetro indicando quantas iterações serão realizadas;• Para fazer isso, precisamos aprender como passar parâmetros em Tags. @regismelo 283
  • Java Básico – Módulo 1 Java Web Passando parâmetros em Tags• A sintaxe para a passagem de parâmetros em tags é extremamente simples: <ss:iterate total=“5”> Hello World </ss:iterate> Fazer a iteração somente 5 vezes @regismelo 284
  • Java Básico – Módulo 1 Java Web Passando parâmetros em Tags• Precisamos apenas definir o devido método set/get na classe que representa a Tag: ... public void setTotal( int i ) { total = i; } public int getTotal() { return total; A conversão do } tipo é feita pelo ... container @regismelo 285
  • Java Básico – Módulo 1 Java Web Vejamos o exemplo completo…@regismelo 286
  • Java Básico – Módulo 1 Java Webpackage br.com.softsite.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.util.*;public class Iterate extends TagSupport { private int total = 0; private int i = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } public int doAfterBody() { if ( ++i < total ) return EVAL_BODY_AGAIN; else return SKIP_BODY; }@regismelo 287
  • Java Básico – Módulo 1 Java Web... public int doEndTag() { total = 0; i = 0; return EVAL_PAGE; } public void setTotal( int i ) { total = i; } public int getTotal() { return total; }}@regismelo 288
  • Java Básico – Módulo 1 Java Web O último passo…• Alterar a TLD, informando a existência desse parâmetro: ... <tag> <name>iterate</name> <tagclass>br.com.softsite.tags.Iterate</tagclass> <bodycontent>JSP</bodycontent> <attribute> <name> total </name> <required> true </required> </attribute> </tag> ... @regismelo 289
  • Java Básico – Módulo 1 Java Web Exercício• Implemente o exercício anterior – classe Iterate e observe seu funcionamento. @regismelo 290
  • Java Básico – Módulo 1 Java Web A Classe BodyTagSupport• Herde da classe BodyTagSupport quando você desejar manipular o conteúdo do corpo;• Com TagSupport você pode processar ou não o corpo da Tag;• Com BodyTagSupport você pode modificar o corpo da tag. @regismelo 291
  • Java Básico – Módulo 1 Java Web A Classe BodyTagSupport• BodyTagSupport implementa BodyTag que é a interface que efetivamente tem o poder de manipular o corpo de uma tag. @regismelo 292
  • Java Básico – Módulo 1 Java WebFluxo de BodyTag @regismelo 293
  • Java Básico – Módulo 1 Java Web Ciclo de um BodyTagSupport• A classe que implementa BodyTag retorna EVAL_BODY_BUFFERED do método doStartTag;• O método setBodyContent é chamado. Ele inicializa a propriedade bodyContent que será utilizada para obter dados da página;• O método doInitBody é chamado; @regismelo 294
  • Java Básico – Módulo 1 Java Web Ciclo de um BodyTagSupport• O método doAfterBody é carregado. Nesse método você poderá processar o conteúdo do tag diversas vezes (assim como o exemplo iterate);• O método doEndTag é chamado. Ele também pode processar o conteúdo do tag. Caso você não queira avaliar o conteúdo do tag várias vezes, você pode usar esse método ao invés de doAfterBody. @regismelo 295
  • Java Básico – Módulo 1 Java Web Exemplo BodyTagSupport• Vamos imaginar um exemplo – precisamos de uma tag que substitua todas os links, independente de quais sejam, por http://www.sagaranatech.com de toda uma página;• A nossa tag precisa analisar o conteúdo da página e realizar a troca. @regismelo 296
  • Java Básico – Módulo 1 Java Web Exemplo BodyTagSupport <html> <a href=teste> Isso é um link para teste </a> <a href=cejug.org> Isso é um link para o CEJUG </a> </html>Deveria ser trocado por: <html> <a href=www.sagaranatech.com?url=teste> Isso é um link para teste </a> <a href=www.sagaranatech.com?url=cejug.org> Isso é um link para o CEJUG </a> </html> @regismelo 297
  • Java Básico – Módulo 1 Java Web Exemplo BodyTagSupport• Nesse exemplo, fica claro que estaríamos alterando o conteúdo de uma página;• Iremos usar os recursos de BodyTagSupport. @regismelo 298
  • Java Básico – Módulo 1 Java Web Exemplo BodyTagSupportpackage br.com.softsite.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.util.*;public class ChangeURL extends BodyTagSupport { public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } Indica que o conteúdo será processado @regismelo 299
  • Java Básico – Módulo 1 Java Web... public int doEndTag() throws JspException { String pagina = this.bodyContent.getString(); String newPagina = trocarReferencias( pagina ) JspWriter jspwriter = this.pageContext.getOut(); try { jspwriter.print( newPagina ); } catch(java.io.IOException ioexception) { throw new JspException("Excecao em ChangeURL.doEndTag():" + ioexception.toString()); } return EVAL_PAGE; } @regismelo 300
  • Java Básico – Módulo 1 Java Web... public String trocarReferencias( String pagina ) { String regex = "hrefs*=s*"; // Trocar todas as referencias... String newPagina = pagina.replaceAll( regex, "href=http://www.sagaranatech.com?url=" ); return newPagina; } Isso é um uso de uma regular expression Esse recurso foi introduzido no SDK 1.4. Para mais informações, consulte http://guia-er.sourceforge.net/ @regismelo 301
  • Java Básico – Módulo 1 Java Web Não esqueça de alterar a TLD…<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web- jsptaglibrary_1_1.dtd"><taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>dh</shortname> <info>My first Tag library</info> <tag> <name>changeURL</name> <tagclass>br.com.softsite.tags.ChangeURL</tagclass> <bodycontent>JSP</bodycontent> </tag></taglib>@regismelo 302
  • Java Básico – Módulo 1 Java Web Exemplo de página usando esse tag<%@taglib uri="WEB-INF/curso.tld" prefix="ss" %><ss:changeURL><HTML> <a href=http://www.cejug.org> Link para o CEJUG </a> <p> <a href=http://www.uol.com.br> Link para o UOL </a> <p></HTML></ss:changeURL> @regismelo 303
  • Java Básico – Módulo 1 Java Web Exercício• Implemente o exercício anterior e faça-o rodar. @regismelo 304
  • Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages(CSAJSP-Chapter14) 14.5 Optionally Including the Tag BodyCreating Custom JSP Tag Libraries The Tag Handler Class14.1 The Components That Make Up a Tag Library The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.6 Manipulating the Tag Body The JSP File The Tag Handler Class14.2 Defining a Basic Tag The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.7 Including or Manipulating the Tag Body Multiple Times The JSP File The Tag Handler Class14.3 Assigning Attributes to Tags The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.8 Using Nested Tags The JSP File The Tag Handler Classes14.4 Including the Tag Body The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File The JSP File @regismelo 305
  • Java Básico – Módulo 1 Java Web Que tecnologia utilizar? E quanto utilizar?@regismelo 306
  • Java Básico – Módulo 1 Java WebAplicação simples ou time de desenvolvimento •Execute código Java diretamente. Ponha todo pequeno código no JSP. •Execute código Java indiretamente. Desenvolva classes utilitárias separadas. Ponha na pagina JSP somente o código necessário para chamar as classes utilitárias. •Utilize Beans. Desenvolva classes utilitárias estruturadas como beans. Utilize jsp:useBean, jsp:getProperty, jsp:setProperty para efetuar as chamadas aos beans. •Utilize Tags customizadas. Desenvolva tags personalizadas. Se as tags ficarem complicadas, utilize classes utilitárias. Execute as tags utilizando a sintaxe XML de tags personalizadas.Aplicação complexa ou time •Utilize a arquitetura MVC. Tenha um servletde desenvolvimento grande respondendo todas as requisições, buscando os Livro: More servlets and JSP; dados e armazenando os resultados em beans. Martin Hall Redirecione para um pagina JSP para mostrar os @regismelo dados. 307
  • Java Básico – Módulo 1 Java Web@regismelo 308
  • Java Básico – Módulo 1 Java Web @regismelo@regismelo 309