Your SlideShare is downloading. ×
Java Web, o Tutorial
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java Web, o Tutorial

7,120
views

Published on

Este tutorial apresenta como desenvolver aplicações para o ambiente Web utilizando a tecnologia Java.

Este tutorial apresenta como desenvolver aplicações para o ambiente Web utilizando a tecnologia Java.

Published in: Technology

1 Comment
10 Likes
Statistics
Notes
  • Seus materiais tem me ajudado muito na preparação para concurso público.. Obrigado.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
7,120
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
514
Comments
1
Likes
10
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 Java Web Capacitação Desenvolver Java Web Application Rildo F Santos rildo.santos@etecnologia.com.br twitter: @rildosan skype: rildo.f.santos http://rildosan.blogspot.com/ (11) 9123-5358 (11) 9962-4260 www.etcnologia.com.br
  • 2. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 2 Programa: “Menos Papel, Mais Árvores ®” Qual é o mundo que queremos ? O primeiro passo para criar um mundo melhor, é saber qual tipo de mundo que queremos ter e qual tipo que deixaremos de herança para as próximas gerações. Nossa missão: É buscar pelo equilibro do homem, da tecnologia e do meio ambiente. Para cumprir esta missão é necessário: conscientizar, comprometer e AGIR. O programa Menos Papel, Mais Árvores®, é uma ação, com objetivo de estimular o consumo sustentável de papel dentro das organizações. Quer participar ? - Reduza o uso de papel (e de madeira) o máximo possível. - Só imprima se for extremamente necessário. - Evite comprar produtos com excesso de embalagem. - Ao imprimir ou escrever, utilize os dois lados do papel. - Use papel reciclado. Este material não deve ser impresso..
  • 3. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 3 Facilitador: Rildo F. Santos (@rildosan) Coach , Instrutor, Consultor, Palestrante e Professor de Gestão de Negócios, Inovação, Sustentabilidade, Processos e Tecnologia da Informação e Métodos Ágeis. Minha Experiência: Tenho mais de 10.000 horas de experiência em Gestão de Negócios, Gestão de Inovação, Governança e Engenharia de Software. Sou formado em Administração de Empresas, Pós-Graduado em Didática do Ensino Superior e Mestre em Engenharia de Software pela Universidade Mackenzie. Fui instrutor de Tecnologia de Orientação a Objetos, UML e Linguagem Java (Sun MicroSystems e IBM). Conheço Métodos Ágeis (SCRUM, XP, FDD, Lean e OpenUP), Arquitetura de Software, SOA (Arquitetura Orientado a Serviço), Processo Unificado, Business Intelligence, Gestão de Risco de TI entre outras tecnologias. Sou professor de curso de MBA da Fiap e fui professor de pós-graduação da Fasp e IBTA. Tenho conhecimento de Gestão de Negócio (Inteligência de Negócio, Gestão por Processo, Inovação, Gestão de Projetos e GRC - Governance, Risk ando Compliance), SOX, Basel II e PCI; Experiência na implementação de Governança de TI e Gerenciamento de Serviços de TI. Fluência nos principais frameworks e padrões: ITIL, Cobit, ISO 20000, ISO 27001 e ISO 15999; Participei de diversos projetos nos segmentos: Financeiro, Telecomunicações, Seguro, Saúde, Comunicação, Segurança Pública, Fazenda, Tecnologia, Varejo, Distribuição, Energia e Petróleo e Gás. Possuo as certificações: CSM - Certified SCRUM Master, CSPO - Certified SCRUM Product Owner , SUN Java Certified Instrutor, ITIL Foundation e sou Instrutor Oficial de Cobit Foundation e Cobit Games; Sou membro do IIBA-International Institute of Business Analysis (Canada) Onde estou: Twitter: @rildosan Blog: http://rildosan.blogspot.com/ Comunidade: http://etecnologia.ning.com
  • 4. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 4 Conteúdo Servidores, Protocolos, Serviços, Componentes, Formulários, Páginas dinâmica e Scripts Java Servlet: APIs e funcionalidades JSP: APIs e funcionalidades JavaBeans e JDBC Recomendações, dicas e Melhores prática para o desenvolvimento de aplicação Web Nota: As tags HTML foram escritas em letras minúsculas. A melhores práticas recomendam que elas sejam em maiúsculo.
  • 5. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 5
  • 6. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 6 Conceitos Introdução Servidores Server Pages Páginas Protocolos Formulários Componentes Web Container: Tomcat Scripts
  • 7. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 7 Podemos dizer que as aplicações web são baseada na arquiteturas Cliente/Servidor de duas ou três camadas: Camada de Recursos WWW Browser Web Server / ASs HTML CGI ASP Java Business Object Services Business Object Engine Camadas Apresentação, Lógica de Negócios e Integração Camada de Cliente
  • 8. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 8 Arquitetura da Web
  • 9. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 9 Os servidores são responsáveis por gerenciar um sistema virtual de arquivos e atender a requisições. - Basicamente que temos: Web Server: Para atender uma aplicação web pequena ou mediana com baixo volume de requisições e transações. Exemplo: Intranets extranets, webmail, fóruns e pequenos site empresariais ou pessoais (demanda controlada) Application Server: Para atender uma aplicação web corporativa com alto volume de requisições e/ou transações. Exemplo: aplicações de e-commerce, e-business serviços (home banking) e grandes portais (UOL, Globo.com, IG) (demanda incontrolada) O Lado Servidor : Servidores Arquitetura da Web
  • 10. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 10 O Lado Servidor: Web Server Os servidores Web são programas que respondem chamadas através de conexões TCP/IP com arquivos que são, basicamente, gerados em html. Esses softwares são instalados nas máquinas em que são armazenadas as páginas da Web. Ao ser instalados, criam uma estrutura de diretórios e nesses diretórios são colocadas as páginas que se deseja fazer acesso. Quando executado, o servidor Web abre uma porta de comunicação (Porta 80) para que os usuários internos (no caso de uma intranet) ou externos (internet ou extranet) possam fazer o seu acesso. Atualmente existem diversos softwares atuando como servidores Web disponíveis no mercado. Existem servidores “open source”, como Apache (maior “player” do mercado) e outros tais como: MS Internet Information Server, SunOne e etc. Alguns servidores Web, são extremamente pequenos, como o Apache, ocupando pouco espaço, outros como o IIS são bem maiores, e já são disponibilizados com o Sistema Operacional, no caso Windows NT e 2000. Um ponto importante a considerar sobre os Servidores Web, é a configuração. Apesar de ser relativamente simples entender os princípios básicos desse tipo de software, a configuração às vezes não é uma tarefa fácil. Arquitetura da Web
  • 11. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 11 O Lado Servidor: Web Server Arquitetura da Web Os mais populares servidores Web, são: - Apache; - Microsoft Internet Information Server (IIS); - Zeus e - SunOne. O apache é produto open source que tem mais de 60% de mercado (www.apache.org). Microsoft IIS é distribuido atrelado a sistema operacional Windows, no caso Windows NT e 2000.
  • 12. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 12 Arquitetura da Web A estrutura escalar e portabilidade são as novas regras para quem quer ter vantagem competitiva sobre a concorrência. Em meio este cenário os Application Server despontarão como soluções completas, de desenvolvimento a Gerenciamento de Sistemas. Application Server simplifica o desenvolvimento, facilita integração, distribuição e gerenciamento de clientes leves e sistemas de software distribuídos. Proporciona soluções de negócios que integram ambientes empresariais heterogêneos, incluindo servidores Web, servidores de Banco de Dados, Legados, Múltiplos clientes, Linguagens e Plataformas. Construído baseado em padrão aberto e em padrões de indústria, tais como: CORBA, J2EE (EJB, JSP, Servlets), C++, XML e HTML, gera confiabilidade, crescimento escalar e flexibilidade, necessárias para atingir a demanda de aplicações comerciais. O Lado Servidor: Application Server
  • 13. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 13 Arquitetura da Web Principais características de Application Server: • Sistema de usuários que permita a criação de grupos e usuários, integração com segurança da rede (usuários de todas as plataformas, seja Windows, Linux, Unix ou Mainframe, OS/390); • Cadastro e uso facilitado de certificado de autorização • Controle de acesso em nível de componentes da aplicação e com filtros de dados; • Estrutura escalar (embutir recursos de clusters) • Fail Over (Tolerância a Falhas); • Persistência de sessão; • Atualização de componentes a quente (hot deployment) • Suporte a padrões: Corba, XML, J2EE, EJB, COM, Web Services e etc; • Acesso a Banco de Dados (com recurso de pool de conexões); • Balanceamento de carga; • Monitoria de Transações e • WebServer (com suporte a HTML, RMI, IIOP, XML, WAP). O Lado Servidor: Application Server
  • 14. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 14 O Lado Servidor: Application Server Arquitetura dos Application Server (tecnologia J2EE) Arquitetura da Web Web server Firewall Clientes (browsers) JSP e Servlet Container (Componentes) EJB Servidor de Aplicações Banco de Dados Legado Camada Cliente Lógica e Regra de Negócios Repositório de dadosCamadas Apresentação, Lógica de Negócio e Integração Camada Recursos
  • 15. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 15 O Lado Servidor: Application Server Arquitetura Cliente Servidor (Três Camadas) Application Server (tecnologia J2EE) J2EE App Client WEB CONTAINER Clients protocols Suporte (HTTP, HTTPs RMI, IIOP SOAP Browser HTTP / HTTPS Java Servlets JSP EJB CONTAINER Clients protocols Capable of making (HTTP, HTTPs RMI, IIOP SOAP) EJB RMI, IIOP, SSl, TCP RMI, IIOP, SSl, TCP JNDI, JTA, JDBC, JMS, JAVAMAIL JAXP, CONNECTORS e JAAS Enterprise Systems (ERP, SCM, Mainframe) Banco de Dados Arquitetura da Web
  • 16. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 16 O Lado Servidor: Application Server Razões para usar um Application Server Arquitetura da Web Estrutura escalar: Você nunca sabe quantas conexões seu site vai exigir. Seu sucesso pode matá-lo: BOL previu 40.000 novos usuários na primeira semana de uso Recebeu 60.000 no primeiro dia O cache de transações possibilita atender o crescimento da demanda O balanceamento de carga possibilita dividir o processamento em várias CPUs A portabilidade possibilita mudar a plataforma de hardware e software para atender uma nova demanda Quantos usuários terei...?
  • 17. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 17 O Lado Servidor: Application Server Razões para usar um Application Server Portabilidade Arquitetura da Web Trocar de hardware e Software, digo, Sistema Operacional e preservar a Aplicação... A maioria dos Application Server são baseados na tecnologia Java (J2EE) que oferece a portabilidade entre Sistemas Operacionais. A portabilidade favorece o atendimento de crescimento ou nova demanda. Troque de hardware continue com a mesma aplicação. “Você pode começar sua aplicação com a dobradinha wintel (Windows + Intel) e mais tarde migrar para Unix e Risc”
  • 18. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 18 O Lado Servidor: Application Server Razões para usar um Application Server Arquitetura da Web Redução de Custos: • O custo das transações efetivadas através do Home Banking é quase dez vez menor que nas agências. • Call Center vs Internet, o custo de atendimento via Internet é muito menor do que o atendimento telefônico. • SCM e e-Procurement podem reduzir os custos... Integração da Cadeia de Valores • Possibilidade de toda a integração da cadeia de valores, integração com Fornecedores, Clientes e Investidores
  • 19. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 19 O Lado Servidor: Application Server Razões para usar um Application Server As vantagens do Java: A grande maioria dos Application Servers tem suporte a Java. Algumas característica da tecnologia Java: • É Orientada por Objetos; • Foi projetada para redes; • É segura; • É multitarefa; • Gerenciamento de memória automático • Está portada para uma grande variedade de plataformas • É uma padrão de mercado • Baixo custo de aquisição de software Arquitetura da Web
  • 20. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 20 O Lado Servidor: Application Server Razões para não usar um Application Server Nem todos os projetos necessitam de Application Server, veja os porquês: • Baixo volume transações; • Falta de domínio da tecnologia; • Baixo investimento em hardware e • Baixo investimento software. Arquitetura da Web
  • 21. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 21 O Lado Servidor: Application Server Application Server: Arquitetura da Web Existem diversos Application Server disponíveis no mercado, tais como: - WebSphere Application Server, IBM - Oracle Application Server, Oracle - JBoss, JBoss Group (Open source) Entre outros... Quais são os Application Server disponíveis ?
  • 22. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 22 Arquitetura da Web
  • 23. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 23 CGI: A CGI (Commom Gateway Interface) é um padrão criado para fazer interface entre servidores Web e aplicações externas. O programa CGI é conhecido como Script CGI, aplicação CGI ou simplesmente Gateway. Através dos componentes CGI podemos adicionar novas funcionalidades aos Web Server. Fazer a aplicação comunicação com Banco de Dados, usar mecanismo de busca, contadores, livro de visita entre outras coisas. Características Funcionais: Geração de Documentos Virtuais (on-the-fly) Documentos virtuais aqueles criados no momento de sua requisição, ou seja, eles não existem efetivamente, como um arquivo .HTML. Assim, são gerados automaticamente por um programa CGI, permitindo que sejam personalizados. Por exemplo, pode-se enviar página HTML, agradecendo o usuário, mencionando seu nome na página, por ter preenchido um formulário. Arquitetura da Web CGI
  • 24. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 24 Gateway para outros serviços: Gateways são “pontes” de comunicação para outros serviços, por exemplo, as informações vindas de formulário podem ser gravadas em um banco de dados, ou então requisição web podem originar chamada a drivers capazes de ativar componentes específicos (como envio de mensagens para “pagers”), interface com telefones celulares e etc. Quando uma requisição CGI é enviada, o controlador CGI localiza no diretório destinado aos scripts CGI, o programa a ser acionado. Após esta localização, o programa é lido do disco e executado em memória, sendo este recurso liberado após o processamento. Assim estabelece-se o fluxo de processamento CGI: Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Arquitetura da Web CGI
  • 25. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 25 Características Funcionais: Gateway para outros serviços Para cada requisição é gerado um novo fluxo, para grande volumes de requisições, será necessário infra estrutura, para responder tal volume. A maior desvantagem no uso do CGI é que ele pode sobrecarregar o servidor, a maioria das soluções, acabam por limitar a portabilidade. Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Requisição Acesso a Disco Execução Emissão de resposta Liberação do recurso Requisições Servidor Arquitetura da Web Componentes Web: CGI
  • 26. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 26 Perl Perl (Practical Extraction and Reporting Language) é uma linguagem que usa técnicas de orientação a objetos que combina um mix de C e Unix, tornando-se, uma das opção poderosa ferramentas para desevolvimento da Internet. Características: Os programas feito para Perl são escrito em arquivos ASCII e depois executados em Perl. As classes e rotinas de bibliotecas, estão contidas em módulo (arquivo Perl com a extensão .pm) Disponibilidade. Existem disponíveis gratuitamente, diversos módulos Perl. Os módulos mais comuns utilizam o ODBC para acessar os diversos Banco de dados, possibilitando a portabilidade do programa para vários formato diferentes CGI e Perl um casamento perfeito Arquitetura da Web Componentes Web: CGI
  • 27. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 27 Integração CGI e Perl Quando um usuário submete uma requisição o CGI/Perl fazem o processamento de entrada (validando os dados) e a saída (reposta ao envio do formulário) Nome Cidade Cep OK <input... Name=Nome...> <input... Name=Cidade...> <input... Name=Cep...> Ins_cli.pl Ins_cli.html HTML Que contém um Form <...Action=“.../Ins_cli.pl...> CGI em Perl (Ins_cli.pl) Recebe os dados inseridos no Form (CGI_Lite) Retorna uma página HTML (on the fly) agradecendo a adesão. Arquitetura da Web Componentes Web: CGI
  • 28. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 28 Integração CGI e Perl (Exemplo) A arquitetura básica é a mesma para cada Banco de Dados: uma requisição de é enviada contendo uma consulta SQL, por meio de formulários HTML. Por meio de chamadas CGI ou API, o servidor Web submete o formulário a um agente SGBD, que o converte em uma consulta SQL específica de Banco de Dados. Os resultados são formatados em HTML e devolvidos pelo gateway CGI ou API para servido web, e de volta Browser. CGI (Programa .PL) ODBC Interface Win::ODBC SGBD SGBD Cliente (browser) Servidor (Web Server) Dados (Banco de Dados) Arquitetura da Web Componentes Web: CGI
  • 29. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 29 Arquitetura da Web Componentes Web Componentes Web, são parecidos componentes de software: “ Componentes são unidades de software freqüentemente usadas no desenvolvimento de aplicações. Um componente é genérico o suficiente para que possa ser usado em diversos programas, é eficiente, fácil de usar, possível de ser combinado com outros componentes e tem interface bem definida” Exemplos de componentes de Software: - JavaBeans - Enterprise JavaBeans - COM (DLLs e ActiveX) - etc Exemplos de componentes de web (Tecnologia Java): - JSP - Java Servlet Esses componentes são classes e interfaces Java com propósito bem definido e somente podem ser executados em ambiente especifico. Estes ambientes são chamados de contêineres.
  • 30. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 30 Arquitetura da Web Componentes Web: Servlets Servlets: A API Java Servlet é uma extensão da plataforma Java que permite que os desenvolvedores adicionem, nos servidores web, mecanismos que estendam sua funcionalidade. Um Servlet executa somente no Side Server (lado servidor). Um Servlet pode fornecer vários serviços ao Servidor Web como por exemplo: • Processar formulários; • Persistência de conexões http; • Fazer acesso a Banco de Dados; • Enviar de e-mail automáticos; • Agentes de procura; • Compatibilidade com vários protocolos (http, url, ftp)
  • 31. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 31 Arquitetura da Web Componentes Web: Servlets Comparação CGI vs Servlets: A tecnologia Servlets oferecem algumas vantagens sobre as aplicações baseadas em CGI, entre elas podemos destacar: -Independência de plataforma, ou seja, portabilidade; -Melhor performance; -Extensibilidade; -Facilidade de manutenção; -Consome menos memória, pois quando um novo programa CGI é carregado para cada requisição, um servlet é carregado somente uma vez e para cada nova requisição é gerado uma nova thread e -Servlet podem ter acesso o jogo grande de APIs disponível para a plataforma de Java.
  • 32. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 32 Arquitetura da Web
  • 33. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 33 Arquitetura da Web • Páginas Cliente são a abstração de páginas Web como elas são vistas no lado cliente (página HTML) • Atributos da página cliente representam variáveis do Script. Operações da página cliente representam as funções do Script. • Associações das páginas cliente normalmente são feitas com objetos do lado cliente (applets, ActiveX, objetos Script e etc) • As páginas cliente tem associações do tipo <<link>> com outras páginas cliente. Páginas Clientes
  • 34. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 34 Arquitetura da Web Páginas Clientes Browser Scripts Plug ins Sockwave (Flash) Real Video PDF Applet Java JavaScript VBScript JScript Linguagens HTML XML Internet Explorer Netscape Opera Mozilla Tecnologias no lado cliente:
  • 35. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 35 Arquitetura da Web
  • 36. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 36 Server Pages O que são Server Pages ? Uma <<Server Page>> é um estereótipo de classe que abstrai o comportamento da página Web no lado server • Operações são funções executadas no server • Atributos são variáveis no escopo da página • Associações são feitas com recursos do lado server (componentes, bancos de dados, sistemas externos e etc) O principal papel destes scripts é separar “Conteúdo” da “Lógica de Negócio”. Arquitetura da Web
  • 37. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 37 O que é ASP? ASP (Active Server Pages) é uma tecnologia criada pela Microsoft, que combina instruções HTML, comandos script e componentes ActiveX, para criar páginas web com conteúdo dinâmico. Os scripts são executados no servidor web (“Server-side”), ao contrário de outros scripts, como Javascript que são executados no “Browser” do cliente (“Client-side”). Em ASP podem ser usados com quaisquer linguagens que suportem ActiveX scripting, tais como: Javascript, VBScript, PerlScript, Rexx, Phyton e etc. Plataforma para ASP Originalmente, ASP somente poderia ser utilizada com servidores web da Microsoft (Personal WebServer e IIS), para a plataforma Windows. Atualmente existem fornecedores para outra plataforma, por exemplo, Unix. Entre eles estão Sun (http://wwws.sun.com/software/chilisoft/index.html) Ferramentas de Produtividade Embora as páginas ASP possam ser criadas a partir de simples Editor de Texto, como Bloco de Notas, ou dos mais populares, como FrontPage, Dreamweaver. Server Pages Arquitetura da Web
  • 38. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 38 PHP (Personal Home Page) Baseada em C++, PHP fica embutido no script HTML, oferece suporte a a SGBD (dBase, Interbase, mSQL, mySQL, Oracle, Sybase, PostgreSQL e vários outros); Protocolos como IMAP, SNMP, NNTP, POP3 e HTTP; Seu módulo de compilação é pequeno e rápido; Criada em 1994 por Rasmus Lerdorf, aperfeiçoado pelo projeto Zend 2000 - PHP4. É “Open Source”. Server Pages Arquitetura da Web
  • 39. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 39 Server Pages JavaServer Pages é uma extensão da tecnologia Java Servlets, que simplifica o processo de desenvolvimento de sites com conteúdo dinâmico. Com JSP os designers e programadores podem rapidamente incorporar elementos dinâmicos em páginas usando o Java embutido e algumas tags de marcação simples (HTML). Estas tags fornecem ao designer de HMTL um meio de fazer acesso aos dados e lógica de negócios armazenadas em objetos (javabeans e EJB) sem precisar conhecer as complexidades do desenvolvimento de aplicações. JavaServer Pages usam tags XML e scriptlets para escrever programas em Java para encapsular a lógica que gera o conteúdo para a página Arquitetura da Web + Veja mais em: Solução Java - JavaServer Pages
  • 40. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 40 Tecnologia Java: Applet, Java Servlet e JavaServer Pages (JSP), EJB JavaMail e JMS são tecnologias do framework J2EE, que permitem desenvolver aplicações para Internet, os recursos fornecidos por esta tecnologia proporcionam a criação de aplicações com conteúdo dinâmico, robusta, segura, portáveis, pois, são independentes de plataforma e com recursos de orientação ao objetos. Servlet e JSP são partes integrantes da J2EE. Destaques da tecnologia Java:  Portabilidade;  Controle de exceção;  Gerenciamento de alocação de memória;  Permite fazer acesso à gama extensiva de Java APIs (JDBC, JavaMail, etc.);  Componentes de lógica portáteis com ênfase ao reúso;  Desempenho;
  • 41. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 41
  • 42. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 42 JavaServlets Tomcat O que é o Tomcat ? Para desenvolvermos aplicações Web Java (Servlet e JSP) precisamos de web container ou algo similar. No nosso caso Tomcat é ideal. É servlet container, também conhecido como web container, que é usado como referência oficial da implementação da tecnologia Servlet e JSP. É um projeto “open source” Cada versão do Tomcat atende uma versão Servlet e JSP: http://jakarta.apache.org/tomcat/index.html Servlets JSP Tomcat 2.4 2.0 5.X.X 2.3 1.2 4.1.29 2.2 1.1 3.3.1a versões Isto significa que vamos precisar do arquivo servlet.jar (tomcat_homecommomlib) para compilar as aplicações. Você pode colocar a referência deste arquivo na Classspath.
  • 43. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 43 JavaServlets Tomcat Quais são os pré-requisitos para instalar o Tomcat ? Precisamos criar algumas variáveis de ambiente: TOMCAT_HOME | CATALINA_HOME (depende da versão que estou instalando) Precisamos também do Kit de desenvolvimento Java (j2sdk1.4.1_XX) instalado e suas variáveis de ambiente como JAVA_HOME e Classpath. Após a instalação do Tomcat você terá algumas pastas, que representam a estrutura do Tomcat, veja algumas delas: Pasta Descrição bin Os executáveis do Tomcat e arquivos para iniciar e parar o serviço Commom classes lib Nesta pasta colocamos todas as classes, na subpasta classes e os jar na subpasta lib, que são comuns a todas as aplicações. conf Estrutura do Tomcat Nesta pasta encontramos os arquivos de configuração do Tomcat, como: server.xml e outros logs Nesta pasta encontramos os arquivos de log do Tomcat e das aplicações Webapps Root <contexto> Esta pasta é onde publicamos as aplicações web. Você poderá colocar as aplicações no contexto Root ou criar um novo contexto para sua aplicação
  • 44. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 44 JavaServlets Tomcat Como o Tomcat funcionar ? Para iniciar o Tomcat você tem algumas opções veja algumas delas: - Se você optou por instalar o Tomcat como um serviço (caso Windows), basta iniciá-lo a partir da janela de serviços. - Uma outra opção é executar o arquivo startup.bat (windows) ou startup.sh (Unix), para iniciar o serviço. Para parar use o arquivo shutdown.bat ou shutdown.sh (Unix)
  • 45. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 45
  • 46. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 46
  • 47. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 47 JavaServlets Introdução Interaçao com Servlets Aplicação dos Servlets Eu preciso de container Web ? O que é container web ? Container Web e Servidores Web Como um Container Web Trabalha Arquitetura: Os pacotes Ciclo de Vida O pacote: Generic Servlet O pacote: HTTP Servlet Generic Servlet vs HTTP Servlet Configuração, Deployment e afins WAR Web Archive Formulários HTML e Servlets Formulários e tags Metodos HTML vs HttpServlet Tag INPUT Tutorial Debug Descritor Web.xml Arquivo descritor Tutorial Métodos: getInitParameter, getInitParameterNames... Exercício Os elementos do arquivo descritor Escrevendo documento XML Boas Práticas Cookie, Sessões... Introdução API HTTP Servlet, a classe Cookie usando Cookies Sessões A interface HttpSession Timeout Usando Sessões Conteúdo
  • 48. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 48 JavaServlets Despachar e Redirecionar Requisições Interface RequestDispatcher: forward e include Redirecionar: sendRedirect e SendError Servlet Context Introdução A interface ServletContext A interface ServletConfig Interface ServletContextListener Tratando Erros e Exceções Introdução A classe ServletException Erros HTTP Personalizando Páginas de erro Tutorial Threads Sincronização A intergace SingleThreadModel Segurança Autenticação Autorização e Perfis Segurança e Perfis no Tomcat Tutorial: Protegendo um recurso com a MemoryRealm Filtros Introdução Interface Filter Interface FilterChain Interface FilterConfig Os elementos do Filtro Tutorial Boas Práticas Conteúdo
  • 49. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 49 JavaServlets
  • 50. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 50 O que é um Servlet ? Servlets é uma tecnologia que estende a funcionalidade de servidores Web. Um servlet é um componente web, administrado por um container web que é responsável pelo seu ciclo de vida. Servlets são programas baseado na tecnologia Java (que é independentes de plataforma) e podem ser dinamicamente carregados e executada em ambiente de Internet. Os servlets só executam no lado servidor. JavaServlets O que é um Servlet ? Introdução
  • 51. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 51 Como feito a interação com Servlet ? Como os servlets são projetados para a Internet as interações entre os clientes (os browsers) e um servlet dar-se-á através do paradigma requisição (request) e resposta (response). O cliente faz uma requisição e o servlet (container web) retorna uma resposta. Este paradigma de requisição e resposta é baseado no Hipertexto Transferência Protocolo (HTTP). JavaServlets Principais características da Tecnologia: •Suporte a multithread (multi programação) •Suporte a todas as API Java (JDBC, JMS, Java2D, JavaMail e etc) •Controle de sessão ; •Persistência via Cookies e •Servlet container pode suportar ainda o HTTPs (HTTP + SSL) para dar suporte a transações seguras. Principais vantagens quando se usa os Servlets: - Manutenção centralizada; - Clientes mais leves, pois, todo processamento está no lado servidor; - Desempenho; -Segurança; -Por ser baseado na linguagem Java tem suporte a orientação ao objetos e demais características desta tecnologia e - Extensibilidade através das APIs da Linguagem Java. Introdução
  • 52. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 52 Você poderá usar Servlet para fazer diversas coisas, deste uma simples resposta de requisição http até como parte integrante de uma aplicação web. Um Servlet pode fornecer vários serviços ao Servidor Web veja alguns exemplos: • Processar formulários; • Persistência de conexões http; • Fazer acesso a Banco de Dados; • Enviar e-mail automáticos; • Suporte a ferramenta de busca; • Permite compatibilidade entre protocolos (http, url, ftp); • Gerar documentos em vários formatos, tais como XML, PDF e imagens (GIF, JPG e PNG); • Fazer integração com legado e. • Em uma aplicação Web desenvolvida em camadas o servlet tem o papel de “Controller”. JavaServlets Quando usar Servlet ? Introdução
  • 53. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 53 Eu preciso de Container Web ? Os servidores web entende um conjunto de serviços baseados no protocolo HTTP, o que é muito limitado para as algumas necessidades dos usuários. Vejamos o caso a seguir: Alguém quer saber o saldo de sua conta corrente, ela poderia conseguir esta informação de várias maneiras. Todavia a maioria dos bancos fornecem este serviço através da Internet, são os chamados de “Home banking”. Porém esta necessidade está além dos serviços oferecidos pelo Servidor Web, pois, será necessário executar um programa externo para atender a necessidade do usuário. Para isto, precisaremos de um tecnologia adicional, tais como CGI, ASP, PHP ou Java (Servlet ou JSP), bem no nosso caso ficaremos com a tecnologia Java. Para implementar a tecnologia escolhida precisamos de um ambiente que dê suporte a ela. O web container pode ser a solução para este problema... JavaServlets Qual é meu saldo ? Introdução
  • 54. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 54 JavaServlets O que é um Container Web ? O container web, também são conhecido como servlet container, é o ambiente que é responsável por tratar as requisições Servlet e/ou JSP. Este container proverá respostas das requisições dos usuários, desta forma conseguiremos suprir algumas necessidade dos usuários. Exemplo: Saber o saldo de sua conta corrente. Browser (cliente) Servlet Container Servlet / JSP Conteúdo estático (html) Requisição HTTP Resposta HTTP Servidor Web (HTTP) Este é um exemplo de arquitetura onde um servidor web, também é conhecido como Servidor HTTP, (Apache, por exemplo) recebe as requisições que são submetidas ao servidor. O servidor verifica se a requisição do cliente é uma chamada Java, ou seja, Servlet ou JSP. E direciona para container web que receberá esta requisição e a responderá. Se for uma requisição padrão o próprio servidor web resolverá. Exemplo: Requisição de uma página HTML estática. Introdução
  • 55. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 55 Container Web e Servidores Web: Existem diversos containeres Web disponíveis no mercado, entre eles podemos destacar o Tomcat (jakarta.apache.org). O tomcat é um robusto container web, “open source” e escrito em linguagem java. A mesma coisa vale para servidores web, nossa sugestão vai para o Apache (apache.org) Serviços: http, pop3 ftp e etc Web Container+ Servidor Web JavaServlets Apache (Unix, Linux e Win32) ou MSIIS (Win32 ) Tomcat, Jetty, Resin... A liberdade de escolha sempre é importante. Por isso você poderá optar por qualquer Servidor Web e por qualquer container web. Exemplo: Você poderia utilizar o Internet Information Server, como Servidor Web e Resin, como web Container ou o Tomcat. Introdução
  • 56. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 56 JavaServlets Uma outra opção para de uso do container web é a utilização sem um servidor web. Uma vez que ele é baseado no protocolo HTTP ele também consegue entender as requisições não Java, como chamada a conteúdo estático. Este é um exemplo de arquitetura onde um container web recebe requisição HTTP e a responde. Contudo, esta arquitetura é mais limitada que anterior, pois, ela não teria como tratar um “módulo” para dar suporte a PHP ou a outro recurso. Browser (cliente) Servlet Container Servlet Conteúdo estático (html) Requisição HTTP Resposta HTTP Uma terceira opção seria utilizar um Servidor de Aplicação, como JBoss (www.jboss.org) que possui container web embutido, o Jetty e/ou Tomcat. Como você pode perceber que existem diversas opções para usar container web. Faça sua opção e mãos obra. Introdução
  • 57. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 57 Como um Container Web Trabalha: JavaServlets Requisição HTTP Servlet está carregado? É servlet corrente ? Processa Resposta Retorna resposta HTTP sim sim não Carrega Servlet não Resposta HTTP Recebe requisição HTTP (servlet ou JSP) Introdução
  • 58. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 58 JavaServlets
  • 59. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 59 JavaServlets javax.servlet javax.servlet.http Arquitetura: Os pacotes A tecnologia Java Servlet baseia em conjunto de classes e interfaces que possibilita criar aplicações web. A arquitetura servlet tem alguns pacotes, os mais importantes são: javax.servlet e o javax.servlet.http O pacote javax.servlet contém uma interface genérica e as classes que são implementados e estendem por todos servlets. O pacote javax.servlet.http contém as classes que são estendidas quando criam especificação servlet HTTP. Arquitetura
  • 60. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 60 JavaServlets Arquitetura: Ciclo de Vida O núcleo desta arquitetura é a interface Javax.servlet.Servlet. Ela fornece o “framework” para todo o servlets. A interface servlet define alguns métodos: - init() - service() - destroy() - servletConfig() e - getServletInfo() Pronto inicio init() destroy() fim Arquitetura Clico de Vida: doGet() | doPost() | service()...
  • 61. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 61 Clico de Vida: O método init é invocado quando o Servlet é carregado pela primeira vez e somente na primeira inicialização do Servlet. Este é um bom local para declarar variáveis ou ler parâmetros. O método recebe um argumento, uma referência ao objeto ServletConfig. O método service, este é o núcleo do Servlet, é neste método que as requisições são recebidas, onde ocorre o processamento e o envio da resposta para o cliente. Este método recebe dois parâmetros um ServletRequest e um ServletResponse que correspondem a Requisição e Resposta. O método destroy, é chamado antes que o Servlet seja finalizado. O objetivo deste método é possibilitar a liberação dos recursos. JavaServlets Arquitetura Interface Servlet do pacote javax.servlet é responsável pelo ciclo de vida dos servlets. Esta interface tem cinco métodos, destacando-se os métodos: - init(), service() e destroy(). Outros métodos: getServletConfig() e getServletInfo()
  • 62. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 62 Generic Servlet JavaServlets Arquitetura GenericServlet {abstract} service() <<interface>> Servlet service <<interface>> ServletRequest seuServlet service() javax.servlet <<interface>> ServletResponse getWriter(): PrintWriter public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable <<interface>> ServletConfig public abstract interface Servlet import javax.servlet.*; import javax.io.*; public class seuServlet extends GenericServlet { public void service(Servlet req, ServleResponse response){ ... } }
  • 63. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 63 Generic Servlet JavaServlets Arquitetura import javax.servlet.*; import java.io.*; public class GenericServletHello extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Generic Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } Classe GenericServlet O pacote Servlet Corpo da resposta O método service() pertence a classe GenericServlet. O servlet GenericServletHello herda este métodos (outros também são herdados) e sobre-escreve. Este método recebe uma requisição e processa uma resposta, aqui no formato HTML.
  • 64. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 64 Generic Servlet JavaServlets Arquitetura Abaixo um exemplo de como o Web container trabalha, ou seja, processa uma requisição e retorna uma resposta ao cliente no formato HTML. Browser (cliente) Servlet Container Requisição HTTP Resposta HTTP http://localhost:8080/servlet/GenericServletHello <<html> <body> <head> <title>Generic Hello World!</title> </head> <body> <h1>Hello World!</h1> </body> </html> Hello World! GenericServletHello{ service(ServletRequest req, ServletResponse res){ .... } } Requisição Resposta 1 2 3 4 5 javax.Servlet
  • 65. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 65 HTTP Servlet JavaServlets Arquitetura GenericServlet {abstract} service() <<interface>> HttpServlet doGet() doPost() doPut() doDelete() doHead doTrace() <<interface>> HttpServletRequest seuServlet service | doGet | doPost e etc... javax.servlet.http <<interface>> HttpServletResponse getWriter(): PrintWriter public abstract class HttpServlet extends GenericServlet implements java.io.Serializable import javax.servlet.http.*; import javax.io.*; public class seuServlet extends HttpcServlet { public void doGet(HttpServletRequest req, HttpServleResponse response){ ... } }
  • 66. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 66 JavaServlets Arquitetura import javax.servlet.http.*; import java.io.*; public class ServletHello extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Simple Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } Classe GenericServlet O pacote Servlet Corpo da resposta O método doGet pertence a classe HttpServlet. Este método é herdado pelo ServletHello e que faz um “overriding” do método. O papel do doGet é processar uma requisição e devolver uma resposta, ao cliente. HTTP Servlet
  • 67. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 67 JavaServlets Arquitetura Browser (cliente) Servlet Container Requisição HTTP Resposta HTTP http://localhost:8080/servlet/ServletHello <<html> <body> <head> <title>Generic Hello World!</title> </head> <body> <h1>Hello World!</h1> </body> </html> Hello World! ServletHello{ doGet(HttpServletRequest req, HttpServletResponse res){ .... } } Requisição Resposta 1 2 3 4 5 javax.servlet.http HTTP Servlet Abaixo um exemplo de como o Web container trabalha, ou seja, processa uma requisição e retorna uma resposta ao cliente no formato HTML.
  • 68. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 68 A principal diferença entre os pacotes é que enquanto o pacote javax.servlet oferece um único método genérico, service, para tratar as requisições e as respostas. O pacote javax.servlet.http oferece vários métodos (doGet, doPost, doPut, doDelete, doHead e doTrace) para tratar as requisições. Os métodos oferecidos tem funcionalidade similar os métodos do protocolo HTTP. Assim podemos tratar cada requisição de acordo com as características presentes nos métodos do HTTP, ou seja, o método get seria tratado pelo doGet e assim por diante. Desta forma este o pacote javax.servlet.http é mais indicado. JavaServlets Qual é a diferença entre os pacotes ? Introdução Generic Servlet vs HTTP Servlet:
  • 69. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 69 import java.io.*; import javax.servlet.*; public class GenericServletHello1 extends GenericServlet { public void doGet(ServletRequest request, ServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Generic Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } public void service(ServletRequest request, ServletResponse response) throws IOException { } } JavaServlets Qual é resposta que servlet irá devolver ? Quiz-Show 1 ( ) Hello world! 2 ( ) Nada 3 ( ) Erro
  • 70. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 70 JavaServlets
  • 71. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 71 Para chamar um servlet que está no contexto “root”. Execute os seguintes passos: 1 - Copie o servlet HelloServlet.class para a pasta: ....webappsROOTWEB-INFclasses 2 - Chame o browser (tenha certeza que o serviço do tomcat esteja funcionando) 3 - No browser digite a seguinte URL: http://localhost:8080/servlet/ServletHello JavaServlets Como posso chamar os servlets ? Aplicação Web webapps ROOT WEB-INF WebContainer Aplicação classes servlet O contexto “root” HelloServlet.class web.xml Diretório de Deployment JSPs | HTML | Imagens | etc lib configurações
  • 72. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 72 Para criar seu próprio contexto faça o seguinte: 1 - Criar uma pasta com o nome do contexto. Exemplo: loja 2 - Criar dentro da pasta loja a pasta: WEB-INF. 3 - Criar dentro da pasta WEB-INF o arquivo chamado web.xml, que será utilizado para fazer as configurações da aplicação. 3.1 Ainda dentro da pasta WEB-INF crie duas pastas a classes (para os servlets e demais classes) e a pasta lib (para os arquivos jar) 4 - Copie a pasta loja para a pasta: ....webapps 5 - Chame o browser (tenha certeza que o serviço do tomcat esteja funcionando) 6 - No browser digite a seguinte URL: http://localhost:8080/loja/ JavaServlets Posso criar o meu próprio contexto ? Aplicação Web contexto
  • 73. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 73 JavaServlets webapps ROOT WEB-INF WebContainer web.xml classes loja WEB-INF HelloServlet.class Aplicação classes servlet Contexto O contexto “root” HelloServlet.class web.xml Aplicação Web Diretório de Deployment JSPs | HTML | Imagens | etc JSPs | HTML | Imagens | etc lib jars Javabeans e classes lib Configurações da aplicação
  • 74. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 74 JavaServlets Aplicação Web Como posso verificar o “status” do contexto criado ? - Para verificar o status de contexto ou para gerencia-lo é necessário ter a senha de administrador do Tomcat. Veja abaixo; Na página index.jsp do Tomcat selecione o link Tomcat Manager e depois informe o nome do usuário e senha. Lembre-se que usuário deve ter o papel de administrador. Tomcat Web Application Manager Message Manager Applications List Applications HMTL Manager Help Manager Help Server Status Path Display Name Running CommandsSession loja Loja true Start Stop Reload Undeploy0
  • 75. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 75 JavaServlets
  • 76. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 76 Módulo WAR (Web Archive) Arquitetura da Web JavaServlets WAR A melhor estratégia para “empacotar” e fazer deployment de aplicações web é através da criação de um módulo WAR. O módulo war é um arquivo do tipo “Jar” que pode incluir uma aplicação web completa. Um war pode conter páginas estáticas html, páginas dinâmicas (JSP), imagens, servlets, classes java, componentes javabeans e etc. Para criar um módulo (arquivo) war utilizar a ferramenta jar do J2SDK Loja WEB-INF classes lib component.jar servlet.class web.xml index.jsp Para fazer o deployment no Tomcat coloque o arquivo war dentro da pasta ..webapps Sintaxe: jar <opções> <nome do arquivo war> <lista de arquivos> Exemplo: jar cvf <loja.war> *.* Loja.war (módulo WAR)
  • 77. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 77 Exercício: 1 - Criar um contexto chamado teste, para este contexto você também deverá criar a estrutura necessária para aplicação web, ou seja, as pasta WEB-INF, classes, lib e etc... 2 - Criar o arquivo chamado teste.war, para isto você dever utilizar a ferramenta jar; 3 - Fazer o deployment do módulo teste.war; 4 - Fazer validação do contexto criado. Para isto você poderá criar um simples página chamada index.html e coloca-lo dentro do contexto. JavaServlets Aplicação Web exercício
  • 78. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 78 JavaServlets
  • 79. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 79 Formulários: Para enviar dados para um servidor web, usamos os formulários. Eles extremamente úteis para esta tarefa. Além do envio de dados, pode-se ainda fazer requisição de serviços, tais como: - Acesso a banco de dados; - Envio de e-mail e - Executar uma aplicação - E etc. Os formulários trabalham com conceito de pares chaves, nome e valor. Basicamente a informação é enviada ao servidor em duas partes: a primeira o identificador, ou seja, o nome e depois os dados em si (o valor). Por exemplo: Numa caixa de texto com o nome como cliente onde o usuário digitou “Ferreira”, os dados serão enviados para o servidor da seguinte forma: cliente = Ferreira. JavaServlets Formulários HTML & Servlets
  • 80. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 80 Tags HTML: A tag <FORM> </FORM> delimita um formulário e contém uma seqüência de elementos de entrada e de formatação do documento. <FORM ACTION="URL_de_script" METHOD=método>...</FORM> ACTION: Especifica o endereço URL ou URI para qual serão enviados os dados do formulário. METHOD: Seleciona um método para acessar o URL de ação. Os métodos mais populares são GET e POST. Ambos os métodos transferem dados do browser para o servidor. Para formulário enviar os dados ao um Servlet é necessário usar um método de envio: Get ou Post. Também é preciso apontar para uma URL, que representará a chamada do servlet. Exemplo 1: URL completa <FORM ACTION= ="http://localhost:8080/servlet/Dados" METHOD="POST"> URL Servletmétodo de envio Exemplo 2: Apenas parte da URL (URI) <FORM ACTION= ="/servlet/Dados" METHOD=”GET"> JavaServlets Formulários HTML & Servlets
  • 81. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 81 Metodos HTML vs HttpServlet: JavaServlets Formulários HTML & Servlets HTTP HttpServlet (Java) get doGet put doPut head doHead ou doGet delete doDelete options doOptions trace doTrace post doPost
  • 82. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 82 Tags HTML: INPUT Dentro de um formulário a tag INPUT define os campos de entrada de dados. Padrão de tipo de entrada de dados: - Botões, checkboxes, password, “radio buttons”, campo de texto, botões de imagens, Text Area e Hidden fields e etc Os campos geralmente são associados a um nome e um valor Exemplo: (fragmento de formulário) <FORM ACTION="/servlet/Processa" METHOD=”Post"> <BR>Nome: <INPUT TYPE="text" NAME="nome" SIZE=20 TABINDEX=1> <BR>Idade: <INPUT TYPE="text" NAME="idade" TABINDEX=2> <INPUT TYPE="submit" VALUE="Enviar"> <INPUT TYPE="reset" VALUE="Limpar"> </FORM> Tag INPUT, aqui somente botões e caixa de texto JavaServlets Formulários HTML & Servlets
  • 83. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 83 Dados Eventos <HTML> <TITLE> Dados </TITLE> <BODY> <H1>Preencha os campos:</H1> <FORM ACTION="/servlet/ChkForm1" METHOD=”get”> <BR>Nome: <INPUT TYPE="text" NAME="nome" SIZE=20 TABINDEX=1> <BR>Idade: <INPUT TYPE="text" NAME="idade" TABINDEX=2> <HR> <INPUT TYPE="submit" VALUE="Enviar"> <INPUT TYPE="reset" VALUE="Limpar"> </HR> </FORM> </BODY> </HTML> Tutorial, parte 1 - O Formulário HTML: JavaServlets Formulários HTML & Servlets URI (contexto e servlet) Método de envio:get Nome do formulário: Form.html
  • 84. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 84 Tutorial, parte 2 - Escreva o servlet para tratar os dados do formulário: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ChkForm extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // Ajusta o tipo de conteúdo (Mime) res.setContentType("text/html"); PrintWriter out = res.getWriter(); String nome = req.getParameter("nome"); int idade = Integer.parseInt (req.getParameter("idade") ) ; //Corpo da Resposta out.println("<HTML>"); out.println("<HEAD><TITLE>Saudação</TITLE></HEAD>"); out.println("<BODY>"); out.println("Hello, " + nome); out.println("</BODY></HTML>"); } } JavaServlets Formulários HTML & Servlets
  • 85. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 85 webapps ROOT WEB-INF WebContainer Formulário HTML classes servlet O contexto “root” ChkForm.class Web.xml Form.html Tutorial, parte 3 - Deployment: Para encerrar chame o formulário, digitando a seguinte URL: http://localhost:8080/Form.html Preencha os dados e envio o formulário que será processado pelo Servlet (ChkForm). Faça a distribuição dos arquivos: JavaServlets Formulários HTML & Servlets
  • 86. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 86 <<interface>> ServletRequest getParameter(name): String getParameterValues(name): String[] getParameterNames(): Enumeration ... javax.servlet public abstract interface ServletRequest A ServletRequest captura dados como parâmetros (nomes e valores), atributos e fluxo de dados. Define um conjunto de métodos para capturar os dados dos clientes. Esses dados serão tratados pelo Servlet. Na verdade pelos métodos: doGet, doPost ou service. JavaServlets Formulários HTML & Servlets
  • 87. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 87 <HTML><HEAD><TITLE>Dados</TITLE></HEAD> <BODY> <H1>Preencha os campos:</H1> <FORM ACTION="/servlet/ChkForm1" METHOD="Post"> <BR> Nome: <INPUT TYPE="text" NAME="nome" SIZE=20 TABINDEX=1> <BR>Idade: <INPUT TYPE="text" NAME="idade" SIZE=10 TABINDEX=2> <HR> <INPUT TYPE="submit" VALUE="Enviar"> <INPUT TYPE="reset" VALUE="Limpar"> </HR> </FORM> </BODY> </HTML> Ooops... Onde está problema ? Debug Formulário HTML: Form1.html Apache Tomcat/4.0.6 - HTTP Status 405 - HTTP method POST is not supported by this URL type Status report message HTTP method POST is not supported by this URL description The specified HTTP method is not allowed for the requested resource (HTTP method POST is not supported by this URL). JavaServlets Formulários HTML & Servlets
  • 88. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 88 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ChkForm1 extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String nome = req.getParameter("nome"); int idade = Integer.parseInt (req.getParameter("idade") ) ; out.println("<HTML>"); out.println("<HEAD><TITLE>Saudação</TITLE></HEAD>"); out.println("<BODY>"); out.println(”Olá, " + nome + “<BR>”); out.println("Você já viveu, <B> " + AgeToDay(idade) + "</B>"); out.println("</BODY></HTML>"); } private int AgeToDay (int idade) { return (int) (idade * 365); } } Onde está problema ? Servlet: ChkForm1.html Debug JavaServlets Formulários HTML & Servlets
  • 89. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 89 JavaServlets
  • 90. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 90 Arquivo Descritor: Para tornar a configuração mais simples e declarar quais são os serviços requerido pelo servlet, escrevemos um documento (arquivo) no formato XML. Este documento pode ser usado para fazer várias coisas, entre elas: - Nomear um servlet; - Fazer Mapeamento; - Fazer Filtros; - Redirecionar Páginas e - Passar parâmetros externos. Nome padrão: web.xml Localização: dentro da pasta WEB-INF <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>ServletHello</servlet-class> </servlet> </web-app> Neste exemplo, podemos chamar o servlet por Hello mesmo que o nome da classe seja ServletHello, veja que o nome do servlet ficou mais amigável. JavaServlets Descritor Exemplo:
  • 91. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 91 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>ServletHello</servlet-class> <init-param> <param-name>mailwebmaster</param-name> <param-value>webmaster@webmaster</param-value> </init-param> </servlet> </web-app> Veja que primeiro declaramos o nome <param-name> do parâmetro e depois o valor <param-value> Tutorial: 1 - Criando arquivo Descritor Declara que o arquivo é XML Declara o DTD do arquivo Faz a nomeação do servlet JavaServlets Descritor Tutorial: 2 - Salve este arquivo como nome de web.xml
  • 92. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 92 Tutorial: 3 - Escrevendo o servlet. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletHello extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String param = getInitParameter("mailwebmaster"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("<h3>" + param + "</h3>"); out.println("</body>"); out.println("</html>"); } } Captura o parâmetro externo JavaServlets Descritor
  • 93. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 93 JavaServlets Métodos: getInitParameter, getInitParameterNames... javax.servlet <<abstract>> GenericServlet getInitParameter(name: String): String getInitParameterNames(): Enumeration log(message: String) log(message: String, Throwable: exc) ... A classe abstrata GenericServlet fornece métodos para capturar os parâmetros java.util.Enumeration getInitParameterNames() Retorna todos os nome dos parâmetros de inicialização como Enumeration de String ou uma Enumeration vazia se não existir parâmetros de inicialização. Métodos: java.util.Enumeration getInitParameter(String name) Retorna uma String contendo o valor do parâmetro de inicialização passado como argumento. Caso o não encontre o parâmetro o valor será nulo (null). classe GenericServlet: public abstract classe GenericServlet Descritor
  • 94. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 94 webapps teste-servlet WEB-INF WebContainer classes Aqui você coloca o Servlet contexto ServletHello.class web.xml Tutorial, parte 3 - Deployment: Para encerrar chame o Servlet, digitando a seguinte URL: http://localhost:8080/teste-servlet/servlet/Hello Você poderia chamar o servlet com nome padrão: http://localhost:8080/teste-servlet/servlet/ServletHello Faça a distribuição dos arquivos: Aqui você coloca o descritor JavaServlets Descritor
  • 95. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 95 1 - O formulário HTML. Converte.html JavaServlets Descritor Exercício <HTML><HEAD><TITLE>Conversão</TITLE></HEAD> <BODY> <H1>Conversão de Real para Dolar:</H1> <FORM ACTION="/servlet/Conversao" METHOD="Post"> <BR>Valor em Real: <INPUT TYPE="text" NAME="valorReal" SIZE=20 TABINDEX=1> <HR> <INPUT TYPE="submit" VALUE="Converter"> <INPUT TYPE="reset" VALUE="Limpar"> </HR> </FORM> </BODY> </HTML>
  • 96. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 96 Este parâmetros externos devem ser passados para o servlet 2 -Faça arquivo Descritor Declara que o arquivo é XML Declara o DTD do arquivo Faz a nomeação do servlet JavaServlets Descritor Obs: Salve este arquivo como nome de web.xml Exercício
  • 97. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 97 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletConverte extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String dataCotacao = getInitParameter("dataCotacao"); double valorDolar = Double.parseDouble( getInitParameter("valorDolar") ); double valorReal = Double.parseDouble(request.getParameter("valorReal") ); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Conversão</title>"); out.println("</head>"); out.println("<body>"); out.println("<h3>Data cotação do Dólar: " + dataCotacao + "</h3>"); out.println("<h3>Valor do Dolar é de U$: <B>" + valorDolar + "<b></h3><BR><BR><BR>"); out.println("<h3> Valor em Real R$: " + valorReal + "<b></h3>"); out.println("<h3>Valor em Dolar é de U$: <D>" + conversaoRealToDolar(valorReal, valorDolar) + "<D></h3>"); out.println("</body>"); out.println("</html>"); } private double conversaoRealToDolar(double valorReal, double valorDolar){ return valorReal * valorDolar; } } 3 - Servlet: ServletConverte. Captura o parâmetro externo JavaServlets Descritor Exercício
  • 98. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 98 webapps ROOT WEB-INF WebContainer classes Aqui você coloca o Servlet contexto ServletConverte.class web.xml 4 - Deployment: Para encerrar chame o Servlet, digitando a seguinte URL: http://localhost:8080/Converte.html. Faça a distribuição dos arquivos: Aqui você coloca o descritor JavaServlets Descritor Exercício
  • 99. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 99 <servlet> O elemento <servlet> pode conter os seguintes elementos: [opcional] <icon> <servlet-name> declara o nome do servlet [opcional] <display-name> [opcional] <description> <init-param> <param-name> <param-value> [opcional] <description> <load-on-startup> indica que servlet deve ser carregado quando uma aplicação web for iniciada. <security-role-ref> “mapeia” os papéis chamados dentro de um servlet e o nome do papel definido para aplicações web. <role-name> nome do papel usado dentro do servlet <role-link> o nome do papel definido em elemento <security-role> [opcional] <description> JavaServlets Descritor <servlet-mapping> <servlet-mapping> mapeia um servlet para URL padrão <servlet-name> <url-pattern> web.xml
  • 100. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 100 JavaServlets Descritor <session-config> <servlet-config> Configura uma sessão de uma aplicação web <session-timeout>define o valor padrão de timeout de uma sessão, valor expresso em minutos <welcome-file-list> < welcome-file-list> Define uma lista de arquivos “welcome” <welcome-file> nome do arquivo <error-page> <error-page> “Mapeia” um erro HTTP ou uma exception para um recurso (página de erro) <error-code> contém código do erro HTTP ou <location> contém a localização da página de erro dentro de uma aplicação web <exception-type> Nome de classe java de exceção <location> contém a localização da página de erro dentro de uma aplicação web <welcome-file-list> <welcome-file>login.jsp</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> Exemplo: web.xml
  • 101. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 101 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>ServletHello</servlet-class> <init-param> <param-name>mailwebmaster</param-name> <param-value>webmaster@webmaster</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/alo</url-pattern> </servlet-mapping> </web-app> O nome do servlet é mapeado de .../servlet/Hello para simplesmente alo. Veja como ficou a URL chamar o servlet: http://localhost:8080/teste-servlet/alo Exemplo: Mapping JavaServlets Descritor O elemento <servlet-mapping> pode ser usado para simplificar o nome de um servlet completo (pacote e nome) ou resolver conflitos de nomes, ambigüidade.
  • 102. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 102 Escrevendo documento XML Boas Práticas: JavaServlets Descritor Alguns cuidados que devemos ter quando escrevemos documentos XML: - XML é “case-sensitive”, ou seja, sensível as letras maiúsculas e minúsculas. - Os elementos devem ser abertos e fechados. <element> ... </element> - Verifique os aninhamentos dos elementos, pois, nem sempre eles são válidos. - Se possível use ferramenta para validar o documento XML antes de publicá-lo. - DTD (Document Type Definition) é responsável pela definição do formato do documento. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  • 103. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 103 JavaServlets
  • 104. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 104 JavaServlets Introdução Quando desenvolvemos uma aplicação Web, uma loja virtual, por exemplo, precisamos guardar algumas informações sobre os clientes e/ou visitantes, tais como preferências, últimas consultas, nome, duração da sessão e etc. Entretanto, algumas outras informações, tais como Número e Validade do Cartão de Crédito, devem ser mantidas apenas como variáveis de memória enquanto durar a sessão. Essas informações, formam um estado de um objeto, logo podemos concluir que elas são transientes. Para guardar estas informações podemos utilizar os “cookies”, que são pequenos arquivos no formato texto, que é armazenado no computador cliente e recuperado pelo aplicação quando necessário. Assim podemos manter o estado das sessões persistentes. Cookies & Sessões
  • 105. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 105 HTTP Servlet, a classe Cookie JavaServlets GenericServlet {abstract} service() <<interface>> HttpServlet doGet() doPost() service() <<interface>> HttpServletRequest getCookie(): Cookie[] meuServlet javax.servlet.http <<interface>> HttpServletResponse addCookie(Cookie) Cookie name: String value: int comment: String domain: String path: String maxAge: int request response Cookies & Sessões
  • 106. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 106 JavaServlets Principais métodos: String getName() - Retorna o nome do Cookie; String getPath() - Retorna o caminho; String getValue() - Retorna o valor do cookie; int getVersion() - Retorna a versão do cookie; int getMaxAge() - Retorna a idade do cookie, que definida em segundos; void setPath(String uri) - Especifica um caminho para o cookie; void setMaxAge(int expiry) - Especifica a idade (em segundos) do cookie; void setValue(String newValue) - Atribui um novo valor ao cookie; void setVersion(int v) - Atribui o número da versão e Outros métodos: getSecure, getDomain, getComment setSecure, setDomain, setComment e clone. Cookies & Sessões Class Cookie: public class Cookie extends java.lang.Object implements java.lang.Cloneable A classe Cookie é fornecida pelo pacote: javax.servlet.http; HTTP Servlet, a classe Cookie
  • 107. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 107 JavaServlets Cookie métodos : Cookie[] getCookies() - Retorna um array contendo todos objetos Cookies. Cookies & Sessões public abstract interface HttpServletRequest extends ServletRequest A interface HttpServletRequest é fornecida pelo pacote: javax.servlet.http; void addCookie(Cookie cookie): Adiciona um Cookie para uma resposta public abstract interface HttpServletResponse extends ServletResponse A interface HttpServletResponse é fornecida pelo pacote: javax.servlet.http; HTTP Servlet, a classe Cookie
  • 108. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 108 JavaServlets Exemplo: Cookies & Sessões import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class CookieExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); // print out cookies Cookie[] cookies = request.getCookies(); for (int i = 0; i < cookies.length; i++) { Cookie c = cookies[i]; String name = c.getName(); String value = c.getValue(); out.println(name + " = " + value); } // set a cookie String name = request.getParamter("cookieName"); if (name != null && name.length() > 0) { String value = req.getParameter("cookieValue"); Cookie c = new Cookie(name, value); response.addCookie(c); } } } Usando Cookies
  • 109. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 109 JavaServlets Mantendo informações sobre uma sessão: Quando o usuário faz a primeira chamada ao servidor uma sessão é criada gerando uma identificação única, veja exemplo: ID 8E4A1E34E91384AA18362CF5A856049B Este ID é mantido durante a navegação do usuário pelo site, até que ele feche o browser, troque de URL ou o tempo de vida da sessão expire. A classe HttpSession implementa esta funcionalidade. O método getId() retorna uma string com o identificador único da sessão. Os valores de uma sessão são armazenados na forma de nome e valor. Use o método setAttribute (nome,valor) para guardar o ID. Para recupera-la use o método getAttribute(nome) Sessões: Algumas aplicações web, tais de e-commerce, como uma Loja Virtual, ou de serviços, como home banking. Precisam manter informações sobre o usuário enquanto ele estiver fazendo acesso ao site ou enquanto durar a sessão (geralmente usamos os cookies para determinar quanto tempo pode durar uma sessão). Em loja virtual é necessário manter (o estado) da cesta de compra do usuário enquanto ele navega pelo site... Cookies & Sessões
  • 110. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 110 JavaServlets Principais métodos: Object getAttribute(java.lang.String name) - Retorna um objeto especificada pelo nome ou null se não encontrar o objeto java.util.Enumeration getAttributeNames() - Retorna uma Enumeration de String contendo os nomes dos objetos da sessão boolean isNew() - Retorna um valor lógico, se “true” a sessão é nova String getId() - Retorna um string contendo o identificador único da sessão. void removeAttribute(String name) - Remove um objeto da sessão void setAttribute(java.lang.String name, java.lang.Object value) Atribui um valor ao objeto especificado pelo nome. A interface HttpSession Cookies & Sessões Interface HttpSession: public abstract interface HttpSession interface HttpSession é fornecida pelo pacote: javax.servlet.http;
  • 111. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 111 A interface HttpSession JavaServlets GenericServlet {abstract} service() <<interface>> HttpServlet doGet() doPost() service() <<interface>> HttpServletRequest getSession(create: boolean) getSession() meuServlet javax.servlet.http <<interface>> HttpSession getID: String isNew: boolena getAttribute(name): String setAttribute(name, value) remveAttribute(name) request sessoin Cookies & Sessões
  • 112. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 112 JavaServlets Sessões métodos : Cookies & Sessões public abstract interface HttpServletRequest extends ServletRequest A interface HttpServletRequest é fornecida pelo pacote: javax.servlet.http; HttpSession getSession() Retorna a sessão corrente associada a uma requisição ou se a requisição não tem uma sessão então ela é criada. HttpSession getSession(boolean create) Retorna a sessão corrente associada a uma requisição ou se a requisição não tem uma sessão então ela é criada, se argumento lógico for true. A interface HttpSession
  • 113. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 113 JavaServlets Sessões. Time Out Cookies & Sessões <session-config> <sesson-timeout>10</session-timeout> </session-config> Você pode definir o ciclo de vida de sessão no arquivo descritor: Tempo expresso em minutos
  • 114. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 114 JavaServlets Exemplo: Servlet Cookies & Sessões import java.io.*; import java.util.Enumeration; import javax.servlet.*; import javax.servlet.http.*; public class ServletSession extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Pedido pedido; HttpSession session = request.getSession(true); String codigo = request.getParameter("codigo"); String produto = request.getParameter("produto"); int quantidade = Integer.parseInt(request.getParameter("quantidade")); pedido = new Pedido(produto, quantidade); session.setAttribute(codigo, pedido); out.println("ID " + session.getId()); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); Pedido p = (Pedido) session.getAttribute(name); out.println("Produto: " + p.getProduto()); out.println("Quantidade: " + p.getQuantidade()); } } } Usando Sessão
  • 115. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 115 JavaServlets Exemplo: Formulário HTML (FormSession.html) Cookies & Sessões <HTML><HEAD><TITLE>Pedido</TITLE></HEAD> <BODY> <H1>Preencha os campos:</H1> <FORM ACTION="/servlet/ServletSession" METHOD="Post"> <BR> Código: <INPUT TYPE="text" NAME="codigo" SIZE=10 TABINDEX=1> <BR> Produto: <INPUT TYPE="text" NAME="produto" SIZE=30 TABINDEX=1> <BR>Quantidade: <INPUT TYPE="text" NAME="quantidade" SIZE=5 TABINDEX=2> <HR> <INPUT TYPE="submit" VALUE="Adicionar"> <INPUT TYPE="reset" VALUE="Limpar"> </HR> </FORM> </BODY> </HTML> Exemplo: Entrada de dados Código Produto Quantidade 100 CD Limp Park 1 200 Livro: JSP in Action 2 Usando Sessão
  • 116. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 116 JavaServlets
  • 117. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 117 JavaServlets Principais métodos: void forward(ServletRequest request, ServletResponse response) “Passa a diante” uma requesição de servlet para outro recurso (servlet, JSP página ou página HTML). void include(ServletRequest request, ServletResponse response) Inclui o conteúdo de um recurso (servlet, JSP página ou página HTML) em uma resposta. Interface RequestDispatcher: forward e include Interface RequestDispatcher: public abstract interface RequestDispatcher interface RequestDispatcher é fornecida pelo pacote: javax.servlet. Exemplos: forward e include RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/GetServlet"); rd.forward(httpservletrequest, httpservletresponse); RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/GetServletInclude"); if (rd!=null) try { rd.include(httpservletrequest, httpservletresponse); } catch (Exception e) { } Despachar & Redirecionar
  • 118. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 118 JavaServlets forward RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/TesteB"); rd.forward(httpservletrequest, httpservletresponse); RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/TesteD"); rd.include(httpservletrequest, httpservletresponse); TesteA Requisição HTTP: servletTesteA TesteB Resposta HTTP include TesteC Requisição HTTP: servletTesteC TesteD Resposta HTTP Despachar & Redirecionar
  • 119. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 119 JavaServlets Redirecionar: sendRedirect e sendError Exemplo: response.sendRedirect(”http://www.sun.com/index.xml"); Podemos passar o controle a uma URL (de forma absoluta), não que precisa fazer parte da aplicação. Geralmente utilizado para redirecionar a outra tecnologia, tais como: chamar página PHP, ASP e etc. void sendRedirect(java.lang.String location) void sendError(int sc) void sendError(int sc, java.lang.String msg) Métodos para redirecionamento: public abstract interface HttpServletResponse extends ServletResponse A interface HttpServletResponse é fornecida pelo pacote: javax.servlet.http; Exemplo: response.sendError(404, “Page not found”); O método sendError permite que enviemos uma mensagem (string) ao cliente, com o código de erro: Despachar & Redirecionar
  • 120. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 120 JavaServlets
  • 121. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 121 JavaServlets Introdução Aplicação WEB Uma aplicação WEB é uma coleção de diversos recursos, tais como páginas HTML, imagens (jpg, gif, png), arquivos xml, servlets, páginas JSPs e componentes javabeans, classes entre outros objetos. O arquivo descritor, web.xml, é utilizado para especificar a estrutura e os serviços usados pela aplicação. Dentro de aplicação web deve existir uma área comum de variáveis que pode ser compartilhada por todos os recursos ou pelo maioria deles. Este lugar comum chamamos de contexto. O objeto ServletContext representa a aplicação em execução. Servlet Context
  • 122. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 122 JavaServlets ServletContext ServletContext representa o contexto para uma aplicação WEB Principais características: - Ele permite que se passe o controle para qualquer outro recurso dentro da mesma aplicação. - Existe um mecanismo centralizado de logs, disponível aos servlets e JSP da aplicação - Há uma área para armazenagem de variáveis Servlet Context javax.servlet.ServletContext javax.servlet.ServletContext context = getServletContext(); O método pode ser chamado a partir de qualquer servlet, e está disponível em uma variável JSP também sempre disponível. Este método é criado quando a aplicação WEB é carregada e destruído quando a aplicada web for descarregada. Diferentes Servlets e JSPs da mesma aplicação WEB compartilham o mesmo contexto.
  • 123. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 123 JavaServlets Servlet Context A interface ServletContex <<abstract>> GenericServlet getServletContext(): ServletContext log(message: String) log(message: String, Throwable: exc) javax.servlet <<interface>> ServletContext getInitParameter(name: String): String getInitParameterNames(): Enumeration getAttribute(name: String): Object setAttribute(name: String, value: Objet) getAttributeNames(): Enumeration getResource(path): URL getResourceAsStream(path): InputStream log(message: String) log(message: String, Throwable: exc)
  • 124. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 124 JavaServlets Principais métodos: Interface ServletContext public abstract interface ServletContext interface ServletContext é fornecida pelo pacote: javax.servlet. java.util.Enumeration getInitParameterNames() Retorna todo os nome dos parâmetros de inicialização como Enumeration de String ou uma Enumeration vazia se não parâmetros de inicialização. java.lang.Object getAttribute(java.lang.String name) java.util.Enumeration getAttributeNames() ServletContext getContext(java.lang.String uripath) int getMajorVersion() java.lang.String getMimeType(java.lang.String file) int getMinorVersion() RequestDispatcher getNamedDispatcher(java.lang.String name) java.lang.String getRealPath(java.lang.String path) RequestDispatcher getRequestDispatcher(java.lang.String path) java.net.URL getResource(java.lang.String path) java.io.InputStream getResourceAsStream(java.lang.String path) java.util.Set getResourcePaths(java.lang.String path) java.lang.String getServerInfo() java.lang.String getServletContextName() void log(java.lang.String msg) void log(java.lang.String message, java.lang.Throwable throwable) void removeAttribute(java.lang.String name) void setAttribute(java.lang.String name, java.lang.Object object) Servlet Context A interface ServletContex
  • 125. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 125 JavaServlets Servlet Context Exemplo: Contexto de parâmetro de inicialização <web-app> <context-param> <param-name> catalogoProduto </ param-name> <param-value>/WEB-INF/catalogo.txt</ param-value> ... </context-param> </web-app>> Recuperando os parâmetros: ServletContext ctxt = sce.getServletContext(); String catalogoProduto = ctxt.getInitParameter(“catalogo.txt”); Gravando o log: ctxt.log(“parâmetro catalogoProduto inicializado”); Trabalhando com atributos. Atribuição e Recuperação: ctxt.setAttribute(“catalogo”, catalogoProduto); ctxt.getAtrribute(“catalogo”); Os parâmetros de inicialização são informados, formato nome e valor, no arquivo descritor (web.xml)
  • 126. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 126 JavaServlets Exemplo: Servlet. Gravando atributo import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class CallServletAtrib extends HttpServlet { public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException { RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/GetServletAtrib"); getServletContext().setAttribute ("nome", "Duke"); rd.forward(httpservletrequest, httpservletresponse); if (rd!=null) System.out.println(rd); } } Servlet Context Grava um atributo
  • 127. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 127 JavaServlets Exemplo: Servlet. Recuperando atributo import java.io.*; import javax.servlet.ServletException; import javax.servlet.ServletResponse; import javax.servlet.http.*; public class GetServletAtrib extends HttpServlet { public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException { httpservletresponse.setContentType("text/html"); PrintWriter printwriter = httpservletresponse.getWriter(); StringBuffer stringbuffer = new StringBuffer(); String value = (String) getServletContext().getAttribute ("nome"); stringbuffer.append("<HTML><HEAD><TITLE>n"); stringbuffer.append("A Simple Servlet Examplen"); stringbuffer.append("</TITLE></HEAD><BODY>n"); stringbuffer.append("<H1>Welcome to Servlets!" + value + </H1>n"); stringbuffer.append("</BODY></HTML>"); printwriter.println(stringbuffer.toString()); printwriter.close(); } } Servlet Context Recupera o atributo
  • 128. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 128 JavaServlets A interface ServletConfig Interface ServletConfig public abstract interface ServletConfig Servlet Context A responsabilidade da interface ServletConfig é fornecer um meio para que um servlet possa ter acesso a informações definidas no web.xml durante o processo de inicialização. A interface ServletConfig é parte do pacote: javax.servlet Principais métodos: String getInitParameter(String nome): lê um parâmetro de inicialização <init-param> do web.xml Enumeration getInitParameterNames(): obtém os nomes de todos os parâmetros de inicialização disponíveis Os métodos de ServletConfig devem ser chamados no método init(), do servlet Exemplo: init(ServletConfig) public void init(ServletConfig config) throws ServletException { String p = config.getInitParameter(“name”); }
  • 129. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 129 JavaServlets Interface ServletContextListener Interface ServletContextListener public abstract interface ServletContextListener extends java.util.EventListener Servlet Context Principais métodos: public void contextInitialized(ServletContextEvent e) - Notifica que contexto está pronto para processar resposta. public void contextDestroyed(ServletContextEvent e) Notifica que contexto está pronto para “shut down” Este métodos são chamados depois que um contexto é criado e antes que ele seja destruído. Para isto é preciso registrá-lo no web.xml usando o elemento <listener> Exemplo: <listener> <listener-class>ListenerCtx</listener-class> </listener> ServletContextEvent possui um método getServletContext() que permite obter o contexto associado Você pode usar a ServletContextListener para controlar o ciclo de vida do ServletContext. Esta interface pertence ao pacote javax.servlet.
  • 130. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 130 JavaServlets
  • 131. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 131 JavaServlets Introdução Tratando Erros & Exceções A linguagem Java fornece mecanismo para classificação e tratamento destas exceções. Esse mecanismo de tratamento de exceções tem alguns benefícios, pois permite isolar o código responsável pelo tratamento do erro em blocos separados, deixando o código principal mais limpo. Também é possível tratar erros similares com um único bloco de tratamento, eliminando código duplicado. Temos duas classes que tratam as exceções referente aos Servlets a ServletException e UnavailableException. O que são exceções ? São condições anormais que mudam o fluxo de um programa. Uma exceção pode representar uma falha na leitura ou gravação de um arquivo, erros de sintaxes, problemas com banco de dados, falta de recursos e etc. Quando ocorre uma exceção, ela é lançada e a execução do programa é transferida para o código responsável por tratar essa exceção.
  • 132. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 132 JavaServlets Método: java.lang.Throwable getRootCause() Retorna uma exceção que causou o problema A classe ServletException classe ServletException public class ServletException extends java.lang.Exception A classe ServletException é fornecida pelo pacote: javax.servlet. ServletException ServletException() ServletException(String message) ServletException(Throwable cause) ServletException(Throwable cause, String message) Throwable getRootCause() Exception UnavailableException UnavailableException(String message) UnavailableException(String message, int forSeconds) Tratando Erros & Exceções
  • 133. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 133 JavaServlets Erros genéricos (HTTP): Por “default” quando ocorre um erro o Browser exibe uma página padrão com uma mensagem de erro. Servlets Exceptions: A tecnologia Java pode gerar exceções para indicar que aconteceu algum problema com o processamento da requisição. O Servlet invoca a classe ServletException para informar ao Web Container que uma exceção ocorreu. Os erros HTTP são classificados pelo servidor através de um código de status: - Códigos de status que iniciam com 1, 2 ou 3 não indicam erro - Códigos que começam com 4 ou 5 são erros: Entretanto, os que começam com 4, indicam erro originado no cliente, estes erros podem ser evitados. Já os que começam com 5 (500, por exemplo) indicam erro no servidor , não temos como evita-los. Tratando Erros & Exceções
  • 134. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 134 JavaServlets Servlets Exceptions: Veja o exemplo abaixo: Apache Tomcat/4.0.6 - HTTP Status 500 - Internal Server Error -------------------------------------------------------------------------------- type Exception report message Internal Server Error description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request. exception java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Integer.java:436) at java.lang.Integer.parseInt(Integer.java:518) at ServletSession.doPost(ServletSession.java:20) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:465) at org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:216) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125) at java.lang.Thread.run(Thread.java:534) Tratando Erros & Exceções
  • 135. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 135 JavaServlets Personalizando Páginas de erro Podemos personalizar as páginas de erro de uma aplicação web de duas formas: - Declarativa e - Programática. - Declarativa <error-page> <exception-type> java.io.IOException </exception-type> <location>/erros/errospage.html</location> </error-page> No arquivo descritor, web.xml, podemos definir um conjunto de tags para redirecionar os erros e as exceções ocorridas na aplicação. É importante criar mapeamento para que esta alternativa funcione corretamente - Programática Usando a estrutura try/catch/finally. Poderíamos capturar as exceções (catch) e redirecionar para uma página personalizada: Exemplo: (fragmento de código) catch(ServletException e){ request.setAttribute(“exception: “, e); errorPage.forward(request, response);} Tratando Erros & Exceções
  • 136. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 136 JavaServlets Tutorial 1: Formulário HTML. Divisão.html <HTML> <HEAD> <TITLE> Teste de Erros e Exceptions </TITLE> </HEAD> <BODY> <H1>Divisão de valores:</H1> <FORM ACTION="/exception/servlet/Divisao" METHOD="Get"> <BR>Entre com primeiro valor : <INPUT TYPE="text" NAME="valor1" SIZE=10 TABINDEX=1> <BR>Entre com segundo valor : <INPUT TYPE="text" NAME="valor2" SIZE=10 TABINDEX=1> <HR> <INPUT TYPE="submit" VALUE="Dividir"> <INPUT TYPE="reset" VALUE="Limpar"> </HR> </FORM> </BODY> </HTML> Tratando Erros & Exceções
  • 137. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 137 JavaServlets Tutorial 2: Servlet: ServletDivisao.html import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletDivisao extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { int div1 = Integer.parseInt( request.getParameter("valor1") ); int div2 = Integer.parseInt( request.getParameter("valor2") ); int resultado = (div1 / div2); //divisão int restodivisao = (div1 % div2); //resto da divisão response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Divisão</title>"); out.println("</head>"); out.println("<body>"); out.println("<br><br>"); out.println("<H2>Divisão: " + div1 + " divido " + div2 + " = <b>" + resultado + "</b><br><br></H2>"); if (restodivisao > 0 ) out.println("Resto da divisão: <b>" + restodivisao +"</b>"); out.println("</body>"); out.println("</html>"); } } Tratando Erros & Exceções
  • 138. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 138 JavaServlets Tutorial 3: O descritor: web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Divisao</servlet-name> <servlet-class>ServletDivisao</servlet-class> </servlet> </web-app> Tratando Erros & Exceções
  • 139. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 139 JavaServlets Tutorial 4: Teste 12 / 2 = 6 9 / 3 = 3 Apache Tomcat/4.0.6 - HTTP Status 500 - Internal Server Error -------------------------------------------------------------------------------- type Exception report message Internal Server Error description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request. exception java.lang.ArithmeticException: / by zero at Divisao.doGet(Divisao.java:14) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) 4 / 0 = erro (1) (2) (3) Tratando Erros & Exceções
  • 140. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 140 JavaServlets Tutorial: 5 - Personalizando a Página de Exceções e Erros Posso personalizar as páginas de exceção e erros ? - Declarativa Temos algumas opções para resolver este problema. Primeira opção escrever os elementos <error-page> dentro do arquivo descritor. <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Divisao</servlet-name> <servlet-class>ServletDivisao</servlet-class> </servlet> <error-page> <exception-type> java.lang.ArithmeticException </exception-type> <location>/erros/erro.html</location> </error-page> </web-app> Tratando Erros & Exceções
  • 141. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 141 JavaServlets Tutorial: 6 - Personalizando a Página de Exceções e Erros Posso personalizar as páginas de exceção e erros ? <HTML> <HEAD> <TITLE> Teste de Erros e Exceptions </TITLE> </HEAD> <BODY> <H1>Página de Erro:</H1> <H2> Divisão por zero! </H2> </BODY> </HTML> Página de erro: erro.html Tratando Erros & Exceções
  • 142. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 142 JavaServlets Exercício: 1 - Teste O que acha o que acontece se não for informar nenhum valor e enviar a requisição ao servlet ? Escolha um resposta: 1 ( ) Nada 2 ( ) Uma exceção 3 ( ) Uma mensagem de erro Apache Tomcat/4.0.6 - HTTP Status 500 - Internal Server Error ------------------------------------------------------------------------------------------------------------------ type Exception report message Internal Server Error description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request. exception java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:489) at java.lang.Integer.parseInt(Integer.java:518) at Divisao.doGet(Divisao.java:11) Quiz-Show Agora que já sabe o problema dê a solução. Use o arquivo descritor. Tratando Erros & Exceções
  • 143. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 143 JavaServlets Tutorial: 7 - Personalizando a Página de Exceções e Erros Posso personalizar as páginas de exceção e erros ? - Programática: Uma outra opção para resolver este problema, tratar a exceção dentro da próprio Servlet, utilizando o método sendError, podemos produzir uma mensagem mais amigável ao usuário. Apache Tomcat/4.0.6 - HTTP Status 500 - Divisão por zero -------------------------------------------------------------------------------- type Status report message Divisão por zero description The server encountered an internal error (Divisão por zero) that prevented it from fulfilling this request. Tratando Erros & Exceções
  • 144. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 144 JavaServlets Tutorial: 8 - Personalizando a Página de Exceções e Erros - Programática: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletDivisao2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { int div1 = Integer.parseInt( request.getParameter("valor1") ); int div2 = Integer.parseInt( request.getParameter("valor2") ); try { int resultado = (div1 / div2); int restodivisao = (div1 % div2); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Divisão</title>"); out.println("</head>"); out.println("<body>"); out.println("<br><br>"); out.println("<H2>Divisão: " + div1 + " divido " + div2 + " = <b>" + resultado + "</b><br><br></H2>"); if (restodivisao > 0 ) out.println("Resto da divisão: <b>" + restodivisao +"</b>"); out.println("</body>"); out.println("</html>"); } catch(java.lang.ArithmeticException e){ response.sendError(response.SC_INTERNAL_SERVER_ERROR, "Divisão por zero"); } } } Tratando Erros & Exceções
  • 145. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 145 JavaServlets
  • 146. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 146 JavaServlets Threads Threads Servlet geralmente executa sobre um servidor multithread, cabe você deve tratar os acessos concorrente. Podemos usar “synchronized” para garantir a integridade dos dados. Exemplo 1: A sincronização é feita sob o método import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletThread extends HttpServlet { public synchronized void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Conversão</title>"); out.println("</head>"); out.println("<body>"); out.println("<H2>Contagem</H2><BR><BR>"); for(int i=0; i < 5000;i++) out.println("<b>" + i + ", </b>"); out.println("</body>"); out.println("</html>"); } }
  • 147. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 147 JavaServlets Threads Threads Exemplo 2: Neste exemplo é sincronizado somente parte do método. Esta implementação é mais eficiente que anterior. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletThread extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Conversão</title>"); out.println("</head>"); out.println("<body>"); out.println("<H2>Contagem</H2><BR><BR>"); synchronized(this) { for(int i=0; i < 5000;i++) out.println("<b>" + i + ", </b>"); } out.println("</body>"); out.println("</html>"); } }
  • 148. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 148 JavaServlets A interface SingleThreadModel Garante que um servlet trata somente uma única requisição por vez. Ela faz parte do pacote: javax.servlet Threads interface SingleThreadModel public abstract interface SingleThreadModel Não resolve todos os problemas de sincronismo: - Atributos de sessão - Variáveis estáticas “Não é recomendável o uso deste recurso, pois, ele é ineficiente. ** Deprecated na especificação Servlets 2.4 ** SingleThreads public class seuServlet extends HttpServlet implements SingleThreadModel { //… }
  • 149. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 149 JavaServlets
  • 150. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 150 JavaServlets Autenticação Segurança BASIC: Exibe uma janela do browser que recebe nome e senha. Os dados são enviados em conexão insegura. FORM: Igual a BASIC, mas, em vez de usar uma janela do browser, é permitido o usar um formulário HTML, por exemplo. DIGEST: Exige um algoritmo de criptografia para enviar os dados, exemplo: MD5 CLIENT-CERT: Requer do usuário um certificado SSL (Secure Socket Layer) e que container web use protocolo HTTPs (HTTP + SSL), esta é forma mais segura. Os servlet podem ter configuração de segurança em dois domínios: Autenticação: É o processo de verificação da identidade do usuário. Autenticação é medida de segurança que pode ser configurada no Container Web. Existem quatro técnicas, você poderá escolher uma: BASIC, DIGEST, FORM e CLIENT-CERT. <login-config> <auth-method> BASIC </auth-method> </login-config> Exemplo: BASIC
  • 151. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 151 JavaServlets Segurança <login-config> <auth-method> FORM </auth-method> <form-login-page>/login/login.html> </form-login-page> <form-error-page>/login/error.html> </form- error-page> </login-config> Exemplo: FORM Autenticação
  • 152. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 152 JavaServlets Autorização Segurança Autorização: É o processo de divisão de recursos baseado no perfil (role) do usuário. Após a escolher da técnica de autenticação, é necessário definir perfil (role) do usuário. Coleção de recursos web (Web resource collections): É um grupo de páginas e URIs. Geralmente esta coleção tem alguma coisa em comum: Administração, Regras de Negócios Especiais, Clientes Preferencias. Veja exemplo abaixo: A autorização é implementada de forma declarativa, logo usamos o arquivo web.xml para fazer isto. Para implementar a autorização é necessário: - Identificar a coleção de recursos web (Web resource collections) - Identificar o perfis - Mapear a coleção de recursos para perfis (role) - Identificar os usuários e seus respectivos perfis. <web-resource-collection> <web-resource-name>Celebridades</web-resource-name> <description>Acesso restrito para celebridades </description> <url-pattern>/membros/*</url-pattern> <url-pattern>/preferencias/config.jsp</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection>
  • 153. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 153 JavaServlets Segurança Declarando Perfis de Segurança: Agora precisamos definir os perfis dos usuários que serão autorizados a fazer acesso a esta coleção. Esta configuração é feita através do elemento <security- constraint> Veja o exemplo: <security-constraint> <web-resource-collection> <web-resource-name>Celebridades</web-resource-name> <description>Acesso restrito para celebridades </description> <url-pattern>/membros/*</url-pattern> <url-pattern>/preferencias/config.jsp</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>administrator</role-name> </auth-constraint> <security-constraint> <login-config> <auth-method> FORM </auth-method> </login-config> <security-role> <role-name>administrator</role-name> <security-role> Autorização
  • 154. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 154 JavaServlets Segurança e Perfis no Tomcat Segurança Para definir domínio de segurança no Tomcat veja a documentação sobre security realms: Para ter acesso às páginas administrativas do Tomcat, é preciso alterar o arquivo: tomcat-users.xml Você pode encontrar este arquivo <TOMCAT_HOME>conf NOTE: By default, no user is included in the "manager" role required to operate the "/manager" web application. If you wish to use this app, you must define such a user - the username and password are arbitrary. --> <tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat" /> <user name="role1" password="tomcat" roles="role1" /> <user name="both" password="tomcat" roles="tomcat,role1" /> </tomcat-users> <user name=”admin" password=”admin” roles=” tomcat,manager,standard,admin />
  • 155. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 155 JavaServlets Tutorial : Protegendo um recurso com a MemoryRealm Segurança Passos: 1 - Verificar o arquivo server.xml (<tomcat_home>conf): Abrir o arquivo server.xml e tenha certeza que o elemento: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> <web-app> <security-constraint> <web-resource-collection> <web-resource-name>seguranca</web-resource-name> <description>Acesso restrito</description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>seguranca</realm-name> </login-config> </web-app> <Realm className="org.apache.catalina.realm.MemoryRealm" /> Está presente e não comentado. 2 - Crie um novo contexto chamado seguranca (dentro da pasta WebApps). Crie também toda estrutura de aplicação web. 3 - Escrever o arquivo web.xml:
  • 156. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 156 <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <role rolename="manager"/> <role rolename="admin"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> <user username="admin" password="admin" fullName="Administrador" roles="admin,manager,role1,tomcat"/> </tomcat-users> JavaServlets Segurança 4 - Criar um usuário e associar a um perfil. Para fazer isto você deve editar o arquivo tomcat-users.xml. Você pode encontrar este arquivo <TOMCAT_HOME>conf. Acrescente um usuário e uma senha, o perfil que nós vamos usar é “manager” que já está definido. <user name=”admin" password=”admin” roles=”manager” /> Tutoria: Protegendo um recurso com a MemoryRealm Passos (continuação): 5 - Criar uma página html, chamada index.html, coloque este arquivo na raiz do contexto. <html> <head> <title>Segurança</title> </head> <body> <h1> Teste: Segurança </h1> </body> </html>
  • 157. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 157 JavaServlets Segurança 7 - Digite agora usuário e senha: http://localhost:8080/seguranca/ Tutorial: Protegendo um recurso com a MemoryRealm Passos (continuação): 6 - Para encerrar chame o browser e informe a seguinte URL:
  • 158. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 158 JavaServlets
  • 159. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 159 JavaServlets Introdução Filtros O uso de filtro permite modificar as requisições e as respostas dinamicamente. As requisição podem ser interceptadas e alteradas antes e depois do processamento do servlet. Os filtros podem ser aplicados a páginas ou componentes web. Os filtros são implementados através de três interfaces: Filter, FilterChain e FilterConfig ambas são pertencentes ao pacote javax.servlet Veja algumas coisas que os filtros podem fazer: Browser (cliente) Filtro1 Servlet Requisição HTTP Resposta HTTP Filtro2 Filtro1 Bloquear requisição Fazer autenticação Personalizar Requisição Descompactação Personalizar Resposta Transformação XSLT Compactação
  • 160. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 160 JavaServlets Interface Filter Pacote: javax.servlet Interface Filter public abstract interface Filter Filtros Principais métodos: void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException Filtros podem trabalhar encadeados, ou seja, um filtro pode chamar outro filtro. Pacote: javax.servlet Interface FilterChain public abstract interface FilterChain Interface FilterChain Principais métodos: void init(FilterConfig config) throws ServletException: Objeto que faz inicialização do filtro. void destroy(): Objeto que libera os recursos alocados pelo filtro. void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: Objeto que faz filtro trabalhar.
  • 161. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 161 JavaServlets API. FilterConfig Pacote: javax.servlet Interface FilterConfig public abstract interface FilterConfig Filtros Principais métodos: java.lang.String getFilterName() - Retorna o nome do filtro definido no arquivo descritor. java.lang.String getInitParameter(java.lang.String name) Retorna uma string contendo o valor do parâmetro de inicialização especificado pelo argumento java.util.Enumeration getInitParameterNames() - Retorna Enumeration de objetos string contendo os nomes dos parâmetros de inicialização . ServletContext getServletContext() - Retorna a referêcia do ServletContext Esta classe permite a configuração do filtro durante o processo de iniciação Pronto inicio init() destroy() fimdoFilter() Ciclo de vida
  • 162. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 162 JavaServlets Os elementos do Filtro Filtros <filter> <filter-name> log </filter-name> <filter-class> LogFilter </filter-class> </filter> O uso de filtro requer a implementação da declaração do elemento <filter> no arquivo descritor, web.xml, escrevemos os elementos referente ao filtro, primeiro definimos o nome do filtro e o nome da classe. Depois definimos o “mapeamento”: <filter-mapping> <filter-name>log</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
  • 163. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 163 JavaServlets Tutorial 1 - Classe que implementa o Filtro: Filtros import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public final class SimpleFilter implements Filter { private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig) { this.fi lterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; filterConfig.getServletContext().log("in SimpleFilter"); chain.doFilter(request, response); filterConfig.getServletContext().log("Getting out of SimpleFilter"); } public void destroy() { filterConfig = null; } public String toString() { String goBack=null; if (filterConfig == null) goBack ="SimpleFilter()"; else { StringBuffer sb = new StringBuffer("SimpleFilter("); sb.append(filterConfig); sb.append(")"); goBack = sb.toString(); } return goBack; } }
  • 164. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 164 JavaServlets Tutorial 2 - O arquivo Descritor. Filtros <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> <web-app> <filter> <filter-name>Teste Filtro</filter-name> <filter-class>SimpleFilter</filter-class> </filter> <filter-mapping> <filter-name>Teste Filtro</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> Mapeamento Nome e classe do Filtro
  • 165. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 165 JavaServlets Tutorial 3 - Arquivo index.html Filtros <html> <head> <title> Filtros </title> </head> <body> <h1> Teste: Filtro </h1> </body> </html> webapps filtro WEB-INF WebContainer classes contexto SimpleFilter.class web.xml Tutorial 4 - Deployment: Faça a distribuição dos arquivos: index.html
  • 166. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 166 JavaServlets Tutorial 5 - Chame o arquivo: index.html Filtros 2004-01-13 20:35:05 StandardWrapper[/filtro:default]: Loading container servlet default 2004-01-13 20:35:05 StandardWrapper[/filtro:invoker]: Loading container servlet invoker 2004-01-13 20:35:49 in SimpleFilter 2004-01-13 20:35:49 Getting out of SimpleFilter 2004-01-13 20:35:49 in SimpleFilter 2004-01-13 20:35:49 Getting out of SimpleFilter 2004-01-13 20:35:49 in SimpleFilter 2004-01-13 20:35:49 Getting out of SimpleFilter Registro: Nome do arquivo: localhost_log.2004-01-13 local: <TOMCAT_HOME>log 1 2 Note que toda vez que você chama o arquivo: index.html preciso é registrado no log e depois o browser exibe o arquivo.
  • 167. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 167 JavaServlets
  • 168. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 168 JavaServlets 1 - Tente evitar o uso da interface SingleThreadModel 2 - Use o servlet para responder requisições que não tenham o formato HTML, pois, o JSP é mais apropriado para isto. 3 - Substitua o out.println(...) por StringBuffer.append(...), assim reduzimos o tráfego de rede. Exemplo: Boas Práticas Recomendações: StringBuffer buffer = new StringBuffer(); buffer.append("<HTML><HEAD><TITLE>n"); buffer.append("A Simple Servlet Examplen"); buffer.append("</TITLE></HEAD><BODY>n"); buffer.append("<H1>Welcome to Servlets!" + value + </H1>n"); buffer.append("</BODY></HTML>"); //O método setContentLenght define o tamanho do conteúdo que será //enviado ao cliente. httpServletResponse.setContentLength(buffer.length()); httpServletResponse.getOutputStream().print(buffer.toString()); 4 - Use classes e componentes Javabeans e/ou EJBs para lógica de negócio. 5 - Use os métodos init(), service() e destroy().
  • 169. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 169
  • 170. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 170 Introdução Estrutura Elementos Declarações Scriptlet Expressões Objetos Implicitos Request Response Session Out Application Comentários Diretivas page inclue Cookies Tratando Exceções Actions JavaBeans Outras Ações Custom Tags Comparação JSP e Servlet Formulários Integrando JSP e Servlets Tags Lib JavaBeans JDBC - Conexão com Banco de Dados Conteúdo JavaServer Pages
  • 171. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 171 JavaServer Pages
  • 172. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 172 Introdução É uma tecnologia baseada em Java que simplifica o processo de desenvolvimento de sites com conteúdo dinâmico. Com JSP os designers e programadores podem rapidamente incorporar elementos dinâmicos em páginas usando o Java embutido e algumas tags de marcação simples (HTML). Estas tags fornecem ao designer de HMTL um meio de fazer acesso aos dados e lógica de negócios armazenadas em objetos, tais como JavaBeans e EJB, sem precisar conhecer as complexidades do desenvolvimento destes componentes. JSP é um script server side (lado servidor), ele faz uso de todas as APIs Java já existentes, como JDBC, JavaMail e etc. Estrutura básica do JSP: •Elementos de script •Tipos de variáveis •Estruturas de controle •Declaração de funções Componentes: JavaBeans •Definindo classes •Passagem de parâmetros •Servidores JavaServer Pages
  • 173. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 173 Principais Vantagens: Suporte a componentes, estimulando o reúso; Recompilação automática quanto são feitas mudanças no código; Possibilita a separar conteúdo da lógica de negócio; Suporte as APIs Java; É portável; Oferece a possibilidade de criar Tags “customizadas” e Suporte a XML. Principais Desvantagens: É necessário um Java web container e Tempo de aprendizado maior que as demais concorrentes (ASP e PHP). JavaServer Pages
  • 174. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 174 Servidores e Web Contêiner: Cliente (browser) Servlets (após a compilação) JavaBeans SGDB Container Componentes Requisição HTTP Servidor Web Resposta HTML Servidor Web JSP OUServlets JavaServer Pages
  • 175. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 175 Estrutura de execução de um arquivo JSP: Requisição HTTP: JavaServer Pages Chama o mecanismo JSP Arquivo JSP encontrado? Retorna erro HTTP 404 Código-fonte compilado? Compila o arquivo JSP Carrega as clases código.jspInit() Chama código.jspService() para processar a requisição HTTP Código.class carregado? não Retorna resposta HTTP não sim sim sim As páginas JSP são compiladas na primeira execução e transformadas em Servlet.
  • 176. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 176 Ciclo de Vida de um arquivo JSP: Chama o método _jspInit() Fase de carregamento Chama o método _jspService() Chama o método _jspDestroy() Fase de Serviço Fase de descarregamento Processa as requisições JSP inicializada JSP finalizada JavaServer Pages
  • 177. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 177 Nos endereços acima podemos encontrar: - API, Documentação Exemplos e demais tecnologias relacionada com JSP. http://java.sun.com/products/jsp/ JavaServer Pages Onde posso encontrar informações sobre Java Servlets e JSP ? http://java.sun.com/products/servlet/index.html
  • 178. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 178 Ferramentas que tem suporte JSP e Servlets Neste endereço podemos encontrar uma lista de produtos com suporte a Java Servlet e JS:P http://java.sun.com/products/jsp/industry.html O Tomcat é um servlet container que tem suporte a Java Servlets e JSP. Ele é contêiner “Open Source”, é também o mais popular. Para maiores informações: http://jakarta.apache.org/tomcat/index.html O Tomcat pode utilizado como qualquer Servidor Web, tais como: Apache ou Microsoft Internet Information Server. Outra opção para a plataforma Windows (IIS) tenha suporte a JSP e Servlets, podemos usar um Plug-in, Caucho Resin - O Resin é um dos web container compatíveis com Servlets Java e também trabalha como Servlet Engine para servidores web IIS, SunOne e Apache. Além de Open Source (padrão aberto) ele tem uma boa performance e bons recursos como bibliotecas próprias. http://www.caucho.com JavaServer Pages
  • 179. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 179 Comparação JSP e ASP: Fonte: http://java.sun.com/products/jsp/industry.html JavaServer Pages Active Server Pages Web Server Support Most popular web servers including Apache, Netscape, and Microsoft IIS can be easily enabled with JSP. Native support only within Microsoft IIS or Personal Web Server. Support for select servers using third-party products. Platform Support Platform independent. Runs on all Java-enabled platforms. Is fully supported under Windows. Deployment on other platforms is cumbersome due to reliance on the Win32- based component model. Component Model Relies on reusable, cross- platform components like JavaBeans, Enterprise JavaBeans, and custom tag libraries. Uses the Win32-based COM component model. Scripting Can use the Java programming language or JavaScript. Supports VBScript and JScript for scripting. Security Works with the Java security model. Can work with the Windows NT security architecture. Database Access Uses JDBC for data access. Uses Active Data Objects for data access. Customizable Tags JSP is extensible with custom tag libraries. Cannot use custom tag libraries and is not extensible. JavaServer Pages
  • 180. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 180 JavaServer Pages
  • 181. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 181 JSP - Estrutura básica: Existem duas categorias de elementos de programação disponíveis para construir um aplicativo JSP: JavaServer Pages Elementos de script JSP, que são usados para incorporar código Java em uma página JSP. Objetos implícitos JSP, que estão disponíveis dentro de página JSP, para acessar os objetos Java subjacentes, como uma requisição “request” HTTP.
  • 182. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 182 JSP - Estrutura básica: Existem três tipos de elementos de script disponíveis em uma JSP: Declarações; <%! Declaration %> Scriptlets: <% code %> Expressões <%= expression %> A especificação JSP fornece duas maneiras de notação sintática para cada tipo de elemento de script. Uma notação usa delimitadores como <% e %> para iniciar e terminar um elemento de script, enquanto a outra usa sintaxe compatível com XML para mesmo fim. O motivo de fornecer notações semelhante à XML é para permitir que as JSPs possam ser escritas usando ferramentas de autoria de documento XML. JavaServer Pages
  • 183. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 183 JSP - Estrutura básica: Declarações; São as declarações de variáveis e método Java, que usaremos no código Java do arquivo JSP. Elas aparecem dentro de tags <%! e %> e podem ser usadas na página inteira. Exemplo, o bloco a seguir declara duas variáveis Java do tipo de dado String: Nome e Sobrenome: <%! String Nome; String Sobrenome; %> Usando-se a notação compatível com XML, as declarações são escritas da seguinte forma: <jsp:declaration> String Nome; String Sobrenome; </jsp:declaration> JavaServer Pages
  • 184. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 184 JSP - Estrutura básica: Declarações (continuação); As variáveis declaradas anteriormente, são inicializadas quando a página JSP é carregada. Essas declarações de variáveis não produzem diretamente qualquer saída na página mas, elas são usadas por outros elementos na JSP, como expressões e scriptlets, para criar conteúdo dinâmico. JavaServer Pages
  • 185. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 185 JSP - Estrutura básica: Declarações: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>JSP Declarations</TITLE> <META NAME="author" CONTENT="Marty Hall"> <META NAME="keywords" CONTENT="JSP,declarations,JavaServer,Pages,servlets"> <META NAME="description" CONTENT="A quick example of JSP declarations."> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>JSP Declarations</H1> <%! private int accessCount = 0; %> <H2>Accesses to page since server reboot: <%= ++accessCount %></H2> </BODY> </HTML> Declarações AccessCounts JavaServer Pages
  • 186. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 186 JSP - Estrutura básica: Expressões: São as expressões Java avaliadas durante a execução e impressas como String na página de saída. Elas aparecem incorporadas dentro de tags <%= e %>, que são intercaladas com o conteúdo estático. Por exemplo, a instrução a seguir incorpora a expressão Java Nome dentro de algum código HTML para imprimir a saudação: Oi <%= Nome %> ! Bom dia Na notação XML, veja como ficaria: Oi <jsp:expression> Nome </jsp:expression> ! Bom dia JavaServer Pages
  • 187. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 187 JSP - Estrutura básica: Expressões (Exemplo): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>JSP Expressions</TITLE> <META NAME="author" CONTENT="Marty Hall"> <META NAME="keywords" CONTENT="JSP,expressions,JavaServer,Pages,servlets"> <META NAME="description" CONTENT="A quick example of JSP expressions."> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H2>JSP Expressions</H2> <UL> <LI>Current time: <%= new java.util.Date() %> <LI>Your hostname: <%= request.getRemoteHost() %> <LI>Your session ID: <%= session.getId() %> <LI>The <CODE>testParam</CODE> form parameter: <%= request.getParameter("testParam") %> </UL> </BODY> </HTML> Expressions http://localhost:8080/Expressions.jsp?testParam=TestePassando parâmetros via URL JavaServer Pages
  • 188. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 188 JSP - Estrutura básica: Scriptlets: Os scriptlets são fragmentos de código Java que são executados quando a JSP é ativada. Elas aparecem dentro de tags <% e %>, intercaladas com o conteúdo estático. Por exemplo: o código abaixo verifica se o valor da variável contador é maior que 0 e imprime uma mensagem na tela, de acordo com o resultado: <% if (contador > 0 ) { %> <B> o valor do contador <%= contador %> </B> <% } else { %> <B> o valor do contador é zero </B> <% } %> JavaServer Pages
  • 189. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 189 JSP - Estrutura básica: Scriptlets: Os scriptlets e a expressão aparecem intercalados com código HTML na ordem que eles devem ser executados. Os scriptlets não são necessariamente blocos completos de instrução Java. Quando a página é traduzida, essas pedaços de código Java são combinados para gerar um bloco Java. Esse bloco deve ser sintaticamente válido, para compilar com êxito. Vejamos como codificar o scriptlet usando a notação XML. JavaServer Pages
  • 190. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 190 JSP - Estrutura básica: Scriptlets: (continuação) <jsp:scriptlet> if (contador > 0 ) { %> </jsp:scriptlet> <B> o valor do contador <jsp:expression> contador </jsp:expression> </B> <jsp:scriptlet> } else { </jsp:scriptlet> <B> o valor do contador é zero </B> <jsp:scriptlet>} </jsp:scriptlet> JavaServer Pages
  • 191. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 191 JSP - Estrutura básica: Request: Esse objeto representa a requisição HTTP da chamada do cliente. Ele é uma espécime do tipo javax.servlet.http.HttpServletRequest, ele fornece os métodos como getParameter(), getParameterNames() e getParameterValues(), para recuperar parâmetros de ativação da requisição HTTP. Response: Esse objeto representa a resposta HTTP do servidor. Ele é uma espécime do tipo javax.servlet.http.HttpServletResponse, ele fornece os métodos como setContentType(), para configurar a codificação de caracteres de saída. JavaServer Pages Objetos JSP implícitos: Para facilitar o desenvolvimento das páginas JSPs, existem vários objetos Java que estão disponíveis para uso. Objetos implícitos: Request, Response, Session, out e Application
  • 192. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 192 JSP - Estrutura básica: Objetos JSP implícitos: (continuação) Session: Esse objeto representa a sessão HTTP associado a requisição do cliente. Ele é uma espécime do tipo javax.servlet.http.HttpServletSession, ele fornece os métodos como getAttribute, setAttribute, para armazenar e recuperar dados. Out: Esse objeto representa o fluxo de saída da JSP. Ele usado para escrever os dados estáticos. Ele é uma espécime do tipo javax.servlet.jsp.JspWriter e prove métodos como print(), println(), clear(), flush() e close(), para escrever dados de saída. Application: Esse objeto representa o contexto da aplicação Web (contexto de servlet) dentro do qual a JSP está sendo executada. Ele é uma espécime do tipo javax.servlet.ServletContext, prove métodos como log(), para gravar erros e outras mensagens no arquivo. JavaServer Pages
  • 193. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 193 Objetos JSP implícitos: (continuação) A especificação JSP define outros objetos implícitos, como pageContext, config e page. pageContext: Representa o contexto da página JSP, javax.servlet.jsp.PageContext config: É semelhate ao “ServletConfig” ele recebe o método init. page: É similar ao “this” da linguagem Java, não é muito usado nas páginas JSPs. Veja um exemplo de um scriptlet JSP que usa o objeto implícito request. <% String user = request.getParameter(“unsername”); out.print(user); %> JavaServer Pages
  • 194. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 194 JSP - Sintaxe básica e estrutura Comentários Existem dois tipos principais de comentários que podem ser usados em uma página JSP: Comentário de Conteúdo: esses comentários são enviados de volta para o browser como parte da resposta de JSP e são visíveis na visualização do código da página. O comentário de conteúdo tem a seguinte sintaxe: <!-- comment --> Aqueles familiarizados com HTML percebem que é a mesma sintaxe de comentário para essa linguagem de marcação. Tais comentários não produzem qualquer saída visível, mas podem ser visualizados pelo usuário final através do item "view source" do browser. Comentários JSP: não são enviados para o cliente e são visíveis apenas nos arquivos fonte JSP originais. O corpo do comentário é ignorado pelo container JSP. Os comentários JSP podem assumir duas sintaxes: <%-- comment --%> e <% /* comment */ %> Esse segundo comentário é introduzido dentro da página através de um scriptlets, usando a sintaxe de comentário nativa da linguagem de criação de scripts, no caso JAVA. JavaServer Pages
  • 195. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 195 JavaServer Pages
  • 196. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 196 JSP - Sintaxe básica e estrutura JavaServer Pages <%@ directive %> <jsp:directive.type Attribute = value/> Actions As diretivas permitem fazer as seguintes coisas: - inserir dinamicamente um arquivo; - Invocar componentes Javabeans e - Chamar outra página. As diretivas são usadas para fornecer informações especiais ao contêiner JSP sobre a página JSP quando ela é compilada para servlet. As diretivas JSP afetam a estrutura global da classe servlet.
  • 197. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 197 JSP - Sintaxe básica e estrutura Diretivas: Existem dois tipos de diretivas: - page: permite importar classes, customização da super classes Servlet entre outras coisas; - include: permite que seja inserido o conteúdo de um arquivo no servlet no momento em que o arquivo JSP é traduzido para servlet. - Diretiva page: A diretiva page tem a seguinte sintaxe: <%@ page attribute1=valor1 attribute2=valor2 attribute3=... %> Abaixo relacionamos os atributos mais utilizados nas diretivas page: - Atributo import: import="package.class" ou import="package.class1,...,package.classN". permite que seja especificado qual o pacote a ser importado. Por exemplo: <%@ page import="java.util.*" %> O atributo import pode pode aparecer várias vezes na mesma página. JavaServer Pages
  • 198. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 198 JSP - Sintaxe básica e estrutura - Atributo isThreadSafe isThreadSafe="true|false". O valor de true (default) indica que servlet é compartilhado pelas múltiplas requisições. Quando o valor é false indica que o servlet deve implementar SingleThreadModel, ou seja, não será compartilhado. - Atributo session session="true|false". O valor de true (default) indica que a variável predefinida session (do tipo HttpSession) deve estar conectada a sessão existente, caso não exista uma sessão, uma nova é criada. O valor false indica que não será usado a sessão. - Atributo buffer buffer="sizekb|none" Especifica o tamanho do buffer para o JspWriter.out (saída). O buffer padrão é definido pelo servidor. - Atributo autoFlush autoflush="true|false" o valor de true (default) indica se o “buffer” deve ser esvaziado quando estive cheio. O valor false, indica que uma exceção deve ser apresentada quando ocorrer overflows. JavaServer Pages
  • 199. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 199 JSP - Sintaxe básica e estrutura - Atributo extends extends="package.class" Define se a super classe do servlet deve ser gerada. - Atributo info info="message" Define uma string que pode ser recuperada pelo método getServletInfo(). Com esse atributo o desenvolvedor pode adicionar uma dados sobre a documentação da página que resume sua funcionalidade. O valor padrão para o atributo é a cadeia vazia (null). - Atributo errorPage errorPage="url" Especifica que a página JSP deve processar algum Throwables (Classe de exceção), mas, não carregá-la na página corrente. - Atributo isErrorPage isErrorPage="true|false" Define se uma página pode atuar como uma página de execeção para uma outra página JSP. O default é false. - Atributo language language="java" Especifica a linguagem que está sendo usada. Por enquanto o JSP suporta somente Java. JavaServer Pages
  • 200. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 200 JSP - Sintaxe básica e estrutura Sintaxe básica (continuação) Diretiva include: A diretiva include permite que sejam incluídos arquivos na hora em que a página JSP é traduzida no servlet. Uma directive include é algo como: <%@ include file="relative url" %> Essa diretiva pode ser implementada de acordo com o a necessidade do desenvolvedor. A maior vantagem deste recurso é que ele evita a duplicação de código. Exemplo: Muitos sites têm uma barra de navegação em cada página. Devido a problemas com frames HTML isto é normalmente implementado com um tabela repetindo o código HTML em cada página do site. Esta diretiva ajuda o desenvolvedor na construção de páginas JSP e facilita a manutenção. Veja o código abaixo: <html> <%@ include file=" barranavega.html" %> <!-Parte específica da página ... --> </body> </html> JavaServer Pages
  • 201. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 201 JSP - Sintaxe básica e estrutura Sintaxe básica (continuação) <%@ include file="relative url" %> Continuação do exemplo: <font face="verdana" size=1 color="#ffffcc"> <a href="home.jsp">HOME</a> - <a href="secao_01.jsp">SEÇÃO 01</a> - <a href="secao_02.jsp">SEÇÃO 02</a> - <a href="secao_02.jsp">SEÇÃO 02</a> </font> Arquivo barranavega.html <html> <body> <font face="verdana" size=1 color="#ffffcc"> <a href="home.jsp">HOME</a> - <a href="secao_01.jsp">SEÇÃO 01</a> - <a href="secao_02.jsp">SEÇÃO 02</a> - <a href="secao_02.jsp">SEÇÃO 02</a> </font> <!-Parte específica da página ... --> </body> </html> JavaServer Pages
  • 202. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 202 JSP - Sintaxe básica e estrutura  Resumo das principais Sintaxes Declarações Declara variáveis e métodos válidos no script daquela página. <%! declaração; [declaração;]+ ... %> Expressões Contém uma expressão válida no script daquela página. <%= expressão %> Scriptlet Contém um fragmento de código válido no script daquela página. <% fragmento de um código com uma ou mais linhas %> Comentário HTML Cria um comentário que é enviado para o cliente viabilizar no código da página. <!-- comentário [<%= expressão %>] --> Comentário JSP É visto apenas no fonte do JSP mas não é enviado para o cliente. <%-- comentário --%> ou <% /* comentário */ %> Diretiva "Include" Inclue um arquivo estático, analisando os elementos JSP daquela página. <%@ include file="URL relativa" %> Diretiva "Page" Define atributos que serão aplicados a uma página JSP. <%@ page [ atributo = valor(es) ] %> atributos e valores: - language="java" - extends = "package.class" - import = "{package.class" | package.* }, ..." ] - session = "true | false" - buffer = "none | 8kb | sizekb" - autoFlush = "true | false" - isThreadSafe = "true | false" - info = "text" - errorPage"relativeURL" - contentType = "{mimeType [; charset = characterSet ] text/html; charset = isso-8859-1}" - isErrorPage = "true | false" Diretiva Taglib Define uma biblioteca tag e um prefixo para uma tag padrão usada na página JSP. <%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %> <tagPrefix:na me> Acessa um padrão de funcionalidade de uma tag. <tagPrefix:name attribute="value" + ... /> <tagPrefix:name attribute="value" + ... > other tags and data </tagPrefix:name> <jsp:foward> Redireciona uma requisição para um arquivo HTML, JSP ou servlet para processar. <jsp:forward page="{relativeURL | <%= expressão %>}" JavaServer Pages
  • 203. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 203 JavaServer Pages
  • 204. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 204 JSP - Sintaxe básica e estrutura  Cookies Cookie é um mecanismo padrão fornecido pelo protocolo HTTP e que permite gravarmos pequenas quantidades de dados persistentes ou transientes no browser de um usuário. Tais dados podem ser recuperados posteriormente pelo navegador. Esse mecanismo é usado quando queremos recuperar informações. Com os cookies, pode-se reconhecer quem entra num site, de onde vem, com que periodicidade costuma voltar. Para se ter uma idéia de como eles fazem parte da sua vida, dê uma olhada na sua máquina. Se você usa o Internet Explore: JavaServer Pages
  • 205. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 205 JSP - Sintaxe básica e estrutura  Cookies No Netscape 7.0, os cookies ficam em . Os cookies em si não atrapalham ninguém, se propriamente usados. Como padrão, os cookies expiram tão logo o usuário encerra a navegação naquele site, porém podemos configurá-los para persistir por vários dias. Além dos dados que ele armazena, um cookie recebe um nome; um servidor pode então definir múltiplos cookies e fazer a identificação entre eles através dos seus nomes. Os cookies são associados ao URL da página que os manipula. JavaServer Pages
  • 206. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 206 JSP - Sintaxe básica e estrutura  Cookies Gerenciando Cookies Os cookies são definidos por um servidor da web. Quando um usuário solicita um URL cujo servidor e diretório correspondam àqueles de um ou mais de seus cookies armazenados, os cookies correspondentes são enviados de volta para o servidor. As páginas JSP acessam os seus cookies associados através do método getCookies() do objeto implícito request. De forma similar, as páginas JSP podem criar ou alterar cookies através do método addCookie() do objeto implícito response. JavaServer Pages Objeto Implícito Método Descrição request getCookies() retorna uma matriz de cookies acessíveis da página response addCookie() envia um cookie para o navegador para armazenagem/modificação Esses métodos são resumidos na tabela abaixo:
  • 207. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 207 JSP - Sintaxe básica e estrutura  Cookies A classe Cookie Manipulamos um cookie através de instâncias da classe javax.servlet.http.Cookie (API import javax.servlet.http.*;) Essa classe fornece apenas um tipo de construtor que recebe duas variáveis do tipo String, que representam o nome e o valor do cookie. O cookie tem a seguinte sintaxe: Cookie cookie = new Cookie("nome" , "valor"); Abaixo apresentamos os métodos fornecidos pela classe Cookie: Método Descrição getName() retorna o nome do cookie getValue() retorna o valor armazenado no cookie getDomain() retorna o servidor ou domínio do qual o cookie pode ser acessado getPath() retorna o caminho deURL do qual o cookie pode ser acessado getSecure() indica se o cookie acompanha solicitações HTTP ou HTTPS. setValue() atribui um novo valor para o cookie setDomain() define o servidor ou domínio do qual o cookie pode ser acessado setPath(nome do path) define o caminho de URL do qual o cookie pode ser acessado setMaxAge(inteiro) define o tempo restante (em segundos) antes que o cookie expire setSecure(nome) retorna o valor de um único cabeçalho de solicitação como um número inteiro Depois de construir uma nova instância, ou modificar uma instância recuperada através do método getCookies(), é necessário usar o método addCookie( ) do objeto response, com a finalidade salvar no navegador do usuário as alterações feitas no cookie. Para apagar um cookie utilizamos a seguinte técnica: chamamos o método "setMaxAge(0)" com valor zero e depois mandamos gravar chamando o método "addCookie( )". Isso faz com que o cookie seja gravado e imediatamente (após zero segundos) expira. JavaServer Pages
  • 208. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 208 JSP - Sintaxe básica e estrutura  Cookies (exemplo:) Guardando informações em um Cookie <html> <head> <title>The Red Cookie Page</title> </head> <%@ page import="java.util.Date" %> <%@ page import="java.net.*" %> <% String cookieName = "RedCookie"; Date now = new Date(); String timestamp = now.toString(); Cookie cookie = new Cookie(cookieName, URLEncoder.encode(timestamp)); cookie.setPath("/webdev"); cookie.setMaxAge(7 * 24 * 60 * 60); // One week cookie.setVersion(0); cookie.setSecure(false); cookie.setComment("Timestamp for red cookie."); response.addCookie(cookie); %> <body> <font color="red"> <h1>The Red Cookie Page</h1> <p> This is the <i>red</i> cookie page.<br> The blue cookie page is <a href="blue-cookie.jsp">here</a>. </p> </font> </body> </html> JavaServer Pages
  • 209. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 209 JSP - Sintaxe básica e estrutura Recuperando as informações de um Cookie <html> <head> <title>The Blue Cookie Page</title> </head> <%@ page import="java.util.Date" %> <%@ page import="java.net.*" %> <% String cookieName = "RedCookie"; Cookie cookies[] = request.getCookies(); Cookie redCookie = null; if (cookies != null) { for (int i = 0; i < cookies.length; ++i) { if (cookies[i].getName().equals(cookieName)) { redCookie = cookies[i]; break; } } } %> <body> <font color="blue"> <h1>The Blue Cookie Page</h1> <p>This is the <i>blue</i> cookie page.<br> You last visited the <a href="red-cookie.jsp">red cookie page</a> <% if (redCookie == null) { %> over a week ago. <% } else { %> on <%= URLDecoder.decode(redCookie.getValue()) %>. <% } %> </p> </font> </body> </html> JavaServer Pages  Cookies (exemplo:)
  • 210. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 210 JavaServer Pages
  • 211. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 211 Tratamento de exceções Exceções Existem pelo menos dois tipos de exceções que podem ocorrer com uma JSP, a primeiro ocorre “tempo de compilação”, ou seja, quando da tradução de JSP para Java Servlet, por exemplo, erros de sintaxes, veja a figura abaixo: Descritor da Tag Library500 Servlet Exception /Fact.jsp:9: '}' expected. pageContext.write(_jsp_string4, 0, _jsp_string4.length); ^ /Fact.jsp:12: Statement expected. public long fact(long x) throws IllegalArgumentException { ^ /Fact.jsp:18: Identifier expected. pageContext.write(_jsp_string5, 0, _jsp_string5.length); ^ 3 errors Resin 2.0.4 (built Thu Nov 15 17:56:24 PST 2001) JavaServer Pages Engine JSP Erros? Sim Não, gera o Servlet Browser Browser Http://localhost:8080/Fact.jsp 2 1 3 Lado Servidor
  • 212. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 212 Tratamento de exceções Exceções O outro tipo de erro que acontece é “em tempo de execução”, quando uma requisição é feita e por algum motivo gera uma exceção, que pode ser desde a falha pode ser de comunicação (rede), de hardware, de web server ou simplesmente quando um objeto ou um recurso é solicitado não é encontrado. Veja o exemplo abaixo: JavaServer Pages Browser Http://localhost:8080/login.jsp 2 1 3 Objeto 500 Servlet Exception /profile.jsp:9: jsp:useBean can't find class `User.Profilea' Resin 2.0.4 (built Thu Nov 15 17:56:24 PST 2001) autenticar.jsp ... <jsp:useBean id=”p" scope="page" class=”User.Profile"/> <jsp:setProperty name = "p" property= "*" /> Lado Servidor Chama o objeto (o componente Javabean) Profile
  • 213. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 213 Tratamento de exceções Quando acontece uma exceção em tempo de execução, devemos trata- lá através de implemento de página de erro, por exemplo, o papel desta página e tornar mais amigável a mensagem de exceção, todavia, podemos fazer algumas interações como gravar o erro em um “log” ou enviar um e-mail para pessoa responsável pela aplicação. A figura abaixo ilustra esta situação. Browser Http://localhost:8080/login.jsp 2 1 3 autenticacao.jsp ... <jsp:useBean id=”p" scope="page" class=”User.Profile"/> <jsp:setProperty name = "p" property= "*" /> Lado Servidor Erros? erro.jsp Não, chama o objeto sim Chama o objeto Profile Requisita a colaboração da JSP autenticacao Trata as possíveis exceções 4 Responde a requisição (Exibe mensagem) JavaServer Pages
  • 214. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 214 Como criar uma página genérica para tratar as exceções: Agora vamos implementar a solução apresentada para tratamento de exceções “em tempo de execução”. Passos: 1 - Criar um página genérica de exceção 2 - Criar páginas para testar a funcionalidade 3 - Fazer um novo teste simulando uma exceção Vamos criar a página genérica de erro, que será responsável por exibir as mensagens de exceções ou de erro. Veja página errorpage.jsp <%@ page isErrorPage="true" %> <html> <body text="red"> <!-- mensagem --> Error: <%=exception.getMessage() %> foi encontrado, avise o responsável pela Aplicação! </body> </html> O atributo isErrorPage =“true”, indica que a página pode fazer tratamento de exceções. Este atributo chama o Container JSP para criar o objeto exception implícito na página. Sintaxe: <%@ page isErrorPage="true|false" %> Podemos destacar do código os seguintes trechos: Sintaxe: <%= exception.getMessage() %> Exibe a mensagem de erro. JavaServer Pages Tratamento de exceções
  • 215. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 215 <%@ page contentType="text/html" errorPage="errorpage.jsp" %> <html> <body text="red"> <!-- teste --> <% if (true) { throw new Exception("Test exception"); } %> </body> </html> Esta diretiva será responsável por referenciar a página de erro. Error: Test exception foi encontrado, avise o responsável pela Aplicação! No segundo teste vamos criar uma página simples que apresente uma exceção no momento de sua execução. Testando a funcionalidade: Para garantir a funcionalidade da solução, precisamos fazer um teste. Abaixo o página de teste. Testerror.jsp Sintaxe: <%@ page errorPage="errorpage.jsp" %> Os Testes Após o teste devemos ter a seguinte mensagem exibida no “Browser”: Destaques: throw new Exception("Test exception") Provoca uma exceção, passando a mensagem. JavaServer Pages Tratamento de exceções
  • 216. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 216 Abaixo uma nova página de teste, chamaremos de divisao.jsp <%@ page contentType="text/html" errorPage="errorpage.jsp" %> <html> <!-- teste --> <% int bananas = 0; int macacos = 10; out.println( "Quantas bananas ganhara cada macaco? " + macacos/bananas ); %> </body> </html> O resultado do segundo teste foi: Error: / by zero foi encontrado, avise o responsável pela Aplicação! Veja a exceção: Divisão por zero Tratamento de exceções JavaServer Pages
  • 217. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 217 Tornando as mensagens mais amigáveis: Podemos personalizar a mensagem de erro, para que ela fique mais amigável, entretanto, para isto precisamos fazer alguns ajuste na página genérica de exceção. Veja o código da página abaixo myerrorpage.jsp <%@ page isErrorPage="true" %> <html> <body text="red"> <!-- mensagem --> Error: <% if (exception instanceof ArithmeticException) { out.println("<H2>" + "Divisão por zero!" + "</H2><BR>"); } else { out.println(exception.getMessage()); } %> foi encontrado, avise o responsável pela Aplicação! </body> </html> Está linha de código possibilita a personalização da exceção, assim estamos tratando a exceção referente a divisão por zero. if (exception instanceof ArithmeticException) Tratamento de exceções Destaque: JavaServer Pages
  • 218. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 218 Um novo teste: Para fazer um teste como nova página genérica de exceção, será necessário criar um arquivo, neste caso criaremos o mydisivao.jsp, que é semelhante ao exemplo anterior, a única mudança foi na diretiva: page errorPage= “myerrorpage.jsp, Veja o exemplo completo abaixo: <%@ page contentType="text/html" errorPage="myerrorpage.jsp" %> <html> <!-- teste --> <% int bananas = 0; int macacos = 10; out.println( "Quantas bananas ganhara cada macaco? " + macacos/bananas ); %> </body> </html> O resultado deste teste foi: Error: Divisão por zero! foi encontrado, avise o responsável pela Aplicação! Tratamento de exceções Veja neste caso que a mensagem exibida é mais inteligível. JavaServer Pages
  • 219. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 219 JavaServer Pages
  • 220. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 220 Ações: Introdução: As ações em JSP são definidas como Tags que podem ser usada para facilitar o encapsulamento de ações comuns. Existem dois tipos de ações: - Aquelas que estão relacionadas com JavaBeans - Outro padrão de ações; Nós começaremos com os JavaBeans. JavaServer Pages
  • 221. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 221 Solução Java
  • 222. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 222 Introdução JavaBeans são componentes escritos em Java, podendo conter regras de negócios, controle de segurança, conexão com banco de dados, formatação de campos em interfaces entre outras coisas. A função do JavaBeans em relação a JSP, é que Beans deve conter regras de negócios, enquanto a JSP tem como objetivo separar conteúdo das regras de negócios, gerar conteúdo dinâmico e etc. Maior vantagem dos componentes é a possibilidade de reúso de código, já que este podem ser usados por mais de uma aplicação. Estrutura: Os componentes são compostos de propriedades e métodos. O métodos devem ser do tipo get/set. Sintaxe: set: public void set<Nome da Propriedade>(<Nome da Propriedade> valor) { //corpo do método } get: public <Tipo da Propriedade> get<Nome da Propriedade>() { //corpo do método } public <Tipo da Propriedade> is <Nome da Propriedade>() O método is<Tipo da Propriedade> é usado somente para propriedades do tipo Boolean. JavaBeans Solução Java
  • 223. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 223 Introdução (continuação) As propriedades podem ser ordenadas. Neste caso, os métodos são declarados da seguinte forma: set public void set<Nome da Propriedade>(int índice,<Nome da Propriedade> valor) { //corpo do método } get: public <Tipo da Propriedade> get<Nome da Propriedade>(int índice) { //corpo do método } public <Tipo da Propriedade> is <Nome da Propriedade>(int índice) Solução Java JavaBeans
  • 224. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 224 JavaBeans Principais Características: • Instropection (introspeção) Controle a publicação e identificação das operações e propriedades de um bean. • Customization (personalização) Habilita o desenvolvedor a personalizar a aparência e comportamento de bean em tempo de projeto • Event (eventos) Habilita a comunicação entre beans através modelo de eventos • Properties (propriedades) Deixa o desenvolvedor escolher a aparência e o comportamento • Persistence (persistência) Permite o salvar e recuperar o estado de bean em meio físico.
  • 225. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 225 JavaBeans O que é Persistência ? “É a possibilidade de armazenar e recuperar os estados dos objeto em dado momento.” Na linguagem Java, consequentemente no JavaBeans, a persistência é implementada através da Interface Serializable . Classes, Objetos e Persistência. Exemplo: ISBN 0747551006 Titulo: Harry Potter and the Order of the Phoenix Autor: J. K. Rowling ISBN 0747551006 Titulo: O Poder da inteligência Emocional Autor: Daniel Goleman Cada livro desta coleção é “instance” (objeto) da classe livro.Cada objeto possui um estado Persistência 00010000 00010011 11110001 11101010 10101011 Serializable
  • 226. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 226 JavaBeans Serialization é implementação de persistência em Java. O que é persistência ? É a possibilidade de gravar métodos virtuais em um meio físico, por exemplo Hard Disk. Entretanto alguns recursos não suportam a persistência são eles: THREADS, IMAGENS E CONEXÕES. A persistência deve ser implementada com cuidado, pois, uma vez implementada, poderemos ter problemas com segurança., pois os métodos podem representar as regras de negócios e estas podem acabar sendo violadas. Para especificar os recursos e/ou atributos que não devem ser persistindo, devemos usar a palavra reservada chamada “transient”.
  • 227. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 227 JavaBeans Exemplo de JavaBeans . import java.io.Serializable; public class MyBean implements Serializable { private int property1; private boolean property2; public MyBean() { } public void setProperty1(int property1) { this.property1 = property1; } public void setProperty2(boolean property2){ this.property2 = property2; } public int getProperty1() { return property1; } public boolean isProperty2() { return property2; } }
  • 228. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 228 Neste exemplo, a tag useBean “instanciará um” objeto que será identificado por soma, a partir da classe app.Soma. A definição do escopo depende muito do projeto em questão. No exemplo acima, este objeto criado será compartilhado por toda sessão que será mantida com o usuário. Caso encontre- se uma nova tag de criação de um objeto da classe app.Soma, o objeto já instanciado será usado não havendo a necessidade de criação de outro. Solução Java JavaBeans Usando componentes JavaBeans Antes de fazer acesso um “bean” dentro de uma página JSP, é necessário identificar o bean e obter uma referência dele. A tag jsp:useBean tenta obter uma referência de um bean que já esteja criado, dependendo do escopo em que ele foi definido. Caso não haja o componente definido haverá a criação de um novo objeto. Sintaxe da a tag: <jsp:useBean id="nome do objeto" class="nome_completo_da_classe" scope="page|request|session|application”/> Exemplo: <jsp:useBean id=”soma" class=”app.Soma" scope="session"/>
  • 229. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 229 Usando componentes JavaBeans Passos para criação do objeto: 1. Tentativa de localizar o objeto baseado nas informações (id, scope). Este inspeção é feita sincronizada apropriadamente por escopo para evitar comportamentos não-determinísticos. 2. Definir a variável de script identificado por id. 3. Se o objeto for encontrado, a variável é inicializada com a referência localizada e então é realizado um casting para o tipo específico. Se o cast falhar então uma exceção do tipo java.lang.ClassCastException irá ocorrer e o processamento da tag acaba. 4. Se o objeto não for encontrado no escopo e a classe não poder ser encontrada, então uma exceção do tipo java.lang.InstantiationException ocorrerá e o processamento da tag acabará. 5. Se o objeto não foi achado no escopo e a classe for encontrada com um construtor default (sem argumentos) o objeto é “instanciado” e associado com a variável de scriplet identificada por id. Se um construtor sem argumentos não for encontrado então uma exceção do tipo java.lang.InstantiationException ocorrerá e o processamento da tag encerará Solução Java JavaBeans
  • 230. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 230 Usando componentes JavaBeans Passos para criação do objeto: 6. O processamento do corpo da tag é então executado. Um corpo de uma tag <jsp:useBean> é executado para realizar algumas inicializações desejadas, veja o exemplo: <jsp:useBean id=”paciente" class="Cliente" scope="page"> <jsp:setProperty name=”paciente" property="nome" value=”Duke"> <jsp:setProperty name=”paciente" property="telefone" value=”9090-6666"/> </jsp:useBean> Neste exemplo é inicializado o objeto “paciente” com as propriedades nome e telefone. Solução Java JavaBeans
  • 231. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 231 Exemplo Arquivo JSP: <%@ page contentType="text/html;charset=WINDOWS-1252"%> <html> <head> <title> Bean Pontencia </title> </head> <body> <jsp:useBean id="p" scope="page" class="Soma.Potencia"/> <jsp:setProperty name = "p" property= "*" /> <form> <input type=text name="num1" size=5 value="<jsp:getProperty name="p" property = "num1" />"> ^ <input type=text name="num2" size=5 value="<jsp:getProperty name="p" property = "num2" />"> = <jsp:getProperty name="p" property = "resultado" /> <br> <input type=submit> </form> </body> </html> Arquivo JSP JavaBeans Requisição Resposta Servlet-JSP JavaBeans Solução Java
  • 232. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 232 package Soma; public class Potencia { double num1 = 0, num2 = 0; public void setNum1(double valor) { num1 = valor; } public double getNum1() { return num1; } public void setNum2(double valor) { num2 = valor; } public double getNum2() { return num2; } public double getResultado() { if (num1 == 0 || num2 == 0) { return 0; } else { return Math.pow(num1,num2); } } } JavaBeans Solução Java Exemplo Como compilar: javac -d . Potencia.java, o arquivo .class estará dentro de “subpasta” chamada Soma.
  • 233. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 233 JavaServer Pages
  • 234. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 234 Outras Ações: JavaServer Pages <jsp:include> Fornece um mecanismo para inclusão de arquivo em página JSP. <jsp:include page="relative URL" flush="true" /> Exemplo: <jsp:include page= "header.jsp" flush="true" /> <jsp:param> Esta tag é usada para prover um parâmetro e seu respectivo valor, paradigma chave e valor. <jsp:param name= "cidade" value= "Javali" /> Esta tag pode ser usado junto com as outras ações. <jsp:plugin> - Permite executar um applet ou JavaBeans, se for preciso carrega um plug in java para executa-lo. <jsp:plugin type = "pluginType" code="classFile" codebase ="relativeURL" > .... </jsp:plugin> <jsp:forward> - Permite fazer “Forward” passar a requisição para outra página.
  • 235. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 235 JSP - Integrando JSP e Servlets Outras Ações: <html> --> <body bgcolor="white"> <!-- Forward to a servlet --> <jsp:forward page="/servlet/servletToJsp" /> </html> Arquivo JSP1 Arquivo JSP Servlet Requisição Resposta Servlet-JSP Arquivo JSP Para chamar um Servlet a partir de um arquivo JSP, usamos o método forward (javax.servlet.RequestDispatcher - esta interface fornece funcionalidade que permitem incluir ou encaminhar as requisições para outros recursos). JavaServer Pages
  • 236. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 236 Arquivo JSP (Hello.jsp)3 JSP - Integrando JSP e Servlets import javax.servlet.*; import javax.servlet.http.*; public class servletToJsp extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) { try { // Set the attribute and Forward to hello.jsp request.setAttribute ("servletName", "servletToJsp"); getServletConfig().getServletContext().getRequestDispatcher("/jsp/jsptoserv/hel lo.jsp").forward(request, response); } catch (Exception ex) { ex.printStackTrace (); } } } <html> <body bgcolor="white"> <h1> I have been invoked by <% out.print (request.getAttribute("servletName").toString()); %> Servlet. </h1> </html> Arquivo Servlet2 JavaServer Pages Outras Ações:
  • 237. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 237 JavaServer Pages
  • 238. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 238 Introdução Tag Lib O padrão de tags do JSP, (<jsp:useBean id=”teste" class=”regras.Teste" scope="session"/>) permite invocar as operações sobre um componente JavaBeans para atender as requisição e despachar páginas JSPs. Entretanto, a tecnologia JSP, também fornece um outro mecanismo para encapsular outros tipos de funcionalidades dinâmicas em “custom tags”, que são extensões da linguagem JSP. “Custom tags” são geralmente distribuídas na forma de “tag libraries” que definem um conjunto de tags e contém os objetos que implementam estas tags. Alguns exemplos de coisas que podemos realizar com “Custom tags”: Operações com objetos implícitos, processar formulários, controlar fluxo de controle (if, for, while etc), fazer acesso banco de dados, enviar e-mail, mensagens e outros serviços. Enfim podemos tratar regras de negócios. Tag Libs
  • 239. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 239 O que é Custom Tag ? Custom Tag é um elemento da Linguagem JSP que é definida pelo usuário (desenvolvedor). Quando uma página JSP contém uma “custom tag” ela é traduzida em um servlet, a tag é convertida para operação sobre um objeto chamado tag handler. O container Web então invoca estas operações quando a página JSP é executada. Principais características:  Podem ser personalizadas via atributos passados pela página chamadora  Podem fazer acesso a todos objetos disponíveis na página JSP.  Podem modificar a resposta gerada pela página chamadora.  Por ser aninhada dentro outra tag, permite interações complexas dentro de página JSP Tag Libs
  • 240. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 240 Tab Library É composta de três elementos: - Diretiva taglib: É uma tag inserida dentro das páginas JSP que permite chamar uma tag custom. - Tag Library Descriptor (TLD): Arquivo XML que define a tag e descrevem informações sobre as tag (por exemplo: localização) e a conecta à sua classe (Tag Handler). - Tag Handler Classes: Fornece funcionalidades as tags. A classe que executa as operações associadas as tags. Tag Libs
  • 241. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 241 Arquitetura: TLDJSP Biblioteca <%@ taglib uri="http://boo.co m/ex” prefix=”data"%> <taglib> <tag> ... </tag> </taglib> Tag1.class Tag2.class Tag3.class TagN.class Java JSP XML Tag Libs
  • 242. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 242
  • 243. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 243 Diretiva taglib: Diretiva taglib: Esta diretiva deve ser declarada na página JSP (logo no início): <%@ taglib uri="/WEB-INF/t-template.tld" prefix="template" %> ... <html> <body> <template: getName /> <body> </html> Tag Libs Exemplo: Define a tag “Hello” que tem como “tag handler” a classe HelloTag.class. <%@ taglib uir = /hello.tld” prefix = “h” %> <hmtl> <body> <h:Hello/> <body> <html>
  • 244. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 244
  • 245. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 245 Descritor TLD (Tag Library Descriptors) Um arquivo TLD é documento escrito em XML que descreve uma tag lib. Um arquivo TLD contém informações gerais e detalhada das tag contidas dentro da lib. Os TLDs são usados pelo Web Container para validar as tags. Regras: Os arquivos TLD devem ter a extensão “.tld”. São armazenados no diretório WEB-INF de arquivo WAR ou em subdiretório da WEB-INF. Os arquivos TLDs deve começar com tag XML, que especifica a versão do XML e do DTD (document type definition). Exemplo: <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> Tag Libs
  • 246. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 246 Tag Libs Todos os subelementos
  • 247. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 247 Escrevendo o arquivo Descritor: <? xml version=" 1.0" ?> <! DOCTYPE taglib PUBLIC "-// Sun Microsystems, Inc.// DTD JSP Tag Library 1.2// EN” "http:// java. sun. com/ dtd/ web- jsptaglibrary_ 1_ 2. dtd"> <taglib> <tlib- version> 1.0</ tlib- version> <jsp- version> 1.2</ jsp- version> <short- name>exemplo</ short- name> <uri> http:// boo. com/ ex </ uri> <tag> <name>data</ name> <tag- class>exemplos. Data</ tag- class> <description>Data atuale</ description> </ tag> </ taglib> Descritor TLD (Tag Library Descriptors) Tag Libs
  • 248. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 248 Exemplo: Descritor TLD (Tag Library Descriptors) Cada TLD pode especificar várias tags usando a seguinte estrutura: <tag> <tagclass> Classe </tagclass> <bodycontent>JSP|Itagdependent|empty</bodycontent> <atribute> <name> nome do atributo </name> <required> true|false|yes|no </required> <rtexprvalue> true|false|yes|no </ rtexprvalue > </atribute> <teiclass> LookupTagTEI<teiclass> </tag> Exemplo: <?xml version=“1.0”?> <taglib> <tag> <name> Hello </name> <tagclass> HelloTag </tagclass> <info> Exemplo Hello </info> </tag> </taglib> Tag Libs
  • 249. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 249 Localização do Descritor O arquivo Web.XML, exemplo: <web-app> <taglib> <taglib-uri>/t-template</taglib-uri> <taglib-location> /WEB-INF/t-template.tld </taglib-location> </taglib> </web-app> Descritor TLD (Tag Library Descriptors) Tag Libs
  • 250. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 250
  • 251. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 251 Tag handlers é tipo especial de classes que contém código que executa uma tag, em outras palavras as funcionalidades de um tag está contida dentro de tag handlers. Diferente JavaBeans que são coleção de funcionalidades comuns, as tag tem objetivo focado para dar suporte a uma simples tag. Um tag library tem uma tag handlers para cada custom tag. Tag Handlers Tag Libs Tag handler é uma classe Java que implementa a interface Tag (javax.sevlet.jsp.Tag) e é executada quando a tag personalizada é processada pelo container JSP. Cada “tag handler” implementa o método: public int doStartTag() que especifica a ação a ser executada quando a tag é processada. Se a tag incluir atributos, então a tag handler deve definir esses atributos e seus métodos get/set, por exemplo: private String name = null; public void setName(String s) { name = s ; } public String getName() { return name ; }
  • 252. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 252 Tag Libs
  • 253. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 253 Exemplo: public Hello extends Tag Suport { public int doStartTag() throws JspExeption { try { pageContext.getOut().print(“Hello”); } catch(Exception e) { throws JspTagExeption(“Hello: ” + e.getMessage()); } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } } Tag Libs
  • 254. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 254
  • 255. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 255
  • 256. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 256 O que é JDBC ? JDBC (Java Database Connectivity) Para fazer conexão com Banco de Dados a linguagem Java tem uma interface chamada JDBC. O que é a interface JDBC ? É uma camada de abstração que permite um aplicativo Java utilizar uma interface padrão (que adere ao ANSI-2 SQL) para fazer acesso a banco de dados relacional, através da linguagem SQL. ODBC (Open Database Connectivity) também é uma interface de acesso a banco de dados relacionais que possui drivers para um grande número de banco de dados. Uma aplicativo Java pode utilizar diretamente uma interface ODBC, mas isto implica em executar chamadas, dentro do código Java a rotinas C da API do ODBC, chamadas com código nativo Java são trabalhosas e elimina a portabilidade de uma aplicação. Conexão com Banco de Dados utilizando a API JDBC Conexão com Banco de DadosJDBC
  • 257. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 257 - Arquitetura JDBC Um aplicativo Java utiliza uma API JDBC a que é independente do Banco de Dados ou “driver” que estiver sendo utilizado. Os drivers para conexão e acesso ao principais banco de dados são fornecidos pelos fabricantes. O desenvolvedor precisa apenas saber utilizar o driver adequando e a API JDBC. Onde obter os drivers? A lista de fornecedores e/ou fabricantes de drivers JDBC está em constante crescimento. Para maiores informações veja o site: http://www.java.sun.com/products/jdbc.drivers.html SGDB Clientes Banco de Dados Aplicação JDBC Conexão com Banco de DadosJDBC
  • 258. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 258 API JDBC. Pacote: java.sql Principais interfaces & classes: Pacote: java.sql.Statement Interfaces: CallableStatement, Statement, PreparedStatement ParameterMetaData Pacote: java.sql.ResultSet Interfaces: ResultSet, ResultSetMetaData, javax.sql.RowSetMetaData, javax.sql.RowSet Pacote: java.sql.Data Interfaces: Blob, Clob, Array, Struct, Ref Classes: Date, java.util.Date, Time, Timestamp, Types Pacote: java.sql.Connection Interfaces: DatabaseMetaData, Connection, Driver, Savepoint Classes: DriverManager, DriverPropertyInfo Exceção: SQLException e SQLWarning Conexão com Banco de DadosJDBC
  • 259. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 259 API JDBC. Exemplos: Pacote: java.sql Principais interfaces & classes: Pacote: java.sql.Statement Interfaces: CallableStatement, Statement, PreparedStatement Statement: (Select, Insert, Update, Delete e Create Table) Statement stmt = con.createStatement(); String sql = ”INSERT INTO Produto(codigo, descricao) VALUES(“+ codigo + “,’”+ descricao +”´)"; int result = st.executeUpdate(sql); PreparedStatement: (Select, Update, Delete e Insert) String sql="DELETE Produto WHERE codigo like ?” PreparedStatement pstmt = con.prepareCall(sql); pstmt.setInt(1, 100); pstmt.execute(); CallableStatement: (Executar Stored Procedure) CallableStatement sp = conn.prepareCall("{ call sp_novo_depto(?, ? , ?)}"); sp.setInt(1, departamento); sp.setString(2, nome); sp.setString(3, local); sp.execute(); Pacote: java.sql.Connection Interfaces: DatabaseMetaData e Connection, DatabaseMetaData: DatabaseMetaData dma = conn.getMetaData (); System.out.println("nConnected to " + dma.getURL()); System.out.println("nConnected to " + dma.getUserName()); System.out.println("Driver " + dma.getDriverName()); System.out.println("Version " + dma.getDriverVersion()); Conexão com Banco de DadosJDBC
  • 260. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 260 API JDBC. Exemplos: Pacote: java.sql Principais interfaces & classes: Pacote: java.sql.ResultSet Interfaces: ResultSet e ResultSetMetaData, ResultSet: (Select) Connection con = DriverManager.getConnection(url,usuario, senha); Statement stmt = con.createStatement(); String sql = ”Select * from Produto"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getInt(“codigo”) + “t” + rs.getString(“descricao”); } ResultSetMetaData: ResultSet rs = st.executeQuery("Select codigo, descricao from Produto order by codigo"); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); Conexão com Banco de DadosJDBC
  • 261. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 261 Tipos de Drivers: •Ponte JDBC-ODBC com driver ODBC •Driver com API parcialmente nativa •Driver puro-Java JDBC-rede •Driver puro-Java com protocolo nativo O Tipo 1 - Ponte O acesso ao banco de dados é via driver ODBC convencional. A ponte possui código nativo a fim de fazer chamadas à API ODBC. A ponte quanto o driver ODBC devem residir na máquina onde está o programa Java (uma vez que as chamadas são locais). Isso exige um controle maior sobre a distribuição do aplicativo Java (Cliente/Servidor) Banco de Dados Clientes Aplicação Protocolo Servidor de Aplicação JDBC HTTP/IIOP/RMI JDBC. Tipos de Drivers Conexão com Banco de DadosJDBC
  • 262. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 262 JDBC. Tipos de Drivers Tipo 4 – Driver puro-Java com protocolo nativo Assim como o tipo 3, este tipo poder se escrito totalmente em Java. O driver acessa diretamente o gerenciador de banco de dados usando o protocolo nativo do mesmo. Por essa razão normalmente é fornecido pelos fabricantes de banco de dados. Em geral é de tamanho reduzido e chamado de “thin driver”. Não é necessário instalação uma vez que o driver é carregado como uma classe Java (inclusive em applets). Este tipo ideal para aplicações com tecnologia baseada em Internet, Extranet e Intranet. Conexão com Banco de DadosJDBC
  • 263. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 263 Driver Manager é uma classe do pacote java.sql responsável por: -Gerenciar o conjunto de drivers JDBC disponíveis para o aplicativo Java; -Fazer a conexão dos drivers com o banco de dados; -Controlar o login e as mensagens entre banco de dados e driver. Um aplicativo pode usar simultaneamente vários tipos de Drivers JDBC distintos (acessando banco de dados diferentes, se necessário). Todos os drivers devem ser registrados na Classe Driver Manager. Para isso, todos os drivers devem possuir um bloco estático onde um objeto de sua classe é “instanciado” e registrado no DriverManager com método estático registerDriver, por exemplo: // Fragmento de código de um driver JDBC import java.sql; public class DriverJDBC implements Driver { static { try { Driver drv = New xDriver(); DriverManager.registerDrive(drv); ... } catch (SQLExpection e) { } } } JDBC. Driver Manager Conexão com Banco de DadosJDBC
  • 264. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 264 Um desenvolvedor que utiliza um driver não precisa saber como ele foi codificado, entretanto, deve saber que é suficiente carregar o driver para que ele se registre no DriverManager. Para carregar o driver pode-se usar um dos 3 modos: -Carga dinâmica da classe com o método ClassforName: Class.forName(“pacote.xDriverJDBC”); ou Fazendo a instance de um objeto para forçar a carga da classe: new pacote.xDriverJDBC(); - Através de linha de comando usando a opção -D Java –Djdbc.drivers=pacote.xDriverJDBC Aplicativo - Através de arquivo de configuração. JDBC. Driver Manager jdbcDriver = oracle.jdbc.driver.OracleDriver jdbcUrl = jdbc:oracle:thin:@10.1.11.13:1521:ORCL jdbcUser = Scott jdbcPassword = Tiger Arquivo:configDB.properties Conexão com Banco de DadosJDBC
  • 265. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 265 ODBC-JDBC (Driver MSAccess) Tipo 1; String url = "jdbc:odbc:cadastros"; // onde “cadastro” é nome registrado na fonte de dados Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //Carrega o driver Connection con = DriverManager.getConnection(url,"usuario","senha"); JDBC. Driver Manager (Exemplos) JDBC (Driver Oracle) Tipo 4 (Thin driver) new oracle.jdbc.driver.OracleDriver(); String url = "jdbc:oracle:thin:@10.1.11.13:1521:ORCL"; Connection con = DriverManager.getConnection(url,"usuario","senha"); JDBC (Driver MySQL) Tipo 4 (versão do driver mm.mysql-2.0.8) Class.forName("org.gjt.mm.mysql.Driver").newInstance(); Connection con = DriverManager.getConnection("jdbc:mysql:/Localhost//mysql?user=root &password="); JDBC (Driver PostGreSQL) Tipo 4 String url = "jdbc:postgresql://host/database" Class.forName("org.postgresql.Driver"); //load the driver Connection con = DriverManager.getConnection(url,username, password); Conexão com Banco de DadosJDBC
  • 266. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 266 Para garantir a integridade dos dados a API JDBC permite definir transações no acesso a Banco de Dados. As transações são agrupamentos de comandos SQL que devem ser executados por inteiro. Assim, o processo de COMMIT finaliza ou efetiva a transação. O comando ROLLBACK desfaz todos os comandos anteriores não efetivando a transação. O Banco de Dados garante que a transação iniciada, mas terminada com um COMMIT, seja automaticamente cancelada (ROLLBACK). Isso assegura que os processos dependentes de várias instruções SQL sejam integralmente feitos ou integralmente desfeitos. Um exemplo clássico de transação é o processo de débito entre contas correntes (exemplo: DOC), deve existir o débito e crédito nas respectivas contas, caso contrário a operação deve ser desfeita. Autocommit, commit e rollback O método setAutoCommit da classe Connection permite mudar esta propriedade: con.setAutoCommit(true); faz com que a mensagem de commit seja enviada após cada commando SQL, e con.setAutoCommit(false): desabilita o commit automático. Neste caso devem ser usados métodos commit e rollback, da classe Conection, para controlar as transações. (Ver a classe Connection – Javadoc) JDBC. Transações Conexão com Banco de DadosJDBC
  • 267. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 267 void commit() Efetiva todos as instruções enviadas ao banco de dados desde a última mensagem semelhante. Termina a transação e começa uma nova. void rollback() Desfaz todas as instruções SQL que foram envidas ao banco de dados desde o último commit(). Recomeça a última transação. Por exemplo: JDBC. Transações con.setAutoCommit(false); try { contaCorrente.debito(valor); outraContaCorrente.credito(valor); // instruções SQL; con.commit(); //envia commit para o banco } catch(Error e) { con.rollback(); //Desfaz a transação } Conexão com Banco de DadosJDBC
  • 268. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 268 Mapeamento entre os tipos de dados SQL e Tipos de Dados Java JDBC. Tipos de Dados SQL TYPE Java Technology Type Char String Varchar String Longvarchar String Numeric java.math.BigDecimal Decimal java.math.BigDecimal Bit boolean Tinyint byte Smallint short Integer int Bigint long Real float float double binary Byte[] Método Java getString getString getString getBigDecimal getBigDecimal getBoolean getByte getShort getInt getLong getFloat getDouble getBytes Conexão com Banco de DadosJDBC
  • 269. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 269 Mapeamento entre os tipos de dados SQL e Tipos de Dados Java JDBC. Tipos de Dados SQL TYPE Java Technology Type Date java.sql.Date time java.sql.Time Timestamp java.sql.Timestamp Método Java getDate getTime getTimestamp Conexão com Banco de DadosJDBC
  • 270. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 270 JBDC commom classes WebContainer Web.xml contexto WEB-INF HelloServlet.class Aplicação classes servlet Aplicação Web JSPs | HTML | Imagens | etc lib jars endorsed lib Coloque aqui o “driver” do Banco de Dados, este driver será compartilhado para todas as aplicaçõeswebapps Coloque aqui o “driver” do Banco de Dados
  • 271. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 271 Comparação
  • 272. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 272 Servlet e JSP - Uma breve comparação: Servlet: Ampliar a funcionalidade do WebServer; Gerar objetos que não contenham HTML; Iniciar aplicações Web Fazer o papel de “controller” em aplicação web JSP: Separar o conteúdo da lógica e regras de negócio; Suporte a conteúdo dinâmico, personalização (a Internet de cada um).  Faz o papel de “view” em uma aplicação Web Comparação Java HTMLJava HTML
  • 273. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 273
  • 274. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 274
  • 275. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 275 Principais Características: - Alta disponibilidade (24x7); - Alcance Global; - Estrutura Escalar; - Performance; - Segurança e - Usabilidade. Introdução Conceitos Aplicação Web
  • 276. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 276 Introdução Desenvolvimento de Aplicações Web Em pouco tempo as aplicações web ficaram popular devido as facilidades e as novas possibilidades de acesso aos dados. Entretanto, as mudanças constantes nos requisitos de negócio e alta competição, tornaram as aplicações mais complexas, com tempo menor de desenvolvimento e com orçamento reduzido. Em meio este cenário apareceram várias técnicas e ferramentas para ajudar o desenvolvimento destas aplicações.
  • 277. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 277 Desenvolvimento de Aplicações Web Aplicações Web Java podem ser divididas em duas categorias: Model 1: O cliente acessa diretamente uma página JSP que redireciona a resposta para a próxima página. Web Server Servlet/ JSP Servlet/ JSP Servlet/ JSP Servlet/ JSP
  • 278. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 278 Desenvolvimento de Aplicações Web Aplicações Web Java podem ser divididas em duas categorias: Model 2: O cliente acessa um Servlet que de acordo com o estado da aplicação determina qual JSP será apresentado como resposta. Web Server Servlet/ JSP Servlet/ JSP Servlet/ JSP Servlet (Controller) JavaBeans/EJB (Model)
  • 279. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 279 Desenvolvimento de Aplicações Web Como faço uma aplicação em três camadas ?
  • 280. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 280 Aplicação do MVC (Model, View e Controller) MVC originou da linguagem Smalltalk e foi usada para projetar interfaces com usuário. Esta padrão é divido em três partes model, view e controller. Model: Representa o dado ou objeto. Ele é que manipula e objetos, exemplo: JavaBeans e EJB. View: É visão de como os dados serão apresentados, exemplo: páginas JSP e ASP Controller: Recebe os dados e faz validação e define o model que manipulará os dados. Exemplo: Servlet. Algumas vantagens do uso do MVC: - Baixo acoplamento; - Possiblita o reúso. - Possibilita o desenvolvimento em paralelo; - Isolamento e separação das camadas e - Separação de Lógica de Negócios e Design (Layout) Desenvolvimento de Aplicações Web
  • 281. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 281 Lado Cliente JSP + HTML Camada de Apresentação Servlets Camada de Lógica e Regra de Negócios JavaBean e EJB Classes View Controller Model Delegação e Mapeamento Trata Regras de Negócios Trata apresentação dos dados Camada Repositório de Dados e Sistemas Legados Banco de Dados Manipula Dados e Consultas Três Camadas=> Big Picture: Aplicação do MVC em ambiente de três camadas (Internet). Lado Servidor WebServer Recurso Browser Desenvolvimento de Aplicações Web Legado
  • 282. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 282 Aplicação do MVC (Model, View e Controller) View: Visão representa a apresentação dos dados (interface com usuário). O componentes View obtém os valores do estado do Model. Separação da View e do Model habilita a construção independente interfaces com diferentes “Look and Feel” (aparências). Diferentes Views podem interagir com mesmo model. JSP é escolha natural para implementação da View Controller: O Controller fornece a ligação da arquitetura MVC. Ela é responsável por receber as requisições e determinar qual o Model apropriado para atende-la. Os Servlets é a opção ideal para o Controller. Desenvolvimento de Aplicações Web
  • 283. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 283 Aplicação do MVC (Model, View e Controller) Model: O modelo representa as regras de negócios de uma aplicação. Encapsulando as regras dentro de um componente facilita os testes, melhora a qualidade e promove o reúso dos componentes. Estado do componentes (model) O estado define um conjunto de valores do Model e inclui métodos para mudar estes valores. Estes métodos são regras de negócios e outros métodos. O “estado” de componente são geralmente um protocolo independente. JavaBeans é uma boa escolha para implementar estes componentes. Desenvolvimento de Aplicações Web
  • 284. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 284 Comparação
  • 285. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 285 Qual a função das páginas JSPs ? View (JSP) JSP: Separar o conteúdo (design), lógica e regras de negócio; Suporte a conteúdo dinâmico, personalização (a Internet de cada um). Desenvolvimento de Aplicações Web
  • 286. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 286 JSP - Estrutura básica: Existem três tipos de elementos de script disponíveis em uma JSP: Declarações; Scriptlets; Expressões A especificação JSP fornece duas maneiras de notação sintática para cada tipo de elemento de script. Uma notação usa delimitadores como <% e %> para iniciar e terminar um elemento de script, enquanto a outra usa sintaxe compatível com XML para mesmo fim. O motivo de fornecer notações semelhante à XML é para permitir que as JSPs possam ser escritas usando ferramentas de autoria de documento XML. View (JSP) Desenvolvimento de Aplicações Web
  • 287. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 287 Declarações; São as declarações de variáveis e método Java, que usaremos no código Java do arquivo JSP. Elas aparecem dentro de tags <%! e %> e podem ser usadas na página inteira. Exemplo, o bloco a seguir declara duas variáveis Java do tipo de dado String: Nome e Sobrenome: <%! String Nome; String Sobreome; %> Usando-se a notação compatível com XML, as declarações são escritas da seguinte forma: <jsp:declaration> String Nome; String Sobreome; </jsp:declaration> Desenvolvimento de Aplicações Web View (JSP) As variáveis declaradas anteriormente, são inicializadas quando a página JSP é carregada. Essas declarações de variável e método não produzem diretamente qualquer saída na página, mas elas são usadas por outros elementos na JSP, como expressões e scriptlets, para criar conteúdo dinâmico.
  • 288. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 288 JSP - Estrutura básica: Expressões: São as expressões Java avaliadas durante a execução e impressas como String na página de saída. Elas aparecem incorporadas dentro de tags <%= e %>, que são intercaladas com o conteúdo estático. Por exemplo, a instrução a seguir incorpora a expressão Java Nome dentro de algum código HTML para imprimir a saudação: Oi <%= Nome %> ! Bom dia Na notaçãoXML, veja como ficaria: Oi <jsp:expression> Nome </jsp:expression> ! Bom dia Desenvolvimento de Aplicações Web View (JSP)
  • 289. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 289 Scriptlets: Os scriptlets são fragmentos de código Java que são executados quando a JSP é ativada. Elas aparecem dentro de tags <% e %>, intercaladas com o conteúdo estático. Por exemplo: o código abaixo verifica se o valor da variável contador é maior que 0 (zero) e imprime uma mensagem na tela, de acordo com o resultado: <% if (contador > 0 ) { %> <B> o valor do contador <%= contador%> </B> <% } else { %> <B> o valor do contador é zero </B> <% } %>a Desenvolvimento de Aplicações Web JSP - Estrutura básica: View (JSP)
  • 290. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 290 Scriptlets: Três diferentes scriptlets Java foram usadas no exemplo anterior: a instrução if, a instrução else e a chave de terminal para o bloco if. Uma expressão JSP incorporada também para exibir o valor da variável contador. Os scriptlets e a expressão aparecem intercalados com código HTML na ordem que eles devem ser executados. Os scriptlets não são necessariamente blocos completos de instrução Java. Quando a página é traduzida, essas pedaços de código Java são combinados para gerar um bloco Java. Esse bloco deve ser sintaticamente válido, para compilar com êxito. Vejamos como codificar o scriptlet usando a notação XML. Desenvolvimento de Aplicações Web JSP - Estrutura básica: View (JSP)
  • 291. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 291 Scriptlets: <jsp:scriptlet> if (contador > 0 ) { %> </jsp:scriptlet> <B> o valor do contador <jsp:expression> contador </jsp:expression> </B> <jsp:scriptlet> } else { </jsp:scriptlet> <B> o valor do contador é zero </B> <jsp:scriptlet>} </jsp:scriptlet> Desenvolvimento de Aplicações Web JSP - Estrutura básica:
  • 292. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 292
  • 293. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 293 Como criar um Servlet genérico ? Controller (Servlets) Introdução: Precisamos criar um Servlet que desempenhará o papel de Controller. Bem para isto será necessário desenvolvermos inicialmente um único Servlet para tal tarefa. Desenvolvimento de Aplicações Web
  • 294. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 294 Primeira opção: Inserir um objeto na página HTML/JSP <FORM METHOD="POST" ACTION="http://myServer/myApp/myServlet"> <INPUT TYPE="HIDDEN" NAME="OP" VALUE="createUser"/> <!-- other form contents... --> </FORM> Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 295. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 295 Uma opção mais elegante: Existem outras maneiras de resolver este problema, vamos olhar algumas delas: 1 - Criar uma collection (MapSet, HashSet, ArrayList ou Vector) para associar o nome da página (HMTL ou JSP) ao componente que atenderá a requisição. Dicas: para capturar a URI (nome reduzido da URL) podemos usar: >> out.println("Request URI: " + request.getRequestURI()); Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 296. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 296 Uma opção nada ”elegante”: Utilização da instrução if para invocar o Model apropriado, Veja o fragmento exemplo: if (op.equals("createUser")) { model.createUser(request.getAttribute("user"), request.getAttribute("pass")); } else if (op.equals("changeUserInfo") { // ... and so on... } Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 297. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 297 A melhor abordagem é usar o Design Pattern Command, para resolver, veja um esboço da solução: Command Execute( ) SearchCommand Execute( ) InsertCommand Execute( ) OutroCommand Execute( ) Design Pattern “Command” fornece uma solução genérica que simplifica a chamada de um Model, cada “chamada” será considerada uma comando. Desenvolvimento de Aplicações Web Controller (Servlets)
  • 298. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 298 Exemplos: // Action.java: public abstract class Action { protected Model model; public Action(Model model) { this.model = model; } public abstract String getName(); public abstract Object perform(HttpServletRequest req); }; // CreateUserAction.java: public class CreateUserAction extends Action { public CreateUserAction(Model model) { super(model); } public String getName() { return "createUser"; } public Object perform(HttpServletRequest req) { return model.createUser(req.getAttribute("user"), req.getAttribute("pass")); } } Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 299. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 299 Exemplos: public class ControllerServlet extends HttpServlet { private HashMap actions; public void init() throws ServletException { actions = new HashMap(); CreateUserAction cua = new CreateUserAction(model); actions.put(cua.getName(), cua); //... create and add more actions } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { // First identify operation "op" from URL. // method getOperation() is defined elsewhere. String op = getOperation(req.getRequestURL()); // Then find and execute corresponding Action Action action = (Action)actions.get(op); Object result = null; //continua... Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 300. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 300 Exemplos: //Continuação try { result = action.perform(req); } catch (NullPointerException npx) { //... handle error condition: no such action } // ... Use result to determine next view (see next section) } //... other methods... } Desenvolvimento de Aplicações Web Controller (Servlets) Como criar um Servlet genérico ?
  • 301. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 301
  • 302. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 302 A - RFCs Apêndice B - JSP (Quick Reference) C - Jar Files
  • 303. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 303 A - RFC´s • RFC 1630 Uniform Resource Identifiers (URI) • RFC 1738 Uniform Resource Locators (URL) • RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax • RFC 1808 Relative Uniform Resource Locators • RFC 1945 Hypertext Transfer Protocol (HTTP/1.0) • RFC 2045 MIME Part One: Format of Internet Message Bodies • RFC 2046 MIME Part Two: Media Types • RFC 2047 MIME Part Three: Message Header Extensions for non-ASCII text • RFC 2048 MIME Part Four: Registration Procedures • RFC 2049 MIME Part Five: Conformance Criteria and Examples • RFC 2109 HTTP State Management Mechanism • RFC 2145 Use and Interpretation of HTTP Version Numbers • RFC 2324 Hypertext Coffee Pot Control Protocol (HTCPCP/1.0)1 • RFC 2616 Hypertext Transfer Protocol (HTTP/1.1) • RFC 2617 HTTP Authentication: Basic and Digest Authentication Online versions of these RFCs are at http://www.rfc-editor.org/. Apêndice The Request for Comments (RFCs) The Requests for Comments (RFC) document series is a set of technical and organizational notes about the Internet (originally the ARPANET), beginning in 1969. Memos in the RFC series discuss many aspects of computer networking, including protocols, procedures, programs, and concepts, as well as meeting notes, opinions, and sometimes humor. For more information on the history of the RFC series, see "30 years of RFCs". http://www.rfc-editor.org/
  • 304. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 304 JSP Quick Reference Card Default scripting language The scripting language of a JSP page defaults to Java. Insert the following line in a JSP page to configure the page to use JavaScript: <%@ page language = "javascript" %> Using white space White space contained within the template code is returned to the client as it was entered in the JSP. Quoting attribute values Quote attribute values, using either single or double quotes, to all JSP elements. For example: <%@ page contentType = " text/plain " %> Writing comments for the JSP A JSP comment is not output to the client as part of the JSP page’s output. <%-- Comment string ... --%> Outputting comments to the client HTML comments are output to the client. <!-- comments --> Basic Syntax page Defines page-wide attributes. <%@ page attribute =" value " ... %> attributes , with default values, are: attribute = language="java" | session="true" | contentType=text/html;charset="ISO-8859-1" | import=" package(s) " | buffer="8kb" | autoflush="true" | isThreadSafe="true" | info="text_string" | errorPage=" relativeURL " | isErrorpage="true" | extends=" class_name " value = a string literal in single or double quotes. include Inserts text into a JSP page. <%@ include file = "path" ... %> taglib Defines a custom tag library used by a JSP page. <%@ taglib uri=" tagLibraryURI " prefix=" tagPrefix " %> After the taglib directive, reference the custom tags using the syntax: <tagPrefix : tagName > ... </ tagPrefix : tagName > declaration Creates page-wide definitions such as variables. <%! declaration %> Example: <%! private String foo = null; public String getFoo() {return this.foo;} %> Directives Scripting Elements Apêndice B - JSP Quick Reference:
  • 305. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 305 scriptlet Contains a block of scripting code. A JSP page can contain multiple blocks of scripting code. <% script code %> Example: <% String greeting = request.getParameter("Greeting"); out.println(greeting); %> expression Defines statements evaluated on the server before sending the page output to the client. <%= expression %> Example: <%= myVar1%> jsp:include Call one JSP page from another. Upon completion, the destination page returns control to the calling page. <jsp:include page=" path " flush="true"/> <jsp:include page=" path " flush="true"> <jsp:param name=" paramName" value=" paramValue " /> ... </jsp:include> jsp:forward Calls one JSP page from another. Execution of the calling page is terminated by the call. <jsp:forward page=" path " /> <jsp:forward page=" path "> <jsp:param name=" paramName" value=" paramValue " /> ... </jsp:forward> Actions jsp:plugin Enables you to invoke an applet on a client browser. <jsp:plugin type="bean|applet" code=" objectCode " codebase=" objectCodebase " { align=" alignment " } { archive=" archiveList " } { height=" height " } { hspace=" hspace " } { jreversion=" jreversion " } { name=" componentName " } { vspace=" vspace " } { width=" width " } { nspluginurl=" url " } { iepluginurl=" url " } > { <jsp:params> { <jsp:param name=" paramName" value=" paramValue " /> }+ </jsp:params> } { <jsp:fallback> arbitrary_text </jsp:fallback> } > </jsp:plugin> The elements in brackets ({} ) are optional. jsp:useBean Defines an instance of a Java bean. <jsp:useBean id=" name" scope="page|request|session|application" typeSpec /> <jsp:useBean id=" name" scope="page|request|session|application" typeSpec > body </jsp:useBean> typespecis any one of the following: class=" className " | class=" className " type=" typeName " | beanName=" beanName" type=" typeName " | type=" typeName " Apêndice B - JSP Quick Reference:
  • 306. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 306 jsp:setProperty Sets the value of one or more properties in a bean. <jsp:setProperty name=" beanName" prop_expr /> prop_expr has one of the following forms: property="*" | property=" propertyName "| property =" propertyName " param =" parameterName "| property =" propertyName " value =" propertyValue " jsp:getProperty Writes the value of a bean property as a string to the out object. <jsp:getProperty name=" name" property=" propertyName " /> See the corresponding Java object type for the available methods for these objects. application The servlet context obtained from the servlet configuration object. Java type: javax.servlet.ServletContext config The ServletConfig object for the JSP page. Java type:javax.servlet.ServletConfig exception The uncaught exception that resulted in the error page being invoked. Java type: java.lang.Throwable out An object that writes into a JSP page’s output stream. Java type: javax.servlet.jsp.JspWriter JSP Objects pageContext The page context for the JSP. Java type:javax.servlet.jsp.PageContext request The client request. Java type:javax.servlet.HttpServletRequest response The response to the client. Java type:javax.servlet.HttpServletResponse session The session object created for the requesting client. Java type:javax.servlet.http.HttpSession Apêndice B - JSP Quick Reference:
  • 307. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 307 Compactação, Agrupamento e Distribuição Sintaxe: jar opções [meta-arq] nome-arquivo-destino [nome-arquivo-entrada] Argumento Descrição meta-arquivo Arquivo que contém as informações sobre o arquivo destino gerado. Este argumento é opcional, entretanto um arquivo meta-arquivo é gerado, default, META-INF/MANIFEST.INF arquivo-destino Nome do arquivo jar. A extensão .jar não é automatica, deve ser especificada arquivo-entrada Nome dos arquivos a serem agrupados e/ou compactados Opções Descrição c Cria um novo arquivo t Mostra o conteúdo de um arquivo existente x Extrai todos os arquivos x <arquivo> Extrai o arquivo especificado f Indica que a operação (c,t ou x) será executada sobre o arquivo e não sobre a entrada/saída padrão. v Mostra o status da operação (verbose) m Suprime a geração do meta-arquivo o Faz apenas o agrupamento, sem compactação. Deve ser utilizado para arquivos jar na variável de ambiente Classpath Exemplos: jar cvf Classes.jar ClassA.class ClassB.class ClassC.class Para ver o conteúdo do arquivo jar, gerado: jar tvf Classes.jar Para extrair arquivo: Jar xvf Classes.jar Obs: a opção f é sempre utilizada em operações com arquivos. Jar (Java Archive Tool) É uma ferramenta que faz agrupamento de arquivos transformando em único arquivo, um arquivo .jar, geralmente com compressão. Localização JDK1.X/BIN/Jar. Os arquivos Jar podem conter uma aplicação inteira, por isso, ele é usado para fazer distribuição de aplicações. Também é bastante usado com componente Javabeans e Applet. Jar FileApêndice C
  • 308. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 308 Compactação, Agrupamento e Distribuição Estrutura de um arquivo Jar: Especificação JAR define a existência de uma arquivo conhecido como “manifest.mf” em um diretório chamado “META-INF”. Este diretório pode ainda conter outros arquivos de controle como o índice index.lst que deve agilizar a busca dos arquivos, a assinatura do arquivo e alguns outros. O papel do arquivo manifest é conter informações sobre a local, configuração e segurança do arquivo Jar. Conteúdo do arquivo Manifest: Exemplo: Versão, Classe que contém o método main,informações sobre segurança (assinatura), class path e etc. Exemplo de arquivo Manifest.MF: Local:META-INF Manifest-Version: 1.0 Created-By: 1.2 (Sun Microsystems Inc.) Sealed: true Jar FileApêndice C
  • 309. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 309 Compactação, Agrupamento e Distribuição: Como criar um arquivo Jar ? Agenda aplicacao *.class 1 - Para criar o arquivo agenda.jar, devemos ir para a pasta ..agendaaplicacao 2 - Criar o arquivo Manifest, devemos chamá-lo de manifest.inf. E escrever seu conteúdo: Manifest-Version: 1.0 Created-By: 1.4.2 (Sun Microsystems Inc.) Main-Class: MenuPrincipal Name: MenuPrincipal.class icones *.gif Nome do arquivo que contém o método “main” Jar FileApêndice C
  • 310. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 310 Compactação, Agrupamento e Distribuição: Como criar um arquivo Jar ? Agenda aplicacao *.class icones *.gif 3 - Para criar o arquivo agenda.jar, devemos digitar a seguinte linha de comando: jar cfm agenda.jar MANIFEST.INF . opções Nome do arquivo jar Nome do arquivo manifest Pasta (onde estão os arquivos) Jar FileApêndice C
  • 311. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 311 Compactação, Agrupamento e Distribuição: Como criar um arquivo Jar ? Agenda aplicacao *.class icones *.gif 4 - Verifique o arquivo agenda.jar, para isto você pode usar WinZip ou qualquer outra ferramenta de compactação de arquivo ou até o mesmo a ferramenta Jar: jar tf agenda.jar agenda.jar 5- Para executar o aplicação basta dar duplo clique sob o arquivo, agenda.jar, ou chamá-lo através de linha de comando: Java jar- agenda.jar Jar FileApêndice C
  • 312. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 Gostou ? Venha participar da comunidade eTecnologia. Lá você poderá participar dos eventos, treinamentos e cursos. comunidade http://etecnologia.ning.com/ Para participar da comunidade basta se cadastrar: http://bit.ly/czZlez A missão da comunidade é compartilhar conhecimento, trocar experiências e prover aprendizado. 312
  • 313. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 313 Notas: Marcas Registradas: Todos os termos mencionados que são reconhecidos como Marca Registrada e/ou comercial são de responsabilidades de seus proprietários. O autor informa não estar associada a nenhum produto e/ou fornecedor que é apresentado neste material. No decorrer deste, imagens, nomes de produtos e fabricantes podem ter sido utilizados, e desde já o autor informa que o uso é apenas ilustrativo para fins educativo, não visando ao lucro, favorecimento ou desmerecimento da marca ou produto. Melhoria e Revisão: Este material esta em processo constante de revisão e melhoria, se você encontrou algum problema ou erro envie um e-mail para nós. Criticas e Sugestões: Nós estamos abertos para receber criticas e sugestões que possam melhorar o material, por favor envie um e-mail para nós. Rildo F dos Santos (rildo.santos@etecnologia.com.br) Imagens: Google, Flickr e Banco de Imagem.
  • 314. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 314 Licença:
  • 315. Versão: 3.0 CapacitaçãodeDesenvolvedorJava Java Web rildo.santos@etecnologia.com.br Todos os direitos reservados e protegidos © 2006 e 2010 Java Web Capacitação Desenvolver Java Web Application Rildo F Santos rildo.santos@etecnologia.com.br twitter: @rildosan skype: rildo.f.santos http://rildosan.blogspot.com/ (11) 9123-5358 (11) 9962-4260 www.etcnologia.com.br

×