Caelum - Java para desenvolvimento Web. Índice

Documentos relacionados
JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Caelum. Sobre a empresa. Sobre a apostila. "Mata o tempo e matarás a tua carreira" Bryan Forbes

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

Caelum. Sobre a empresa. Sobre a apostila. Mata o tempo e matas a tua carreira Bryan Forbes

JAVA COM BANCO DE DADOS PROFESSORA DANIELA PIRES

Manipulação de Banco de Dados com Java 1. Objetivos

Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia

Aula 1 Acesso a Banco de Dados

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Listando, gravando, alterando e excluindo registro do banco de dados com JSP

Java Beans e Servlets

SCE-557. Técnicas de Programação para WEB. Rodrigo Fernandes de Mello

Drive MySql de conexão para Eclipse

Acesso a Bancos de Dados em Java (JDBC)

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

DWR DIRECTED WEB REMOTING

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

Caelum. Sobre a empresa. Mata o tempo e matas a tua carreira Bryan Forbes

Exercícios de Revisão Java Básico

Acesso a banco de dados

JDBC Java Database Connectivity

Programação Orientada a Objetos JDBC Java Database Connectivity

Implementando uma Classe e Criando Objetos a partir dela

Programação com Acesso a Banco de Dados

Relatório referente a compreensão da programação JSP. Realizado do dia de 22 abril de 2010 a 03 de maio de 2010.

Acessando um Banco de Dados

Banco de Dados. Banco de Dados. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Leonardo Gresta Paulino Murta

Integrando Java com Banco de Dados

J550 Integração com Bancos de Dados

Persistência de Classes em Tabelas de Banco de Dados

Persistindo dados com TopLink no NetBeans

Olho por olho, e o mundo acabará cego. Mohandas Gandhi

Programação Web. Professor: Diego Oliveira. Conteúdo 02: JSP e Servlets

JDBC. Prof. Márcio Bueno

Unidade 8: Padrão MVC e DAO Prof. Daniel Caetano

TUTORIAL DE INTRODUÇÃO AO CEWOLF

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha

MANUAL DA SECRETARIA

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

INTRODUÇÃO À TECNOLOGIA SERVLETS

Módulo 5 - JDBC java.sql - Conexão com Banco de Dados

Equipe OC- Olimpíadas Científicas

Manual do Instar Mail v2.0

Tecnologia WEB II. Prof. Erwin Alexander Uhlmann. Introdução ao PHP. UHLMANN, Erwin Alexander. Introdução ao PHP. Instituto Siegen. Guarulhos, 2012.

Funcionamento da Aplicação. Simulações do funcionamento. Simulação SAC

Prática Sobre Servlets e JSP

Sensor de temperatura Parte 5 Cleiton Bueno Preparando o ambiente do Banco de dados Mysql

Autenticação e Autorização

Java na Web. Aplicações Web

JDBC. Java DataBase Connectivity

Aula 03 - Projeto Java Web

UNIVERSIDADE FEDERAL DO AMAPÁ PRÓ REITORIA DE ADMINISTRAÇÃO E PLANEJAMENTO DEPARTAMENTO DE INFORMÁTICA. Manual do Moodle- Sala virtual

UNICE Ensino Superior Linguagem de Programação Ambiente Cliente Servidor.

Java na WEB Banco de Dados

Orientação a Objetos

Exercícios de fixação: Listas

Programação Orientada a Objetos (DPADF 0063)

Desenvolvendo Websites com PHP

1) Ao ser executado o código abaixo, em PHP, qual será o resultado impresso em tela?

Figura 1. A Classe Java

Introdução a JavaServer Pages. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Desenvolvimento de sistemas web

2 echo "PHP e outros.";

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

Perguntas. Que todo usuário deveria fazer antes de comprar um software CAD de baixo custo. Por Robert Green, proprietário da Robert Green Consulting

Fernando Freitas Costa. Pós-Graduando em Gestão e Docência Universitária. blog.fimes.edu.br/fernando nando@fimes.edu.br

DESENVOLVIMENTODE APLICAÇÕESPARAINTERNET:PHP. VitorFariasCoreia

Projeto ECA na Escola - Plataforma de Educação à Distância

Java e Conexão com Banco de Dados

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

Lazarus pelo SVN Linux/Windows

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M

Manual do Teclado de Satisfação Online WebOpinião

LINGUAGEM ORIENTADA A OBJETOS

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

Desenvolvendo Aplicações Web com NetBeans

Bancos de Dados: impossível viver sem eles...

JDBC Acessando Banco de Dados

Persistência de Objetos no SGBD PostgreSQL, Utilizando as APIs: JDBC, JDK, Swing e Design Patteners DAO.

(UFF) JDBC (I) TEPIS II

COMO COMEÇAR 2016 se organizando?

O guia completo para uma presença. online IMBATÍVEL!

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em

Curso Online A Escola no Combate ao Trabalho Infantil Plataforma de Educação à Distância

Vejamos um exemplo. Vamos supor que queiramos montar uma tabela 3X2, ou seja de 3 colunas por 2 linhas, o código HTML para isso é :

* Técnicas Avançadas. Desenvolvimento de SOFTWARES. Sistemas de Gerenciamento de Conteúdo com Joomla e Magento

JPA: Persistência padronizada em Java

Desenvolvimento Web com Struts

Programação para Internet II

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Android e Bancos de Dados

Prova Específica Cargo Desenvolvimento

O QUE É A CENTRAL DE JOGOS?

JAVA JDBC COMO FUNCIONA. Programação Orientada a Objetos Flávio de Oliveira Silva 315. Programação Orientada a Objetos Flávio de Oliveira Silva 316

MANUAL DO ANIMAIL Terti Software

Transcrição:

Caelum - Java para desenvolvimento Web Índice Capítulo 1: Como aprender Java...1 1.1 - Falando em Java...1 1.2 - O que é realmente importante?...1 1.3 - Sobre os exercícios...2 1.4 - Tirando dúvidas...2 1.5 - Sobre o curso...2 1.6 - Sobre os autores...2 Capítulo 2: O que é J2EE?...3 2.1 - As especificações...3 2.2 - Referência de Implementação...3 Capítulo 3: Design Patterns...5 3.1 - Soluções para viagem...5 3.2 - Singleton...5 3.3 - Exercícios...6 3.4 - Um pouco mais...7 Capítulo 4: JDBC java.sql...8 4.1 - O banco...8 4.2 - A tabela de exemplo...8 4.3 - Javabeans...9 4.4 - A conexão em Java...10 4.5 - Factory...12 4.6 - Factory facilitando o acesso ao banco...12 4.7 - Exercícios...13 4.8 - Inserindo dados...13 4.9 - DAO Data Access Object...14 4.10 - Pesquisando...16 4.11 - Exercícios...17 4.12 - Um pouco mais...18 4.13 - Exercícios...18 4.14 - Desafios...18 4.15 - Fixando o conhecimento...18 Capítulo 5: Servlet Contêiner...21 5.1 - Introdução...21 5.2 - Servlet Contêiner...21 5.3 - Tipos de contêiner...22 5.4 - Instalando o tomcat...22 5.5 - Iniciando o tomcat...22 5.6 - Parando o tomcat...22 Capítulo 6: JSP e JSTL Java Server Pages...24 6.1 - JSP...24 6.2 - Configurando o Tomcat...25 6.3 - O que é uma página JSP...25 6.4 - Exercício...27 6.5 - Listando os contatos...27 6.6 - HTML e Java: eu não quero código Java no meu jsp!...27 6.7 - JSTL...28 6.8 - As empresas hoje em dia...28 6.9 - Instalação...28 i

Caelum - Java para desenvolvimento Web 6.10 - Cabeçalho para a jstl core...28 6.11 - For...28 6.12 - Exercícios...29 6.13 - Import: trabalhando com cabeçalhos e rodapés...30 6.14 - Exercícios...30 6.15 - Desafios...31 Capítulo 7: Servlets...32 7.1 - Servlet...32 7.2 - A estrutura de diretórios...34 7.3 - Mapeando uma servlet no web.xml...34 7.4 - Exercícios...34 7.5 - web.xml Mais informações...35 7.6 - OutputStream x PrintWriter...35 7.7 - doget, dopost e outros...35 7.8 - Parâmetros...36 7.9 - Exercícos...37 7.10 - HTML e Java: eu não quero código Html na minha servlet!...37 Capítulo 8: Introdução ao Apache Ant e ao arquivo WAR...40 8.1 - Build...40 8.2 - Integração com IDEs...41 8.3 - Build.xml básico...41 8.4 - Um arquivo build.xml de verdade...42 8.5 - Criando os diretórios...43 8.6 - Compilando...43 8.7 - Web archive (.war)...43 8.8 - Tomcat Manager...44 8.9 - Um pouco mais...44 8.10 - Exercícios...44 Capítulo 9: Controle de erro...46 9.1 - Exceptions...46 9.2 - Página de erro...46 9.3 - Quando acontece um erro em uma página jsp...47 9.4 - Exercícios...47 9.5 - Quando acontece um erro em uma servlet...48 9.6 - Exercícios...48 Capítulo 10: Model View Controller...51 10.1 - Servlet ou JSP?...51 10.2 - Melhorando o processo...51 10.3 - Model View Controller...53 10.4 - Request e dispatchers...54 Capítulo 11: Construindo um Framework MVC...55 11.1 - Nossa interface...55 11.2 - Criando um controlador e um pouco mais de reflection...55 11.3 - Configurando o web.xml...57 11.4 - Executando o TestaSYP...57 11.5 - Melhorando o SYP...57 Capítulo 12: Jakarta Struts...60 12.1 - Struts...60 12.2 - Configurando o Struts...60 ii

Caelum - Java para desenvolvimento Web 12.3 - Uma ação Struts...61 12.4 - Configurando a ação no struts-config.xml...62 12.5 - Preparando um sistema de login...63 12.6 - Passo 1: Formbean...64 12.7 - Passo 2: A página de login...65 12.8 - O arquivo formulario.jsp...65 12.9 - Exercício...66 12.10 - A ação...66 12.11 - A ação no struts-config.xml...66 12.12 - ok.jsp e erro.jsp...67 12.13 - Testando...68 12.14 - Cookies...68 12.15 - Sessão...69 12.16 - Configurando o tempo limite...69 12.17 - Registrando o usuário logado na sessão...69 12.18 - Exercícios...70 Capítulo 13: Inversão de Controle...72 13.1 - IoC - Eu não quero mais importar o que eu não conheço...72 13.2 - Vantagens...73 13.3 - VRaptor...73 13.4 - Instalando e configurando o VRaptor...73 13.5 - Minha primeira lógica de negócios...74 13.6 - E o jsp com o formulário?...75 13.7 - E a página final?...75 13.8 - Como configurar tudo isso?...75 13.9 - Chain? Cadeia?...75 13.10 - Exercícios...76 13.11 - Um pouco mais...76 Capítulo 14: Hibernate 3...77 14.1 - Vantagens...77 14.2 - Criando seu projeto...77 14.3 - Modelo...78 14.4 - Configurando...78 14.5 - Configurando a classe/tabela Produto...78 14.6 - Criando as tabelas...79 14.7 - Propriedades do banco...79 14.8 - Sessões...79 14.9 - Salvando novos objetos...80 14.10 - Buscando pelo id...80 14.11 - Exercícios...80 14.12 - Buscando com uma cláusula where...81 14.13 - Atualizando...81 14.14 - Exercícios...81 Capítulo 15: E agora?...83 15.1 - Certificação...83 15.2 - Frameworks...83 15.3 - Revistas...83 15.4 - Falando em Java...83 Capítulo 16: Apêndice A - Jakarta Velocity...85 iii

Caelum - Java para desenvolvimento Web 16.1 - Velocity...85 16.2 - Vantagens...86 16.3 - Templates Velocity...86 16.4 - Instalando e configurando o Velocity e Velocity Tools...86 16.5 - Exercícios...87 16.6 - Seu primeiro template...87 16.7 - Exercícios...88 16.8 - Mesclando velocity e o struts...88 16.9 - Exercícios...88 16.10 - Objetos mais complexos...88 16.11 - Diretivas...89 16.12 - IF...89 16.13 - FOREACH...90 16.14 - PARSE...90 16.15 - Comentários...91 16.16 - Outras ferramentas...91 16.17 - ImportTool...91 16.18 - CookieTool...91 16.19 - Um pouco mais...92 Capítulo 17: Apêndice B - Criando taglibs avançadas...93 17.1 - O problema...93 17.2 - A solução...94 17.3 - Descrição das tags e bibliotecas...95 17.4 - Um pouco mais...96 17.5 - Exercícios...96 Capítulo 18: Apêndice C - Design Patterns...98 18.1 - Factory exemplo de cache de objetos...98 Capítulo 19: Apêndice D - Servlets...102 19.1 - Configuração de uma servlet...102 19.2 - Exercícios...103 19.3 - Aplicação...103 iv

capítulo 1 1Como aprender Java Homens sábios fazem provérbios, tolos os repetem Samuel Palmer - Como o material está organizado e dicas de como estudar em casa. 1.1 - Falando em Java Esta é a apostila da Caelum que tem como intuito ensinar Java de uma maneira elegante, mostrando apenas o que é necessário no momento correto e poupando o leitor de assuntos que não costumam ser de seu interesse em determinadas fases do aprendizado. O material aqui contido pode ser publicamente distribuído desde que não seja alterado e seus créditos sejam mantidos. Ele não pode ser usado para ministrar qualquer curso. Caso você esteja interessado em usá-lo para este fim, entre em contato através do email contato@caelum.com.br. 1.2 - O que é realmente importante? Muitos livros, ao passar os capítulos, mencionam todos os detalhes da linguagem juntamente com os princípios básicos dela. Isso acaba criando muita confusão, em especial pois o estudante não consegue distinguir exatamente o que é importante aprender e reter naquele momento daquilo que será necessário mais tempo e. Principalmente, experiência para dominar. Se uma classe abstrata deve ou não ter ao menos um método abstrato, se o if só aceitar argumentos booleanos e todos os detalhes de classes internas realmente não devem ser preocupações para aquele que possui como objetivo primário aprender Java. Esse tipo de informação será adquirida com o tempo e não é necessária até um segundo momento. Neste curso separamos essas informações em quadros especiais, já que são informações extras. Ou então apenas citamos num exercício e deixamos para o leitor procurar informações se for de seu interesse. Algumas informações não são mostradas e podem ser adquiridas em tutoriais ou guias de referência, normalmente são detalhes que para um programador experiente em Java é algo importante. Por fim falta mencionar sobre a prática, que deve ser tratada seriamente: todos os exercícios são muito importantes e os desafios podem ser feitos quando o curso acabar. De qualquer maneira recomendamos aos alunos estudar em casa, principalmente aqueles que fazem os cursos intensivos. O curso Para aqueles que estão fazendo o curso Java para desenvolvimento Web, é Capítulo 1 - Como aprender Java - Página 1

recomendado estudar em casa aquilo que foi visto durante a aula, tentando resolver os exercícios que não foram feitos e os desafios que estão lá para envolver mais o leitor no mundo de Java. 1.3 - Sobre os exercícios Os exercícios do curso variam entre práticos até pesquisas na Internet, ou mesmo consultas sobre assuntos avançados em determinados tópicos para incitar a curiosidade do aprendiz na tecnologia. Existem também, em determinados capítulos, uma série de desafios. Eles focam mais no problema computacional que na linguagem, porém são uma excelente forma de treinar a sintaxe e principalmente familiarizar o aluno com a biblioteca padrão Java, além de o aluno ganhar velocidade de raciocínio. 1.4 - Tirando dúvidas Para tirar dúvidas dos exercícios, ou de Java em geral, recomendamos o fórum do site do GUJ (www.guj.com.br), onde sua dúvida será respondida prontamente. Se você já participa de um grupo de usuários java ou alguma lista de discussão, pode tirar suas dúvidas nos dois lugares. Fora isso, sinta-se a vontade de entrar em contato conosco para tirar todas as suas dúvidas durante o curso. 1.5 - Sobre o curso A Caelum (http://www.caelum.com.br) oferece os cursos e a apostila "Falando em Java", que aborda o ensino dessa linguagem e tecnologia de forma mais simples e prática do que em outros cursos, poupando o aluno de assuntos que não são de seu interesse em determinadas fases do seu aprendizado. As apostilas "Falando em Java" estão parcialmente disponíveis no site http://www.caelum.com.br/fj.jsp. Se você possui alguma colaboração, como correção de erros, sugestões, novos exercícios e outros, entre em contato conosco! 1.6 - Sobre os autores Guilherme Silveira (guilherme.silveira@caelum.com.br) é programador e web developer certificado pela Sun, trabalhando com Java desde 2000 como especialista e instrutor. Programou e arquiteturou projetos na Alemanha. Cofundador do GUJ, escreve para a revista Mundo Java, estuda Matemática Aplicada na USP e é instrutor na Caelum. Paulo Silveira (paulo.silveira@caelum.com.br) é programador e desenvolvedor certificado Java. Possui grande experiência com servlets, que utilizou na Alemanha, e vários outros projetos Java, onde trabalhou como consultor sênior. Foi instrutor Java pela Sun, cofundador do GUJ e criador do framework vraptor. É formado em ciência da computação pela USP, onde realiza seu mestrado. Sérgio Lopes (sergio@caelum.com.br) é programador e desenvolvedor Java desde 2002. É moderador do Grupo de Usuários Java GUJ - e estuda Ciência da Computação na USP. Capítulo 1 - Como aprender Java - Página 2

capítulo 2 2O que é J2EE? Ensinar é aprender duas vezes. Joseph Joubert - Java 2 Enterprise Edition 2.1 - As especificações J2EE O J2EE não passa de uma série de especificações bem detalhadas, dando uma receita de como deve ser implementado um software que faz um determinado serviço. Estaremos vendo no curso os vários serviços que um software deve implementar para seguir as especificações do J2EE. Estaremos vendo também conceitos muito importantes, para depois estar firmando jargões como servidor de aplicação e containers. Esses serviços variam desde envio de emails, até complexos serviços de transação. Porque a Sun faz isso? A idéia é que você possa criar uma aplicação que utilize esses serviços. Como esses serviços são bem complicados, você não perderá tempo implementando essa parte do sistema, porém terá de comprar de alguém (existem implementações gratuitas de excelente qualidade). E em algum dia, você pode decidir querer trocar essa implementação atual por uma que é mais rápida em determinados pontos (e conseqüentemente mais cara). Você continua utilizando a mesma interface, isto é, como você chama aquelas funcionalidades do J2EE. O que muda é a implementação da especificação, você tem essa liberdade, não está preso a um código e a especificação garante que sua aplicação funcionará com a implementação de outra empresa. Onde encontrar as especificações. O grupo responsável por gerir as especificações usa o site do Java Community Process: http://www.jcp.org/ Lá você pode encontrar tudo sobre as Java Specification Requests, isto é, os novos pedidos de bibliotecas e especificações para o Java, tanto para J2SE, quanto EE e outros. Sobre o J2EE, você pode encontrar em: http://java.sun.com/j2ee/ 2.2 - Referência de Implementação Existe um grande download do J2EE na página da Sun. Se J2EE é uma Capítulo 2 - O que é J2EE? - Página 3

especificação, o que preciso pegar? Nesse download você terá a documentação, um monte de jars onde ficam as interfaces que são implementadas pelas empresas (vendors), ferramentas e outros. Repare que aqui não vem a Virtual Machine, compilador e o conteúdo do J2SE. J2EE precisa do J2SE se você quiser desenvolver. REFERÊNCIA DE O que realmente ocupa muito espaço é a RI - Reference Implementation IMPLEMENTAÇÃO (Referência de implementação, ou J2EE RI). Como as especificações do J2EE não são muito simples, e a Sun precisa testá-las para ver se tudo de necessário se encontra por lá, a própria Sun desenvolve uma implementação que vem junto com o J2EE, apenas para testes dos usuários. Você pode estar usando a RI no seu ambiente de trabalho, mas vale a pena lembrar que ela não é rápida, e nem tem facilidades de uso na hora da instalação, criação de uma nova aplicação e outros. Outra utilidade da RI é para que as empresas que desejam vender seu próprio produto, possam estar tirando dúvidas de casos em que a especificação não tenha sido muito clara, testando esse caso na RI. Baixando a J2EE http://java.sun.com/j2ee/1.4/download-dr.html A última versão é a 1.4. Cuidado ao fazer o download pois existe uma versão que também vem todo o J2SE. Capítulo 2 - O que é J2EE? - Página 4

capítulo 3 3Design Patterns Nunca chegamos aos pensamentos. São eles que vêm. Martin Heidegger - Neste capítulo, você irá aprender a: solucionar o problema de controle de acesso ao construtor de objetos; criar instâncias únicas de objetos em um programa; resolver alguns problemas clássicos de orientação a objetos. 3.1 - Soluções para viagem Orientação à objetos resolve as grandes dores de cabeças que tínhamos na programação procedural, restringindo e centralizando responsabilidades. Mas algumas coisas não podemos simplesmente resolver com orientação à objetos pois não existe palavra chave para uma funcionalidade tão específica. DESIGN PATTERNS Alguns desses pequenos problemas aparecem com tamanha freqüência que as pessoas desenvolvem uma solução padrão para o mesmo. Com isso, ao nos defrontarmos com um desses problemas clássicos, podemos rapidamente implementar essa solução genérica com uma ou outra modificação. Essa solução padrão tem o nome de Design Pattern (padrão de projeto). A melhor maneira para aprender o que é um Design Pattern é vendo um. No decorrer dos outros capítulos sempre estaremos vendo outros Design Patterns. A bíblia O livro mais conhecido de Design Patterns foi escrito em 1995 e tem trechos de código em C++ e Smalltalk. Mas o que realmente importa são os conceitos e os diagramas que fazem desse livro independente de qualquer linguagem. Além de tudo, o livro é de leitura agradável. Design Patterns, Erich Gamma et al. 3.2 - Singleton SINGLETON Em alguns casos, desejamos que determinada classe só possa ser instanciada uma vez. Isto é, só queremos um objeto daquela classe e que a referência para ao mesmo seja compartilhada por diversos outros objetos. Isto é muito comum quando a classe representa uma entidade única no sistema, como o presidente de uma empresa, o gerenciador de logs da aplicação ou o controlador de usuários. Como faremos? Com certeza aproveitaremos o truque anterior, deixando o construtor privado e criando um método estático para retornar a referência. Mas o que fazer para retornar sempre uma referência para a mesma instância? Capítulo 3 - Design Patterns - Página 5

public Presidente getpresidente() { return referenciaunica; } Quem é essa referenciaunica? Um atributo estático, como era o nosso mapa de páginas no cache. 1. public class Presidente { 2. private static Presidente referenciaunica = Presidente ); 3. private String nome; 4. 5. private Presidente(String nome) { 6. this.nome = nome; 7. } 8. 9. public static Presidente getpresidente() { 10. return Presidente.referenciaUnica; 11. } 12. } new Presidente( Nome do E, quando alguém quiser uma referência para o presidente: Presidente presidente = Presidente.getPresidente(); E poderia até ser que o método getpresidente não retornasse sempre uma referência para mesma instância, depende do que você quer que sua aplicação faça. Se um dia quisermos deixar que mais de um Presidente exista na nossa aplicação, podemos deixar o construtor público ou, melhor ainda, criar um método de Factory que receba o nome do Presidente como argumento. Classes com tudo estático Uma outra alternativa seria criar uma classe cheia de métodos e atributos estáticos, tais como a System e a Math. Apesar de funcionar, essa solução não é orientada à objetos. Se você precisar passar um System como argumento, como poderia fazer isso? Uma classe só com métodos estáticos tem a característica de uma pequena biblioteca de funções. 3.3 - Exercícios 1-) Dado o sistema a seguir, aplique o pattern Singleton. A classe Logger usa a variável membro ativo para realmente imprimir informações, enquanto que a classe Aplicacao é o nosso programa e utiliza dois objetos de tipo Logger. 1. public class Logger { 2. 3. /* por default não imprime o log */ 4. private boolean ativo = false; 5. 6. public Logger() { 7. } 8. 9. public boolean isativo() { 10. return this.ativo; 11. } 12. 13. public void setativo(boolean b) { Capítulo 3 - Design Patterns - Página 6

14. this.ativo = b; 15. } 16. 17. public void log(string s) { 18. if(this.ativo) { 19. System.out.println("LOG :: " + s); 20. } 21. } 22. } Agora a classe Aplicacao, em outro arquivo: 1. public class Aplicacao { 2. 3. public static void main(string[] args) { 4. 5. Logger log1 = new Logger(); 6. log1.setativo(true); 7. log1.log("primeira MENSAGEM DE LOG"); 8. 9. Logger log2 = new Logger(); 10. log2.log("segunda MENSAGEM DE LOG"); 11. 12. } 13. } Resultado da aplicação antes de aplicar o pattern: PRIMEIRA MENSAGEM DE LOG Ao aplicar o pattern, a classe aplicação deverá utilizar o mesmo objeto do tipo Logger nas duas chamadas ao método log, portanto o resultado da aplicação será: PRIMEIRA MENSAGEM DE LOG SEGUNDA MENSAGEM DE LOG Passo 1: Torne o construtor de Logger privado Passo 2: Crie uma váriavel estática logger para conter uma referência única ao objeto de Logger; instancie a variável na declaração Passo 3: Crie um método estático getlogger que devolve a referência para o logger Passo 4: Na classe Aplicacao, substitua o new Logger() pelo uso do método estático getlogger criado no passo 3. 3.4 - Um pouco mais... 1-) Pesquise sobre outros Patterns. Strategy, Facade, Proxy e Decorator são alguns interessantes. 2-) Como um Design Pattern deve ser aplicado? Em que momento? Antes, durante ou depois da implementação? Capítulo 3 - Design Patterns - Página 7

capítulo 4 4JDBC java.sql O medo é o pai da moralidade Friedrich Wilhelm Nietzsche - Ao término desse capítulo, você será capaz de: conectar-se a um banco de dados qualquer através da api java.sql; criar uma fábrica de conexões usando o design pattern Factory; pesquisar dados através de queries; executar comandos no banco de dados; DAO Data Access Object. 4.1 - O banco BANCO DE DADOS O banco de dados é onde guardamos os dados que pertencem ao nosso sistema. A maioria dos banco de dados comerciais hoje em dia são relacionais e derivam de uma estrutura diferente daquela orientada a objetos. mysql -u root O MYSQL é o banco de dados que usamos para nossos exemplos, portanto iremos utilizar o seguinte comando no seu terminal para acessar o mesmo: Banco de dados Para aqueles que não conhecem um banco de dados, é recomendado ler mais sobre o mesmo e SQL para começar a usar a api JDBC. PERSISTÊNCIA O processo de armazenagem e captura de dados em um banco é chamado de persistência. A biblioteca padrão de persistência em banco de dados em Java é a JDBC mas já existem diversos projetos do tipo ORM (Object Relational Mapping) que solucionam muitos problemas que a estrutura da api do JDBC (e ODBC) gerou. 4.2 - A tabela de exemplo Para criar uma tabela nova, devemos rodar o comando mysql para entrar no mesmo. Agora nos preparamos para usar o banco de dados teste: use teste; A seguinte tabela será usada nos exemplos desse capítulo: create table contatos ( id BIGINT NOT NULL AUTO_INCREMENT, nome VARCHAR(255), email VARCHAR(255), endereco VARCHAR(255), primary key (id) ); No banco de dados relacional, é comum representar um contato (entidade) em Capítulo 4 - JDBC java.sql - Página 8

4.3 - Javabeans uma tabela de contatos, portanto o nome da tabela fica no plural. O que são Javabeans? A pergunta que não quer se calar pode ser respondida muito facilmente uma vez que a maior confusão feita aí fora é entre Javabeans e Enterprise Java Beans (EJB). JAVABEANS Javabeans são classes que possuem o construtor sem argumentos e métodos de acesso do tipo get e set! Mais nada! Simples não? Já os EJBs são java beans com características mais avançadas e são o assunto principal do curso FJ-31. Podemos usar beans por diversos motivos, normalmente as classes de modelo da nossa aplicação costumam ser java beans. Agora iremos utilizar: uma classe com métodos do tipo get e set para cada um de seus parâmetros, que representa algum objeto uma classe com construtor sem argumentos que representa uma coleção de objetos A seguir, você vê um exemplo de uma classe javabean que seria equivalente ao nosso modelo de entidade do banco de dados: 1. package br.com.caelum.jdbc.modelo; 2. 3. public class Contato { 4. 5. private Long id; 6. private String nome; 7. private String email; 8. private String endereco; 9. 10. // métodos get e set para id, nome, email e endereço 11. 12. public String getnome() { 13. return this.nome; 14. } 15. public void setnome(string novo) { 16. this.nome = novo; 17. } 18. 19. public String getemail() { 20. return this.email; 21. } 22. public void setemail(string novo) { 23. this.email = novo; 24. } 25. 26. public String getendereco() { 27. return this.endereco; 28. } 29. public void setendereco(string novo) { 30. this.endereco = novo; 31. } 32. 33. public Long getid() { 34. return this.id; 35. } 36. public void setid(long novo) { Capítulo 4 - JDBC java.sql - Página 9

37. this.id = novo; 38. } 39. } A tecnologia javabeans é muito grande e mais informações sobre essa vasta área que é a base dos componentes escritos em java pode ser encontrada em: http://java.sun.com/products/javabeans EJB Se você quer saber mais sobre Enterprise Java Beans (EJB), a Caelum oferece o curso FJ-31. 4.4 - A conexão em Java O sistema desenvolvido em Java abstrai o método através do qual é possível fazer uma conexão pois as conexões são feitas através de uma ponte que implementa todas as funcionalidades que um Cliente banco de dados padrão deve nos fornecer. Por exemplo, toda conexão deve permitir executar código de atualizacão, pesquisa, etc. Essa implenetação precisa ser escolhida. Essa escolha não é feita programaticamente e sim basta usar uma ponte. Veja no esquema ao lado a ponte (implementação) entre o programa (cliente) e o banco de dados. Interface JDBC Implementação JDBC. Qual? BD DRIVERMANAGER O serviço de encontrar uma ponte, ou seja, um driver certo é delegado para um controlador de drivers. Nada mais normal que ele se chame DriverManager. Através dele, é possível chamar um método getconnection com uma url que indica qual o banco que desejo abrir. O padrão da url para o driver do mysql que iremos utilizar é: jdbc:mysql://ip/banco DriverManager.getConnection("jdbc:mysql://localhost/teste"); Cliente Devemos substituir ip pelo ip da máquina e banco pelo nome do banco a ser utilizado. Seguindo o exemplo da linha acima e tudo que foi dito até agora, é possível rodar o exemplo abaixo e receber uma conexão para um banco mysql na própria máquina... 1. package br.com.caelum.jdbc; 2. 3. import java.sql.connection; 4. import java.sql.drivermanager; 5. import java.sql.sqlexception; 6. 7. public class JDBCExemplo { Interface JDBC Implementação JDBC. MySQL MySQL DriverManager procura por algum de seus Drivers que aceite essa URL como parâmetro. Capítulo 4 - JDBC java.sql - Página 10

8. 9. public static void main(string[] args) { 10. 11. try { 12. Connection con = DriverManager.getConnection("jdbc:mysql://localhost/teste"); 13. System.out.println("Conectado!"); 14. con.close(); 15. } catch (SQLException e) { 16. e.printstacktrace(); 17. } 18. } 19. } Mas ao testar o código acima, nada funciona. A conexão não pode ser aberta. Por que? O sistema ainda não consegue descobrir qual implementação do JDBC deve ser usado para a URL mencionada. O primeiro passo é adicionar a implementação ao classpath: o arquivo jar contendo a implementação do mysql (mysql connector) precisa ser colocado em um lugar visível ou adicionado à variável de ambiente classpath. Avisando o DriverManager sobre a existência de um Driver para o MySQL Class.forName("com.mysql.jdbc.Driver"); DriverManager Drivers conhecidos SQLServer Oracle MySQL Ainda falta registrar o driver do mysql no sistema. Para isso basta carregar ele através do método Class.forName(). Esse método abre uma classe que se registra com o DriverManager.getConnection(). 1. package br.com.caelum.jdbc; 2. 3. import java.sql.connection; 4. import java.sql.drivermanager; 5. import java.sql.sqlexception; 6. 7. public class JDBCExemplo { 8. 9. public static void main(string[] args) { 10. 11. try { 12. Class.forName("com.mysql.jdbc.Driver"); 13. Connection con = DriverManager.getConnection("jdbc:mysql://localhost/teste", root, ); 14. System.out.println("Conectado!"); 15. con.close(); 16. } catch (ClassNotFoundException e) { 17. e.printstacktrace(); 18. } catch (SQLException e) { 19. e.printstacktrace(); 20. } 21. } 22. } Alterando o banco de dados Teoricamente basta alterar as duas Strings que escrevemos para mudar de um banco para outro. Porém não é tudo tão simples assim, o código sql que veremos a seguir Capítulo 4 - JDBC java.sql - Página 11

pode funcionar em um banco mas não em outro. Depende de qual padrão sql o banco suporta. Isso só causa dor de cabeça e existem certos arcabouços que resolvem isso facilmente, como é o caso do Hibernate (www.hibernate.org) e do Prevayler. Lista de drivers Os drivers podem ser baixados normalmente no site do vendedor do banco de dados. Alguns casos, como no MSSQL, existem outros grupos que desenvolvem o driver em jtds.sourceforge.net Enquanto isso, você pode achar o driver do MYSQL (chamado de mysql connector) no site www.mysql.org. 4.5 - Factory Em determinado momento de nossa aplicação, gostaríamos de ter o controle sobre a construção dos objetos da nossa classe. Muita coisa pode ser feita através do construtor, como saber quantos objetos foram instanciados ou fazer o log sobre essas instanciações. As vezes também queremos controlar um processo muito repetitivo e trabalhoso, como abrir uma conexão com o banco de dados. 4.6 - Factory facilitando o acesso ao banco Tomemos como exemplo a classe a seguir que seria responsável por abrir uma conexão com o banco: 1. package br.com.caelum.jdbc; 2. 3. import java.sql.connection; 4. import java.sql.drivermanager; 5. import java.sql.sqlexception; 6. 7. public class ControladorDeConexoes { 8. 9. private final String URL = "jdbc:mysql://localhost/teste"; 10. private final String DRIVER = "com.mysql.jdbc.driver"; 11. private final String USUARIO = "root"; 12. private final String SENHA = ""; 13. 14. public Connection abreconexao() throws SQLException { 15. try { 16. Class.forName(DRIVER); 17. return DriverManager.getConnection(URL,USUARIO,SENHA); 18. } catch (ClassNotFoundException e) { 19. throw new SQLException(e.getMessage()); 20. } 21. } 22. } Poderíamos colocar um aviso na nossa aplicação, notificando todos os programadores a criarem um novo ControladorDeConexoes e atraves dele adquirir uma conexao: Connection con = new ControladorDeConexoes().abreConexao(); Podemos perceber que o método abreconexao é uma fábrica de conexões, isto é, ele fabrica conexões para mim, não importando de onde elas vieram. Portanto, Capítulo 4 - JDBC java.sql - Página 12

4.7 - Exercícios nada mais natural do que chamar a classe de ConnectionFactory e o método de getconnection. 1-) Crie uma classe chamada ConnectionFactory que fabrica conexões. a) crie-a no pacote br.com.caelum.jdbc b) coloque quatro variáveis estáticas finais String e seus respectivos valores: URL "jdbc:mysql://localhost/teste" DRIVER "com.mysql.jdbc.driver" USUARIO root SENHA c) crie o método estático getconnection que retorna uma nova conexão: public static Connection getconnection() throws SQLException { try { Class.forName(DRIVER); System.out.println( Conectando ao banco ); return DriverManager.getConnection(URL, USUARIO, SENHA); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } 2-) Crie uma classe chamada TestaConexao no pacote br.com.caelum.jdbc.teste a) coloque o método main b) fabrique uma conexão: Connection con = ConnectionFactory.getConnection(); c) feche a conexão con.close(); d) Trate os erros! 4.8 - Inserindo dados Para inserir dados em uma tabela de um banco de dados entidade-relacional basta usar a cláusula INSERT. Precisamos especificar quais os campos que desejamos atualizar e os valores. PREPARED STATEMENT As cláusulas são executadas em um banco de dados através da interface PreparedStatement. Para receber um PreparedStatement relativo à conexão, basta chamar o método preparestatement, passando como argumento o comando SQL com os valores vindos de variáveis preenchidos com uma interrogação. Logo em seguida, chamamos o método setstring do PreparedStatement para preencher os valores, passando a posição (começando em 1) da interrogação no SQL e o valor que deve ser colocado. Por fim, uma chamada à execute executa o comando SQL. 1. package br.com.caelum.jdbc; 2. 3. import java.sql.connection; 4. import java.sql.sqlexception; 5. import java.sql.preparedstatement; 6. 7. public class JDBCInsert { 8. 9. public static void main(string[] args) { 10. 11. try { 12. 13. // conectando 14. Connection con = ConnectionFactory.getConnection(); Capítulo 4 - JDBC java.sql - Página 13

15. System.out.println("Conectado!"); 16. 17. // cria um preparedstatement 18. PreparedStatement stmt = con.preparestatement("insert into contatos (nome,email,endereco) values (?,?,?)"); 19. 20. // preenche os valores 21. stmt.setstring(1, Caelum ); 22. stmt.setstring(2, contato@caelum.com.br ); 23. stmt.setstring(3, R. Vergueiro 3185 cj57 ); 24. 25. // executa 26. stmt.execute(); 27. stmt.close(); 28. 29. System.out.println("Gravado!"); 30. 31. con.close(); 32. 33. } catch (SQLException e) { 34. e.printstacktrace(); 35. } 36. 37. } 38. } Fechando a conexão Não é comum utilizar jdbc hoje em dia. O mais praticado é o uso de alguma api de ORM como o Hibernate ou EJB, porém aqueles que ainda insistem no uso de JDBC devem prestar atenção no momento de fechar a conexão. O exemplo dado acima não fecha a mesma caso algum erro ocorra no momento de inserir algum dado no banco de dados. O comum é fechar a conexão em um bloco finally. Má prática: Statement Ao invés de usar o PreparedStatement, você pode usar uma interface mais simples chamada Statement, que simplesmente executa uma cláusula SQL no método execute: Statement stmt = con.createstatement(); stmt.execute( insert into contatos (nome,email,endereco) values ('Nome','Email','Endereco') ); stmt.close(); Mas prefira a classe PreparedStatement que é mais rápida que Statement e deixa seu código muito mais limpo. Geralmente, seus comandos SQL conterão valores vindos de variáveis do programa Java; usando Statements, você terá que fazer muitas concatenações, mas usando PreparedStatements, isso fica mais limpo e fácil. 4.9 - DAO Data Access Object Já foi possível sentir que colocar código SQL dentro de suas classes de lógica é algo nem um pouco elegante e muito menos viável quando você precisa manter o seu código. Quantas vezes você não ficou bravo com o programador responsável por aquele código ilegível? DAO A idéia do DAO é remover o código de acesso ao banco de dados de suas classes de lógica e colocá-lo em uma classe responsável pelo acesso ao mesmo. Capítulo 4 - JDBC java.sql - Página 14

Assim o código de acesso ao banco de dados fica em um lugar só, ficando mais fácil dar manutenção ao mesmo. Vamos começar alterando nosso programa de inclusão para deixá-lo mais simples. Primeiro vamos usar a classe java.util.scanner do Java 5 para ler os dados a serem gravados. Algo como o código a seguir: // cria o Scanner Scanner teclado = new Scanner(System.in); // pronto para gravar Contato contato = new Contato(); contato.setnome(teclado.next()); contato.setemail(teclado.next()); contato.setendereco(teclado.next()); Depois, seria muito melhor e mais elegante poder chamar um único método responsável pela inclusão, certo? 1. package br.com.caelum.jdbc; 2. 3. import java.sql.connection; 4. import java.sql.sqlexception; 5. import java.util.scanner; 6. 7. public class JDBCInsertDAO { 8. 9. public static void main(string[] args) { 10. 11. try { 12. 13. // conectando 14. Connection con = ConnectionFactory.getConnection(); 15. System.out.println("Conectado!"); 16. 17. // cria o Scanner 18. Scanner teclado = new Scanner(System.in); 19. System.out.println("Entre com os dados:"); 20. 21. // pronto para gravar 22. Contato contato = new Contato(); 23. contato.setnome(teclado.next()); 24. contato.setemail(teclado.next()); 25. contato.setendereco(teclado.next()); 26. 27. // grave nessa conexão!!! 28. ContatoDAO dao = new ContatoDAO(con); 29. 30. // método elegante 31. dao.adiciona(contato); 32. 33. System.out.println("Gravado!"); 34. 35. con.close(); 36. 37. } catch (SQLException e) { 38. e.printstacktrace(); 39. } 40. 41. } 42. } Não é muito difícil visualizar uma classe com métodos responsáveis por adicionar objetos em um banco de dados, por exemplo: Capítulo 4 - JDBC java.sql - Página 15

1. // atenção ao pacote!! 2. package br.com.caelum.jdbc.dao; 3. 4. import br.com.caelum.jdbc.*; 5. import java.sql.*; 6. 7. public class ContatoDAO { 8. 9. // a conexão com o banco de dados 10. private Connection connection; 11. 12. // construtor que recebe a conexão 13. public ContatoDAO(Connection con) { 14. this.connection = con; 15. } 16. 17. public ContatoDAO() throws SQLException { 18. this.connection = ConnectionFactory.getConnection(); 19. } 20. 21. public void adiciona(contato contato) throws SQLException { 22. 23. // prepared statement para inserção 24. PreparedStatement stmt = this.connection.preparestatement("insert into contatos (nome,email,endereco) values (?,?,?)"); 25. 26. // seta os valores 27. stmt.setstring(1,contato.getnome()); 28. stmt.setstring(2,contato.getemail()); 29. stmt.setstring(3,contato.getendereco()); 30. 31. // executa 32. stmt.execute(); 33. stmt.close(); 34. } 35. } 4.10 - Pesquisando Para pesquisar também utilizamos a interface PreparedStatement, de forma que o método executequery retorna todos os contatos no exemplo a seguir. RESULTSET O objeto retornado é do tipo ResultSet que permite navegar por seus registros através do método next. Esse método irá retornar false quando chegar ao fim da pesquisa, portanto ele é normalmente utilizado para fazer um loop nos registros. Para retornar o valor de uma coluna no banco de dados basta chamar um dos métodos get do ResultSet, entre eles existe o mais comum: getstring. 1. // pega a conexão e o Statement 2. Connection con = ConnectionFactory.getConnection(); 3. PreparedStatement stmt = con.preparestatement("select * from contatos"); 4. 5. // executa um select 6. ResultSet rs = stmt.executequery(); 7. 8. // itera no ResultSet 9. while (rs.next()) { 10. System.out.println( 11. rs.getstring("nome") + " :: " + rs.getstring("email") 12. ); 13. } 14. Capítulo 4 - JDBC java.sql - Página 16

15. stmt.close(); 16. con.close(); Recurso Avançado: O cursor Assim como o cursor do banco de dados, só é possível mover para o próximo registro. Para permitir um processo de leitura para trás é necessário especificar na abertura do ResultSet que tal cursor deve ser utilizado. Mas, novamente, podemos aplicar as idéias de DAO e criar um método getlista() no nosso ContatoDAO: 1. public List<Contato> getlista() throws SQLException { 2. 3. PreparedStatement stmt = this.connection.preparestatement("select * from contatos"); 4. ResultSet rs = stmt.executequery(); 5. 6. List<Contato> list = new ArrayList<Contato>(); 7. 8. while (rs.next()) { 9. // criando o objeto Contato 10. Contato contato = new Contato(); 11. contato.setnome(rs.getstring( nome )); 12. contato.setemail(rs.getstring( email )); 13. contato.setendereco(rs.getstring( endereco )); 14. 15. // adicionando o objeto à lista 16. list.add(contato); 17. } 18. 19. rs.close(); 20. stmt.close(); 21. 22. return list; 23. } 4.11 - Exercícios 1-) Vamos usar o método lista agora para listar todos os contatos do nosso banco de dados: Passo 1: Crie uma classe chamada TestaListaDAO com um método main Passo 2: Pegue uma conexão no nosso ConnectionFactory: Connection con = ConnectionFactory.getConnection(); Passo 3: Crie um ContatoDAO para essa conexão: ContatoDAO dao = new ContatoDAO(con); Passo 4: Liste os contatos com o DAO: List<Contato> contatos = dao.getlista(); Passo 5: Itere nessa lista e imprima as informações dos contatos: for (Contato contato : contatos) { System.out.println( Nome: + contato.getnome()); System.out.println( Email: + contato.getemail()); System.out.println( Endereço: + contato.getendereco() + \n ); } Passo 6: Feche a conexão con.close(); Capítulo 4 - JDBC java.sql - Página 17

4.12 - Um pouco mais... 4.13 - Exercícios 1-) Assim como o MYSQL existem outros bancos de dados gratuitos e open source na internet. O HSQLDB é um banco desenvolvido em Java que pode ser acoplado a qualquer aplicação e libera o cliente da necessidade de baixar qualquer banco de dados antes da instalação de um produto Java! 2-) O Hibernate tomou conta do mercado e virou febre mundial pois não se faz necessário escrever uma linha de código SQL! 3-) Outros projetos como o Hibernate são bastante famosos como o OJB e o Torque, cada um com suas próprias características implementando a funcionalidade de ORM. 4-) O Prevayler, iniciativa brasileira, funciona como uma camada de prevalência de seus objetos, de uma maneira muito diferente de uma ferramenta de ORM convencional. 5-) Se um projeto não usa nenhuma das tecnologias de ORM disponíveis, o mínimo a ser feito é seguir o DAO. 1-) Remova dados do banco de dados através da query DELETE. 2-) Use cláusulas where para refinar sua pesquisa no banco de dados. Por exemplo: where nome like 'C%' 3-) Crie o método pesquisar que recebe um id (int) e retorna um objeto do tipo Contato. 4-) Crie o método remover na sua classe de DAO, ele recebe um id (int). 5-) Use a classe de DAO para procurar e remover contatos do banco de dados. 6-) Altere o último exemplo para que o nome, email e endereço do contato sejam perguntados ao usuário. Use esse programa novo para adicionar algumas entradas no banco de dados. Relembrando java.io Para a leitura de linhas do usuário podemos usar o código a seguir: BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Entre com o nome: "); String nome = buffer.readline(); 4.14 - Desafios 1-) Faça conexões para outros tipos de banco de dados disponíveis. 4.15 - Fixando o conhecimento 1-) Crie uma classe chamada Cliente com os campos id (Integer), nome, endereco, telefone (String) e data de nascimento (java.util.date). Baseado nela: a) crie uma tabela no banco de dados b) crie uma classe do tipo DAO Capítulo 4 - JDBC java.sql - Página 18

c) use-a para instanciar novos clientes e colocá-los no seu banco Capítulo 4 - JDBC java.sql - Página 19

capítulo 5 5Servlet Contêiner Que ninguém se engane: só se consegue a simplicidade através de muito trabalho. Clarice Lispector - O que é e como funciona um servlet conteiner. 5.1 - Introdução Da necessidade de gerar conteúdo dinâmico surgiram primeiro os programas de CGI (Common Gatway Interface). Através de linguagens como C, C++, Perl, ASP, PHP, Cobol, Delphi, Shell etc, foi possível gerar conteúdo que permite ao usuário acesso à diversas funcionalidades através de páginas HTML, como quando você deseja comprar produtos em uma loja virtual. Para melhorar o desempenho do último, inventaram o que viria a ser uma servlet, uma nova forma de trabalhar com requisições de clientes via web que economiza o tempo de processamento de uma chamada e a memória que seria gasta para tal processo, além de ser em Java e possuir todas as vantagens e facilidades de orientação a objeto. Além do mais, servlets são portáveis tanto quanto qualquer programa escrito em Java, e aqueles que programam servlets não precisam mais se preocupar com a funcionalidade do servidor, que já foi escrita para nós e não precisa ser alterada. HTML Este curso tem como pré-requisito o conhecimento de HTML: saber utilizar as tags principais para a construção de páginas dinâmicas (html, body, form, input, textarea e select). No caso de ainda não estar acostumado com páginas HTML, recomenda-se que tente ler algum tutorial para que não apareçam dificuldades durante o curso. Em breve iremos estudar as servlets, mas antes estudaremos o JSP (Java Server Pages), que é como escrevemos a maior parte de nossas páginas dinâmicas em Java. 5.2 - Servlet Contêiner CONTÊINER O contêiner é o componente responsável pelo controle das servlets: ele a instancia e utiliza à medida que se faz necessário. É importante frisar que a mesma instância de uma servlet (o mesmo objeto) pode ser chamada mais de uma vez para diferentes requisições ao mesmo tempo. Capítulo 5 - Servlet Contêiner - Página 20

Atenção: Toda servlet deve possuir um construtor sem argumentos para que o contêiner possa criá-la. O servlet contêiner inicializa a servlet e a usa durante todo o seu período ativo, até que irá desativá-la através do método destroy, para então liberar o objeto. Parâmetros de inicialização podem ser passados para a servlet e serão explicados mais adiante na seção de web.xml. 5.3 - Tipos de contêiner Os 3 tipos mais comum de instalação de servlet contêiners e webservers são mostrados no gráfico. Clientes No primeiro, todas as requisições vão direto para o webserver, que também é o contêiner. No tipo dois, o webserver usa o contêiner como um plugin e envia as requisições pertinentes ao mesmo, enquanto, no tipo três, as requisições são feitas diretamente ao webserver ou ao contêiner. Webserver + Servlet Contêiner juntos Webserver Servlet Contêiner Webserver Servlet Contêiner Tipo 1 Tipo 2 Tipo 3 Tomcat Baixe o tomcat em http://jakarta.apache.org no link de download binaries. A última versão em 2005 era a 5.0 com suporte a api 2.4 de servlets. O Tomcat virou implementação padrão e referência de novas apis de servlets, isto é, quando uma nova especificação surge, o tomcat costuma ser o primeiro servlet contêiner a implementar a nova api. 5.4 - Instalando o tomcat Para instalar o Tomcat na Caelum, digite os passos a seguir no console (atenção em pôr o número da versão do tomcat no lugar de xxxx): cp /caelum/jakarta-tomcat-xxxx.tar.gz ~/ cd ~ tar zxvf jakarta-tomcat-xxxx.tar.gz Ao baixar o tomcat para o Windows em casa, você pode pegar uma versão que é o instalador.exe ou um.zip e descompactá-lo. 5.5 - Iniciando o tomcat cd ~/jakarta-tomcat-xxxx/bin./startup.sh Entre no diretório de instalação e rode o programa startup.sh: Capítulo 5 - Servlet Contêiner - Página 21

5.6 - Parando o tomcat Entre no diretório de instalação do tomcat e rode o programa shutdown.sh: cd ~/jakarta-tomcat-xxxx/bin./shutdown.sh Capítulo 5 - Servlet Contêiner - Página 22

capítulo 6 6JSP e JSTL Java Server Pages Que ninguém se engane: só se consegue a simplicidade através de muito trabalho. Clarice Lispector - 6.1 - JSP Nesse capítulo, você aprenderá: o que é JSP; o que é JSTL; taglib core. JSP Agora que já instalamos o Tomcat, podemos nos preocupar com criar a nossa primeira aplicação web, que será baseada na tecnologia chamada de JSP, Java Server Pages, páginas dinâmicas que geram normalmente conteúdo html para servidores web. Começamos importando o projeto projeto-jsp dentro do Eclipse. Ele possui a seguinte estrutura de diretórios e arquivos que irá facilitar o seu trabalho toda vez que você quiser criar um projeto desse tipo: - src: diretório onde se encontram suas classes. Repare que existem duas classes dentro do pacote br.com.caelum.webbasico.modelo. - target: diretório da sua aplicação web de verdade. Tudo que sua aplicação web precisa está aqui dentro. Coloque nesse diretório os arquivos de extensão html, jpg, gif, swf, jsp etc. - target/web-inf/: todos os arquivos e diretórios dentro do diretório WEB-INF (maiúsculo) é invisível para o cliente final, portanto jamais coloque páginas html aqui, pois não serão acessíveis, exatamente por esse motivo colocamos os arquivos de configuração do banco de dados, de suas servlets etc nesse diretório. - target/web-inf/classes: todas as classes são geradas dentro deste diretório (para mudar esta opção, consulte as instruções sobre o eclipse). - target/web-inf/lib: aqui estão as bibliotecas (arquivos.jar) que serão necessárias para nossa aplicação web. Esses arquivos compõem o que iremos chamar mais adiante de JSTL. - ListaDeTeste.java: esta classe extende java.util.arraylist e representa uma lista que já inclui três mensagens em si mesmo automaticamente. Capítulo 6 - JSP e JSTL Java Server Pages - Página 23

- Mensagem.java: esta classe representa uma mensagem, com campos do tipo String representando quem enviou a mesma, para quem ela está indo, o corpo dela e um campo do tipo double com o custo do envio dessa mensagem. - web.xml: esse arquivo representa a estrutura da nossa aplicação web, o arquivo que você terá descompactado não possui nenhuma informação vital, somente o básico para toda aplicação web. <?xml version="1.0" encoding="iso-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"> <display-name>aplicacao web simples</display-name> </web-app> WEB-INF/lib O diretório lib dentro do WEB-INF pode conter todas as bibliotecas necessárias para a aplicação web, evitando assim que o classpath da máquina que roda a aplicação precise ser alterado. Além do mais, cada aplicação web poderá usar suas próprias bibliotecas com suas versões específicas! 6.2 - Configurando o Tomcat Vamos então configurar o tomcat. Para isso basta criar um arquivo de extensão xml com o nome de sua aplicação no diretório tomcat/conf/catalina/localhost. Iremos configurar a url /jspteste para o diretório /home/usuario/workspace/projeto-jsp/target/. Queremos também permitir que o tomcat faça o restart de sua aplicação sempre que julgar necessário. Passo 1. vá para o diretório tomcat/conf/catalina/localhost Passo 2. crie um arquivo chamado jspteste.xml Passo 3. escreva o código a seguir no seu arquivo: <Context path="/jspteste" docbase="/home/usuario/workspace/projeto-jsp/target/" debug="0" reloadable="true"> </Context> O arquivo xml de configuração do tomcat O processo de editar esse arquivo xml a mão só é feito na máquina do desenvolvedor, conforme veremos no capítulo que explica os arquivos.war. Em processos de build mais desenvolvidos, não existe configuração a ser feita nem mesmo na máquina de desenvolvimento, sendo tudo automatizado por processos de build e deploy. 6.3 - O que é uma página JSP <html> Bem vindo </html> O primeiro arquivo jsp que vamos criar é o chamado bemvindo.jsp. Esse arquivo poderia conter simplesmente código html, como o código a seguir: Afinal, JSP é uma página html comum que também contem código Java e possui extensão jsp, claro. Capítulo 6 - JSP e JSTL Java Server Pages - Página 24

Assim, fica claro que uma página jsp nada mais é que um arquivo baseado em html. Podemos adicionar também código java, portanto não seremos tão simplistas: seremos elegantes ao ponto de escrever um código java na nossa página. Que tal declarar uma variável do tipo String: <% String s = Bem vindo! ; %> Simples! Para escrever código java na sua página basta escrevê-lo entre as tags <% e %>. Esse código é chamado de scriplet. Essa idéia de colocar código de uma linguagem de programação junto com html não é tão nova. A Netscape possuia o SSJS (Server-Side Javascript) por exemplo, usando código baseado em javascript. Scriplet Scriplet é o código escrito entre <% e %>, esse nome é composto da palavra script (linguagem de script) com o sufixo let, que indica algo pequeno. A Sun possui essa mania de colocar o sufixo let em muitas coisas como os scriptlets, servlets, portlets etc. Podemos avançar mais um pouco com jsp e utilizar uma das variáveis já implicitas no jsp: todo arquivo jsp já possui uma variável chamada out (do tipo JspWriter) que permite imprimir objetos através do método println: <% out.println(s); %> <%= s %><br> <html> Ou ainda podemos utilizar um atalho (muito parecido, ou igual, a outras linguagens de script para a web): Agora já estamos aptos a escrever o nosso primeiro jsp: Passo 1. Crie o arquivo chamado bemvindo.jsp. Em qual diretório ele deve ser criado? Passo 2. Digite o código a seguir. <% String s = "Bem vindo!"; %> Duas versões diferentes na hora de imprimir algo:<br> <% out.println(s); %><br> <%= s %><br> </html> Passo 3. Acesse o site, o link é: http://localhost:8080/jspteste/bemvindo.jsp Comentários Os comentários em uma página jsp devem ser feitos como o exemplo a seguir: <%-- comentário em jsp --%> Capítulo 6 - JSP e JSTL Java Server Pages - Página 25

6.4 - Exercício 1-) Se você possuísse um arquivo chamado database.properties, em que diretório você o colocaria? 2-) Em qual diretório você deve compilar suas classes? Porque esse diretório está dentro do diretório WEB-INF? 6.5 - Listando os contatos 3-) Crie um javabean: a) pacote br.com.caelum.webbasico.exercicio1 b) classe Livro c) atributo String autor d) atributo java.util.date datadepublicacao e) atributo int paginas f) atributo double preco g) atributo boolean promocao h) métodos get e set para cada um dos atributos Vamos avançar um pouco e escrever mais código nas nossas páginas jsp. Poderíamos criar agora uma página que instancia um ContatoDAO do capítulo de JDBC e lista a tabela em forma de código html. Iremos trabalhar com scriplets portanto a maior parte do código ficará entre tags do tipo <% e %>. Vamos criar um ContatoDAO e listar todos os contatos usando o método getlista. Podemos visualizar o código final e ver realmente o que acontece e quão complicado ele fica: <%@ page import="br.com.caelum.jdbc.*" %> <%@ page import="br.com.caelum.jdbc.dao.*" %> <%@ page import="br.com.caelum.jdbc.modelo.*" %> <html><ul> <% java.sql.connection con = ConnectionFactory.getConnection(); ContatoDAO dao = new ContatoDAO(con); for (Contato contato : dao.getlista() ) { %> <li><%=contato.getnome()%>, <%=contato.getemail()%>: <%=contato.getendereco()%></li> <% } %> </ul></html> 6.6 - HTML e Java: eu não quero código Java no meu jsp! É complicado ficar escrevendo Java em seu arquivo jsp não é? Primeiro fica tudo mal escrito e difícil de ler. O Java passa a atrapalhar o código html. Capítulo 6 - JSP e JSTL Java Server Pages - Página 26