Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

caelum - java - web - fj21, Manuais, Projetos, Pesquisas de Informática

Livro muityo bom para iniciantes em aplicações web com o Java.

Tipologia: Manuais, Projetos, Pesquisas

2011

Compartilhado em 10/03/2011

yuri-feitosa-12
yuri-feitosa-12 🇧🇷

2 documentos

Pré-visualização parcial do texto

Baixe caelum - java - web - fj21 e outras Manuais, Projetos, Pesquisas em PDF para Informática, somente na Docsity! Caelum Ensino e Soluções em Java FJ-21 Java para desenvolvimento web EU NY sm" | [used RS) E ço 3 E í e ) ac AA rea es Ls Ae Re Rg design by aef.com.br Caelum “Mata o tempo e matas a tua carreira” Bryan Forbes ­ Sobre a empresa A Caelum atua no mercado desde 2002, desenvolvendo sistemas e prestando consultoria  em   diversas   áreas,   à   luz   sempre   da   plataforma   Java.   Foi   fundada   por   profissionais   que   se  encontraram no Brasil depois de uma experiência na Alemanha e Itália, desenvolvendo sistemas de  grande porte com integração aos mais variados ERPs. Seus profissionais publicaram já diversos  artigos   nas   revistas   brasileiras   de   Java,   assim   como   artigos   em  eventos   acadêmicos,   e   são  presença constante nos eventos da tecnologia.  Em   2004   a   Caelum   criou   uma   gama   de   cursos   que   rapidamente   ganharam   grande  reconhecimento no mercado. Os cursos foram elaborados por ex­instrutores da Sun que queriam  trazer mais dinamismo e aplicar as  ferramentas e bibliotecas utilizadas no mercado, tais como  Eclipse, Hibernate, Struts, e outras tecnlogias open source que não são abordadas pela Sun. O  material utilizado foi inicialmente desenvolvido enquanto eram ministrados os cursos de verão de  java da Universidade de São Paulo em janeiro de 2004 pelos instrutores da Caelum. Em 2006 a empresa foca seus projetos em três grandes áreas: sistemas de gerenciamento  de conteúdo para portais, desenvolvimento de soluções de integração financeira e treinamento com  intuito de formação.  Sobre a apostila 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. A Caelum espera que você aproveite esse material, e que ele possa ser de grande valia para  auto didatas e estudantes. Todos os comentários, críticas e sugestões serão muito bem vindos. 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, porém pode  ser referência e material de apoio. Caso você esteja interessado em usá­lo fins comerciais, entre  em contato com a empresa. Atenção:  Você  pode verificar  a data de última atualização da apostila  no  fim do  índice.  Nunca imprima a apostila que você receber de um amigo ou pegar por email, pois atualizamos  constantemente esse material, quase que mensalmente. Vá até o nosso site e faça o download da  última versão! www.caelum.com.br Caelum ­ Java para desenvolvimento Web 9.4 - Tratamento padrão de erros – modo declarativo..................................68 9.5 - Página de erro.......................................................................................68 9.6 - Configurando a página de erro.............................................................68 9.7 - Quando acontece um erro em uma página jsp......................................69 9.8 - Exercícios..............................................................................................69 9.9 - Tratamento de outros erros..................................................................70 9.10 - Erros comuns......................................................................................71 9.11 - Exercícios............................................................................................71 9.12 - Erros Comuns......................................................................................73 Capítulo 10: Servlets.........................................................................................74 10.1 - Servlet............................................................................................. ....74 10.2 - A estrutura de diretórios.....................................................................76 10.3 - Mapeando uma servlet no web.xml....................................................76 10.4 - Exercícios............................................................................................76 10.5 - Erros comuns......................................................................................78 10.6 - Init e Destroy.......................................................................................80 10.7 - Curiosidades do mapeamento de uma servlet....................................81 10.8 - OutputStream x PrintWriter................................................................81 10.9 - Parâmetros..........................................................................................82 10.10 - Exercícios..........................................................................................83 10.11 - Exercícios adicionais.........................................................................86 10.12 - doGet, doPost e outros......................................................................86 10.13 - Conversão de parâmetros.................................................................87 10.14 - Exercícios..........................................................................................87 10.15 - Exercícios adicionais.........................................................................89 10.16 - Variáveis membro..............................................................................89 10.17 - Exercícios..........................................................................................90 10.18 - HTML e Java: eu não quero código Html na minha servlet!.............93 10.19 - Como funciona uma página JSP........................................................93 10.20 - Web archive (.war)............................................................................94 10.21 - Exercícios..........................................................................................94 10.22 - Quando acontece um erro em uma servlet.......................................97 10.23 - O try e catch......................................................................................98 10.24 - Exercícios..........................................................................................99 10.25 - Servlet para adicionar contatos no banco......................................100 10.26 - Exercício.........................................................................................100 Capítulo 11: Servlet e JSP API........................................................................104 11.1 - Início e término da sua aplicação.....................................................104 11.2 - Exercícios..........................................................................................105 11.3 - getServletContext()...........................................................................105 11.4 - Exercícios..........................................................................................106 11.5 - Acessando a aplicação no jsp............................................................107 11.6 - Exercícios..........................................................................................107 11.7 - Propriedades de páginas jsp.............................................................108 Capítulo 12: Model View Controller...............................................................109 12.1 - Servlet ou JSP?..................................................................................109 12.2 - Request dispatchers.........................................................................110 12.3 - Exercício...........................................................................................111 12.4 - Resultado..........................................................................................111 Data desta edição: 26 de Junho de 2006 iv Caelum ­ Java para desenvolvimento Web 12.5 - Melhorando o processo.....................................................................111 Capítulo 13: Construindo um Framework MVC.............................................116 13.1 - Nossa interface de execução............................................................116 13.2 - Exercícios..........................................................................................116 13.3 - Criando um controlador e um pouco mais de reflection...................117 13.4 - Configurando o web.xml...................................................................119 13.5 - Exercícios..........................................................................................119 13.6 - Exercícios..........................................................................................120 13.7 - Exercícios Adicionais........................................................................122 13.8 - Model View Controller......................................................................122 13.9 - Lista de tecnologias: camada de controle.........................................123 13.10 - Lista de tecnologias: camada de visualização................................124 13.11 - MVC 2.............................................................................................124 Capítulo 14: Jakarta Struts.............................................................................125 14.1 - Struts.................................................................................................125 14.2 - Configurando o Struts.......................................................................125 14.3 - Exercícios..........................................................................................125 14.4 - Arquivo de mensagens......................................................................131 14.5 - Exercícios..........................................................................................132 14.6 - Erros comuns....................................................................................133 14.7 - Uma ação Struts................................................................................135 14.8 - Configurando a ação no struts-config.xml........................................136 14.9 - Exercícios..........................................................................................137 14.10 - Erros comuns..................................................................................139 14.11 - Pesquisando um banco de dados....................................................141 14.12 - Criando a ação................................................................................141 14.13 - O arquivo web/lista.jsp....................................................................142 14.14 - struts-config.xml.............................................................................142 14.15 - Exercício.........................................................................................143 14.16 - Resultado condicional com o Struts................................................145 14.17 - Exercícios........................................................................................145 14.18 - Resultado do struts-config.xml.......................................................146 14.19 - Novos contatos................................................................................146 14.20 - Formulário.......................................................................................147 14.21 - Mapeando o formulário no arquivo struts-config.xml.....................147 14.22 - Exercício.........................................................................................148 14.23 - Lógica de Negócios.........................................................................148 14.24 - Exercício.........................................................................................149 14.25 - Erros comuns..................................................................................150 14.26 - Validando os campos.......................................................................150 14.27 - Exercício.........................................................................................151 14.28 - Erros comuns..................................................................................152 14.29 - Limpando o formulário....................................................................152 14.30 - Exercícios........................................................................................153 14.31 - Exercícios........................................................................................153 14.32 - Dois formulários para a mesma ação..............................................153 14.33 - Exercícios adicionais.......................................................................154 14.34 - Struts-logic taglib: um exemplo antigo de for................................157 14.35 - Um pouco mais................................................................................157 Data desta edição: 26 de Junho de 2006 v Caelum ­ Java para desenvolvimento Web Capítulo 15: Jakarta Struts.............................................................................158 15.1 - Preparando um sistema de login......................................................158 15.2 - Passo 1: Formbean............................................................................158 15.3 - Passo 2: A página de login: login.jsp.................................................159 15.4 - Exercício...........................................................................................159 15.5 - A ação................................................................................................160 15.6 - A ação no struts-config.xml...............................................................161 15.7 - ok.jsp e erro.jsp.................................................................................161 15.8 - Exercícios..........................................................................................161 15.9 - Testando............................................................................................162 15.10 - Erros comuns..................................................................................163 15.11 - Exercícios........................................................................................163 15.12 - Cookies............................................................................................163 15.13 - Sessão.............................................................................................164 15.14 - Configurando o tempo limite..........................................................164 15.15 - Registrando o usuário logado na sessão.........................................164 15.16 - Exercícios........................................................................................165 15.17 - Mas e o login acessando o banco de dados?...................................166 Capítulo 16: Hibernate 3.2.............................................................................167 16.1 - Vantagens..........................................................................................167 16.2 - Criando seu projeto...........................................................................167 16.3 - Modelo..............................................................................................168 16.4 - Configurando a classe/tabela Produto .............................................168 16.5 - Exercícios..........................................................................................169 16.6 - Propriedades do banco......................................................................169 16.7 - Exercícios..........................................................................................169 16.8 - Configurando....................................................................................170 16.9 - Criando as tabelas.............................................................................170 16.10 - Exercícios........................................................................................170 16.11 - Sessões............................................................................................171 16.12 - Hibernate Session Factory..............................................................171 16.13 - Exercícios........................................................................................172 16.14 - Salvando novos objetos...................................................................172 16.15 - Exercícios........................................................................................172 16.16 - Buscando pelo id.............................................................................173 16.17 - Criando o ProdutoDAO ...................................................................173 16.18 - Exercícios........................................................................................173 16.19 - Buscando com uma cláusula where................................................174 16.20 - ProdutoDAO: Listar tudo e fazer paginação...................................174 16.21 - Exercícios para o preguiçoso..........................................................174 16.22 - Exercícios adicionais.......................................................................175 Capítulo 17: E agora?.....................................................................................177 17.1 - Certificação.......................................................................................177 17.2 - Frameworks......................................................................................177 17.3 - Revistas.............................................................................................177 17.4 - Falando em Java................................................................................177 Capítulo 18: Apêndice A - VRaptor.................................................................179 18.1 - Eu não quero o que eu não conheço.................................................179 18.2 - Vantagens..........................................................................................180 Data desta edição: 26 de Junho de 2006 vi Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 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 - 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, é 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. Convenções de Código Para mais informações sobre as convenções de código­fonte Java, acesse: http://java.sun.com/docs/codeconv/ 1.2 - Sobre os exercícios Os   exercícios   do   curso   variam   entre   práticos   até   pesquisas   na   Internet,   ou   mesmo  Capítulo 1 ­ Como aprender Java ­ Página 1 capítulo 1 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 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.3 - 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.4 - 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.5 - 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 durante 2 anos. Cofundador do GUJ, escreve para a revista  Mundo Java, estuda Matemática Aplicada na USP e é instrutor e consultor  na Caelum. Um dos  comitters do Codehaus XStream. Paulo Silveira (paulo.silveira@caelum.com.br) é programador e desenvolvedor certificado  Java.   Possui   grande   experiência   em   desenvolvimento   web,   trabalhando   em   projetos   na  Alemanha e em diversas consultorias no Brasil. Foi instrutor Java pela Sun, é cofundador do  GUJ e formado em ciência da computação pela USP, onde realiza seu mestrado. É um dos  editores técnicos da revista Mundo Java. Sérgio Lopes  (sergio.lopes@caelum.com.br) Bacharelando em Ciência da Computação  na USP e desenvolvedor Java desde 2002. É programador certificado Java pela Sun, moderador  do GUJ e colaborador  da  revista  Mundo Java.  Trabalha com Java para Web e dispositivos  móveis, além de ministrar treinamentos na Caelum. Inúmeras modificações e sugestões foram realizadas por outros consultores e instrutores  da Caelum, em especial Alexandre da Silva, Fábio Kung e Thadeu Russo. Capítulo 1 ­ Como aprender Java ­ Página 2 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Diversos   screenshots,   remodelamentos   e   melhorias   nos   textos   foram   realizados   por  Guilherme Moreira e Jacqueline Rodrigues. Agrecimentos a todas as pessoas que costumam enviar erros, bugs e sugestões para a  equipe. Capítulo 1 ­ Como aprender Java ­ Página 3 BANCO DE DADOS Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 2­) Clique em Finish. 2.3 - O banco 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. O  MYSQL  é  o banco de dados que usamos para nossos exemplos,  portanto  iremos  utilizar o seguinte comando no seu terminal para acessar o mesmo: mysql ­u root 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. O   processo   de   armazenagem   e   captura   de   dados   em   um   banco   é   chamado   de  Capítulo 2 ­ JDBC – java.sql ­ Página 6 PERSISTÊNCI A DRIVERMANAG ER Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 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. 2.4 - Sockets: uma idéia inocente Para se conectar a um banco de dados, a primeira  idéia,  simples em sua forma mas  complexa em sua  implementação,  é  a de abrir  sockets  diretamente com o banco de dados  desejado,  por  exemplo um Oracle,  e se comunicar  com o mesmo através de seu protocolo  proprietário – e não só SQL.  Mas você conhece o protocolo proprietário de algum banco de dados? Devido a natureza complexa desses protocolos,  seria muito mais simples se existisse  alguém em Java com quem nosso programa fosse capaz de se comunicar em Java e ele se  comunicasse com o banco em um protocolo qualquer, alheio ao nosso programa. 2.5 - 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 banco de dados padrão deve nos fornecer. Por   exemplo,   toda   conexão   deve   permitir  executar código de atualização, pesquisa, etc. Essa   implementaçã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. O   serviço   de   encontrar   uma   ponte,   ou   seja,   um  driver  certo   é   delegado   para   um  controlador   de  drivers.   Um  gerente   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 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  Capítulo 2 ­ JDBC – java.sql ­ Página 7 Interface JDBC BD Implementação JDBC. Qual? Cliente Interface JDBC MySQL Implementação JDBC. MySQL Cliente DriverManager.getConnection("jdbc:mysql://localhost/teste"); DriverManager procura  por algum de seus  Drivers que aceite essa  URL como parâmetro. Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web conexão para um banco mysql na própria máquina.... package br.com.caelum.jdbc; // imports aqui (ctrl + shift + o) public class JDBCExemplo { public static void main(String[] args) { try { Connection con =    DriverManager.getConnection("jdbc:mysql://localhost/teste"); System.out.println("Conectado!"); con.close(); } catch (SQLException e) { e.printStackTrace(); } } } 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. 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(). package br.com.caelum.jdbc; // imports aqui (ctrl + shift + o) public class JDBCExemplo { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection con =              DriverManager.getConnection("jdbc:mysql://localhost/teste", “root”, “”); System.out.println("Conectado!"); con.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } Alterando o banco de dados Capítulo 2 ­ JDBC – java.sql ­ Página 8 DriverManager SQLServer Oracle MySQL Class.forName("com.mysql.jdbc.Driver"); Avisando o DriverManager sobre a existência de um Driver para o MySQL Drivers conhecidos JAVABEANS Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Path. c)   Rode   novamente   sua   aplicação   TestaConexao   agora   que   colocamos   o   driver   no  classpath. 2.9 - A tabela de exemplo Para criar uma tabela nova, devemos rodar o comando mysql para entrar no mesmo.  mysql ­u root 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 uma tabela  de contatos. 2.10 - Javabeans 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  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 da Caelum. 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: package br.com.caelum.jdbc.modelo; public class Contato { Capítulo 2 ­ JDBC – java.sql ­ Página 11 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web private Long id; private String nome; private String email; private String endereco; // métodos get e set para id, nome, email e endereço public String getNome() { return this.nome; } public void setNome(String novo) { this.nome = novo; } public String getEmail() { return this.email; } public void setEmail(String novo) { this.email = novo; } public String getEndereco() { return this.endereco; } public void setEndereco(String novo) { this.endereco = novo; } public Long getId() { return this.id; } public void setId(Long novo) { this.id = novo; } } 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  Se você quer saber mais sobre Enterprise Java Beans (EJB), a Caelum oferece o curso  FJ­31, não os confunda com Java Beans! 2.11 - Exercícios 1­) Crie a classe de Contato. a) No pacote br.com.caelum.jdbc.modelo, crie uma classe chamada Contato. package br.com.caelum.jdbc.modelo; public class Contato { private Long id; private String nome; private String email; private String endereco; } b) Vá no menu Source, Generate getters e setters e selecione todos os getters e setters. Capítulo 2 ­ JDBC – java.sql ­ Página 12 PREPARED STATEMENT Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 2.12 - 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. Primeiro o código SQL: 1. String sql = "insert into contatos (nome,email,endereco) values ('" + nome +  "', '" + email + "', '" + endereco + "')"; O exemplo acima possui dois pontos negativos que são importantíssimos. O primeiro é  que o programador que não escreveu o código original não consegue bater o olho e entender o  que está escrito. O que o código acima faz? Lendo rapidamente fica difícil. Mais difícil ainda é  saber se faltou uma vírgula, um fecha parênteses talvez? Outro problema é o clássico “preconceito contra Joana d'arc”, formalmente chamado de  SQL Injection. O que acontece quando o contato a ser adicionado possui no nome uma aspas  simples? O código sql se quebra todo e pára de funcionar ou, pior ainda, o usuário final é capaz  de alterar seu código sql para executar aquilo que ele deseja (sql injection)... tudo isso porque  escolhemos aquela linha de código e não fizemos o escape de caracteres especiais. Por esses dois motivos não iremos usar código sql como mostrado anteriormente... vamos  imaginar algo mais genérico e um pouco mais interessante: String sql = "insert into contatos (nome,email,endereco) values (?,?,?)"; Existe uma maneira em Java de escrever o código sql como no primeiro exemplo dessa  seção (com cocatenações de strings). Essa maneira não será ensinada durante o curso pois é  uma péssima prática que dificulta a manutenção do seu projeto. Perceba que não colocamos os  pontos  de  interrogação de brincadeira,  e  sim porque  realmente não sabemos o que desejamos inserir.  Estamos  interessados em executar  aquele  código mas não sabemos ainda quais são os parâmetros que iremos utilizar nesse código sql  que será executado, chamado de 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.       PreparedStatement stmt = con.prepareStatement("insert into contatos  (nome,email,endereco) values (?,?,?)"); 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.       // preenche os valores       stmt.setString(1, “Caelum”);       stmt.setString(2, “contato@caelum.com.br”);       stmt.setString(3, “R. Vergueiro 3185 cj57”); Por fim, uma chamada à execute executa o comando SQL.       stmt.execute(); Agora  imagine todo esse processo sendo escrito toda vez que desejar  inserir  algo no  Capítulo 2 ­ JDBC – java.sql ­ Página 13 DAO Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web       // método muito mais elegante       bd.adiciona(contato); Tentaremos chegar ao código anterior: seria muito melhor e mais elegante poder chamar  um único método responsável pela inclusão, certo? package br.com.caelum.jdbc; // imports aqui public class TestaInsere {   public static void main(String[] args) {     try {       // pronto para gravar       Contato contato = new Contato();       contato.setNome(“Caelum”);       contato.setEmail(“contato@caelum.com.br”);       contato.setEndereco(“R. Vergueiro 3185 cj57”);       // grave nessa conexão!!!       Misterio bd = new Misterio();       // método elegante       bd.adiciona(contato);       System.out.println("Gravado!");     } catch (SQLException e) {       e.printStackTrace();     }   } } O código anterior já mostra o poder que iremos alcançar: através de uma única classe  seremos capazes de acessar o banco de dados e, mais ainda, somente através dessa classe  será possível acessar os dados. Esta idéia, inocente a primeira vista, é capaz de isolar todo o acesso a banco em classes  bem   simples,   cuja   instância   é   um  objeto  responsável   por  acessar  os  dados.   Da  responsabilidade deste objeto surgiu o nome de Data Access Object ou simplesmente DAO, um  dos mais famosos padrões de desenvolvimento. O que falta para o código acima funcionar é uma classe chamada ContatoDAO com um  método chamado adiciona. Vamos criar uma que se conecta ao banco ao ser construída uma  instância da mesma: public class ContatoDAO { // a conexão com o banco de dados private Connection connection; public ContatoDAO() throws SQLException { this.connection = ConnectionFactory.getConnection(); } } Agora que todo ContatoDAO possui uma conexão com o banco podemos focar no método  adiciona, que recebe um Contato  como argumento e é   responsável  por  adicionar  o mesmo  através de código sql. Capítulo 2 ­ JDBC – java.sql ­ Página 16 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web public void adiciona(Contato contato) throws SQLException { // prepared statement para inserção PreparedStatement stmt = this.connection.prepareStatement("insert into  contatos (nome,email,endereco) values (?, ?, ?)"); // seta os valores stmt.setString(1,contato.getNome()); stmt.setString(2,contato.getEmail()); stmt.setString(3,contato.getEndereco()); // executa stmt.execute(); stmt.close(); } 2.15 - Exercícios 1­) Crie a classe br.com.caelum.jdbc.dao.ContatoDAO package br.com.caelum.jdbc.dao; // imports aqui (CTRL+SHIFT+O) public class ContatoDAO { // a conexão com o banco de dados private Connection connection; public ContatoDAO() throws SQLException { this.connection = ConnectionFactory.getConnection(); } public void adiciona(Contato contato) throws SQLException { // prepared statement para inserção PreparedStatement stmt = this.connection.prepareStatement("insert into  contatos (nome,email,endereco) values (?, ?, ?)"); // seta os valores stmt.setString(1,contato.getNome()); stmt.setString(2,contato.getEmail()); stmt.setString(3,contato.getEndereco()); // executa stmt.execute(); stmt.close(); } } 2­) Crie uma classe chamada TestaInsere com um método main: package br.com.caelum.jdbc; // imports aqui (CTRL+SHIFT+O) public class TestaInsere {   public static void main(String[] args) throws SQLEXception {       // pronto para gravar       Contato contato = new Contato();       contato.setNome(“Caelum”);       contato.setEmail(“contato@caelum.com.br”);       contato.setEndereco(“R. Vergueiro 3185 cj57”);       // grave nessa conexão!!!       ContatoDAO dao = new ContatoDAO(); Capítulo 2 ­ JDBC – java.sql ­ Página 17 RESULTSET Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web       // método elegante       dao.adiciona(contato);       System.out.println("Gravado!");   } } 3­) Teste seu programa. 4­) Verifique se o contato foi adicionado. mysql ­h localhost ­u root use teste; select * from contatos; 2.16 - Exercícios opcionais 1­) Altere seu programa e use a classe java.util.Scanner do Java 5 para ler os  dados através do teclado: // 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()); 2.17 - Pesquisando Para pesquisar   também utilizamos a  interface  PreparedStatement,  de  forma que o  método executeQuery retorna todos os contatos no exemplo a seguir. 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 como no exemplo a seguir: // pega a conexão e o Statement Connection con = ConnectionFactory.getConnection(); PreparedStatement stmt = con.prepareStatement("select * from contatos"); // executa um select ResultSet rs = stmt.executeQuery(); // itera no ResultSet while (rs.next()) { } rs.close(); stmt.close(); con.close(); Para retornar o valor de uma coluna no banco de dados basta chamar um dos métodos  get do ResultSet, dentre os quais, o mais comum: getString. // pega a conexão e o Statement Connection con = ConnectionFactory.getConnection(); PreparedStatement stmt = con.prepareStatement("select * from contatos"); Capítulo 2 ­ JDBC – java.sql ­ Página 18 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 3­) Use a classe de DAO para procurar e remover contatos do banco de dados. 2.21 - Desafios 1­) Faça conexões para outros tipos de banco de dados disponíveis. 2.22 - Exercícios opcionais Agora que você já sabe usar o PreparedStatement para executar qualquer tipo de código  sql e ResultSet  para receber os dados retornados da sua pesquisa fica simples, porém maçante,  escrever o código de diferentes métodos de uma classe típica de Dao. Veja primeiro o método altera, que recebe um contato cujos valores devem ser alterados: 1. public void altera(Contato contato) throws SQLException { 2. PreparedStatement stmt = connection.prepareStatement("update contatos set  nome=?, email=?, endereco=? where id=?"); 3. stmt.setString(1, contato.getNome()); 4. stmt.setString(2, contato.getEmail()); 5. stmt.setString(3, contato.getEndereco()); 6. stmt.setLong(4, contato.getId()); 7. stmt.execute(); 8. stmt.close(); 9. }  Não existe nada de novo nas linhas acima. Uma execução de query! Simples, não? Agora o código para remoção: começa com uma query baseada em um contato, mas usa  somente o id dele para executar a query do tipo delete: 1. public void remove(Contato contato) throws SQLException { 2. PreparedStatement stmt = connection.prepareStatement("delete from  contatos where id=?"); 3. stmt.setLong(1, contato.getId()); 4. stmt.execute(); 5. stmt.close(); 6. }  2.23 - Exercícios opcionais 1­) Adicione o método para  alterar contato no seu ContatoDAO. public void altera(Contato contato) throws SQLException { PreparedStatement stmt = connection.prepareStatement("update contatos set  nome=?, email=?, endereco=? where id=?"); stmt.setString(1, contato.getNome()); stmt.setString(2, contato.getEmail()); stmt.setString(3, contato.getEndereco()); stmt.setLong(4, contato.getId()); stmt.execute(); stmt.close(); }  2­) Adicione o método para remover contato no seu ContatoDAO. public void remove(Contato contato) throws SQLException { PreparedStatement stmt = connection.prepareStatement("delete from contatos  where id=?"); stmt.setLong(1, contato.getId()); stmt.execute(); stmt.close(); }  Capítulo 2 ­ JDBC – java.sql ­ Página 21 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 3­) Use os métodos criados anteriormente para fazer testes com o seu banco de dados:  atualize e remova um contato. 4­)  Crie uma classe chamada Funcionario com os campos id (Long),  nome, usuario e  senha (String). 5­) Crie uma tabela no banco de dados. 6­) Crie uma classe do tipo DAO. 7­) Use­a para instanciar novos funcionários e colocá­los no seu banco. Capítulo 2 ­ JDBC – java.sql ­ Página 22 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 3O que é o JEE? “Ensinar é aprender duas vezes.” Joseph Joubert ­ ­ O que é o Java Enterprise Edition? ­ Servidor de aplicação ­ Servlet Contêiner ­ Implementação de referência 3.1 - As especificações O JEE (Java Enterprise Edition ou Java EE) 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. Veremos no curso os vários serviços que um software deve implementar para seguir as  especificações   do   JEE.   Veremos   também   conceitos   muito   importantes,   para   depois   firmar  jargões como servidor de aplicação e contêiners. 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).  Algum dia,  você  poderá  querer  trocar essa  implementação atual  por  uma que é  mais  rápida em determinados pontos (e conseqüentemente mais cara). Porém continuará utilizando a  mesma interface, isto é, como você chama aquelas funcionalidades do Java EE. 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 JSE, quanto EE e outros. Sobre o JEE, você pode encontrar em: http://java.sun.com/javaee/ 3.2 - APIs Capítulo 3 ­ O que é o JEE? ­ Página 23 capítulo 3 CONTÊINER Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 4Servlet 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 contêiner. 4.1 - Introdução No começo, a Internet era uma dúzia de páginas estáticas contendo sites de pesquisa de  diversas academias. Da necessidade de gerar conteúdo dinâmico como os primeiros contadores, uma idéia  bem   simples   hoje   em   dia,   surgiram   os   primeiros   programas   de  CGI  (Common   Gateway  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). Caso não esteja acostumado com páginas HTML, recomenda­se que tente ler algum tutorial para  que não apareçam dificuldades durante o curso. Em breve estudaremos as servlets, mas antes veremos o JSP (Java Server Pages), que é  como escrevemos a maior parte de nossas páginas dinâmicas em Java. 4.2 - Servlet Contêiner O contêiner é o componente responsável por dar suporte para as apis de servlet e jsp. 4.3 - Tipos de contêiner Capítulo 4 ­ Servlet Contêiner ­ Página 26 capítulo 4 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Os 3 tipos mais comum de instalação de servlet contêiners e webservers são mostrados  no gráfico. 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. O JEE 5 é composto pelas seguintes especificações ligadas a uma aplicação web: ­ JSP ­ Servlets ­ JSTL ­ JSF Tomcat Baixe o tomcat em http://tomcat.apache.org no link de download binaries. 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. 4.4 - Instalando o tomcat Para instalar o Tomcat na Caelum, siga os seguintes passos: 1­) Abra o File Browser. 2­) Entre no atalho caelum. 3­) Selecione o arquivo do apache­tomcat. 4­) Clique da direita escolha Extract to. Capítulo 4 ­ Servlet Contêiner ­ Página 27 Clientes Webserver +  Servlet  Contêiner juntos Webserver Servlet Contêiner Webserver Servlet Contêiner Tipo 1 Tipo 2 Tipo 3 Fã Caelum — http:/Avww.caelum.com.br - Java para desenvolvimento Web EEE Ele Edt view Go Bookmarks Help e.» a 9 2 EB Back Up Reload Home | Computer E Ame . no Elhome 21 25 El Desktop CO9File system eclipse java scripts ispteste zip mysgl-connector- java-3.1.11-bin jar 'apache-tomcat-5.5.12tar.g2" selected (5.6 MB) 5-) Escolha a sua pasta principal: Home e selecione Extract. Extract Extract in foldei Actions Re-create folders Overwrite existing files Files: [o [| Do not extract older files [| Open destination folder after extraction 6-) O resultado é uma pasta chamada apache-tomcat: o tomcat já está instalado. Capítulo 4 - Servlet Contêiner - Página 28 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Escolha a opção Disable Preview. Infelizmente a versão do Firefox no Linux que usamos não é compatível com o plugin do  grupo Amateras e portanto não permite que visualizemos os jsp's a medida que escrevemos ele. Sendo assim,   tanto  no windows quanto em versões anteriores do Firefox no Linux,  o  plugin é capaz de mostrar um preview do jsp. 5.3 - Configurando o plugin do tomcat no eclipse Vá no menu Window, Preferences, Tomcat: 1­) Selecione a versão 5.x do tomcat. 2­) Selecione tomcat home e coloque o diretório onde instalou o tomcat. Capítulo 5 ­ O eclipse e seus plugins ­ Página 31 Fã Caelum — http:/Avww.caelum.com.br - Java para desenvolvimento Web [upa ja god type filter text Tomcat b General Tomcat version b Amateras () Version 3.3 b - Ant ( Version 4,0,x Help (O Version 4,1,x Install/Update - (8 Version 5.x Java Maven2 Tomcat home [ermejbin/apache-tomcat-5.5.12 Plug-in Developer Run/Debug Context declaration mode Team (8 Serverxml Advanced ( Context files JvM settings Configuration file |cat-5.5.12/conf/server.xml Source Path Tomcat Manager Restore Defaults 3-) Aplique as alterações. 4-JClique no botão do tomcat que está na barra de ferramentas. Problems Javadoc| Declaration JEI E E E E Er So Tomcat 5.x [Java Application] [caelum/dk1.5.0/binfjava (Mar 24, 2006 4:39:55 PM) Mar 24, 2006 4:40:03 PM org.apache.catalina.storeconfig.StoreLoader load E INFO: Find registry server-registry.xml at classpath resource Mar 24, 2006 4:40:04 PM org.apache.catalina.startup.Catalina start INFO: Server startup in 4869 ms 4] T ID) | SM of bm 5 [2 008%| 5-) Abra o seu browser e tente acessar: http://localhost:8080 Capítulo 5 - O eclipse e seus plugins - Página 32 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 5.4 - Em casa: Instalando o eclipse 1­) Baixe o eclipse na página www.eclipse.org. 2­) Descompacte o arquivo e pronto. 5.5 - Em casa: Instalando o plugin para o tomcat Um   dos   plugins   mais   simples   e   famosos   é   o   plugin   para   tomcat   desenvolvido   pela  empresa francesa Sysdeo. O site oficial é: 1­) http://www.sysdeo.com/eclipse/tomcatplugin 2­) Baixe o arquivo tomcatPluginV31beta.zip. 3­) Descompacte o conteúdo desse zip no dentro do diretório plugins onde você instalou o  eclipse.  Por  exemplo,  se  você   instalou  o  eclipse  em  c:\eclipse,  descompacte  o  arquivo  em  c:\eclipse\plugins. 5.6 - Em casa: Instalando o plugin para arquivos jsp, html e xml Iremos utilizar o plugin da amateras para dar suporte aos arquivos do tipo jsp, html e xml.  O site oficial  do plugin é o  http://amateras.sourceforge.jp/  e  iremos utilizar o plugin chamado  EclipseHtmlEditor. Um pré­requisito para o EclipseHtmlEditor é o GEF do próprio projeto Eclipse. O link é o  próprio site do Eclipse, Downloads e então GEF. Baixe a versão relativa ao seu eclipse (por  exemplo 3.1.1). Capítulo 5 ­ O eclipse e seus plugins ­ Página 33 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 2­) O nome do projeto será jspteste. 3­)   Selecione   a   opção   que   separa   o   diretório   de   arquivos   .java   dos   arquivos   .class  (separate source and output folders). 4­) Escolha Next. 5­) Mude o diretório de saída para jspteste/web/WEB­INF/classes Capítulo 6 ­ Novo projeto web ­ Página 36 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Nosso projeto possui a seguinte estrutura: Lembre­se que o eclipse não mostra o diretório de saída das suas classes portanto o  diretório classes, apesar de existir, não aparece no Package Explorer. 6.2 - Configurando no tomcat 1­) Crie uma arquivo chamado teste.jsp, com o seguinte conteúdo <html> Teste </html> 2­) Vá no menu Project, Properties. 3­) Escolha a aba do tomcat. A próxima tela pede duas informações importantes: Capítulo 6 ­ Novo projeto web ­ Página 37 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web ­  context name: qual o nome da nossa aplicação que deve ser utilizado para o cliente  acessa­lá.   Isto  é,   se  escolhermos o nome de  /jspteste  para  o  context  name,  o  usuário   irá  acessar a seguinte url: http://localhost:8080   /jspteste    Portanto repare que não se faz necessário ser o mesmo nome do projeto!!! ­  subdirectory to set as root: diretório do projeto a ser utilizado como base. Isto é se  escolhermos   o   nome  /web  como   subdiretório   raiz   teremos   que   ao   acessar   a   url  http://localhost:8080   /jspteste   /bemvindo.html   ,   a   página   do   diretório   /web/bemvindo.html   será  chamada. Isto é, o diretório /web é a base do seu projeto. 4­) Selecione /jspteste como seu context name 5­) Digite  /web como seu diretório base. 6­) Marque seu projeto como um projeto do Tomcat (checkbox). Só falta criarmos um diretório lib em WEB­INF: 7­) Clique da direita no diretório WEB­INF e crie um novo chamado lib. Capítulo 6 ­ Novo projeto web ­ Página 38 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 3­) Assim como na configuração do plugin do Tomcat, escolha o diretório /web como base  do seu projeto web. 6.8 - Em casa: configurando o tomcat sem o plugin Se fosse o caso de criar uma aplicação web sem utilizar o plugin do tomcat deveríamos  criar   um   arquivo   de   extensão   xml   com   o   nome   de   sua   aplicação   no   diretório  tomcat/conf/Catalina/localhost. Para   isso   teríamos   que   configurar   a   url  /jspteste  para   o   diretório  /home/usuario/workspace/jspteste/web/.   Queremos   também   permitir   que   o   tomcat  faça o restart de sua aplicação sempre que julgar necessário. 1­) abra os seus diretórios 2­) vá para o diretório tomcat 3-) escolha o diretório conf/Catalina/localhost 4­) crie um arquivo chamado jspteste.xml 5­) escreva o código a seguir no seu arquivo: <Context path="/jspteste" docBase="/home/usuario/workspace/jspteste/web/"  reloadable="true" /> Capítulo 6 ­ Novo projeto web ­ Página 41 Fã Caelum — http:/Avww.caelum.com.br - Java para desenvolvimento Web > Não esqueça de trocar a palavra “usuário” pelo nome do seu usuário. “80 arquivo xml de configuração do tomcat 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. Capítulo 6 - Novo projeto web - Página 42 JSP SCRIPTLET Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 7JSP – Java Server Pages “O maior prazer é esperar pelo prazer.” Gotthold Lessing ­ Nesse capítulo: ­ você aprenderá o que é JSP; ­ suas vantagens e desvantagens. 7.1 - O que é uma página JSP O   primeiro   arquivo   jsp   que   vamos   criar   é     chamado  bemvindo.jsp.  Esse   arquivo  poderia conter simplesmente código html, como o código a seguir: <html>Bem vindo</html> Afinal JSP é uma página html comum que contem também código Java –  e possui extensão jsp, claro. Assim fica claro que uma página  jsp nada mais  é  que um arquivo baseado em html.  Sejamos elegantes ao ponto de escrever um código  java na nossa primeira página. Que tal  declarar uma variável do tipo String: <% String mensagem = “Bem vindo!”; %> Simples! Para escrever código java na sua página basta escrevê­lo entre as tags <% e %>.  Esse código é chamado de scriptlet. 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. scriptlet scriptlet é 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(nome); %> A variável out é um objeto ímplicito na nossa página jsp e existem outras de acordo com a  Capítulo 7 ­ JSP – Java Server Pages ­ Página 43 capítulo 7 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 2­) Escolha o nome do projeto e aperte a tecla “F5” 3­) Crie o arquivo web/lista­scriptlet.jsp. a) Importe os pacotes necessários. <%@ page import="java.util.*,br.com.caelum.jdbc.*,br.com.caelum.jdbc.dao.*,br.com.caelum.jdbc.mode lo.*" %> b) Coloque o código para fazer a listagem. <html><ul> <% ContatoDAO dao = new ContatoDAO(); List contatos = dao.getLista(); for (int i = 0; i < contatos.size(); i++ ) { Contato contato = (Contato) contatos.get(i); %> <li><%=contato.getNome()%>, <%=contato.getEmail()%>: <%=contato.getEndereco()%></li> <% } %> </ul></html> c) Teste a url http://localhost:8080/jspteste/lista­scriptlet.jsp Capítulo 7 ­ JSP – Java Server Pages ­ Página 46 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 7.5 - Erros comuns  1­) Caso você tenha obtido a seguinte tela no seu navegador: Confira o seu ContatoDao, se ele possui os seguintes problemas de compilação: Capítulo 7 ­ JSP – Java Server Pages ­ Página 47 EL Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Isso ocorreu pois seu projeto está configurado para o Java 1.4, então devemos alterar tal  configuração para Java 5.0: a) Vá no pacote br.caelum.jdbc.dao, na classe ContatoDao Use o quick­fix do eclipse para solucionar seu problema: b) Clique na lâmpada com um x na barra esquerda do eclipse c) Escolha change workspace compliance and JRE to 5.0 7.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 em  vez de ajudar. Depois, quando o responsável pelo design gráfico da página quiser alterar algo terá que  conhecer Java para entender o que está escrito lá dentro... hmm... não parece uma boa solução. Uma idéia boa é o MVC, que será visto mais adiante neste curso. 7.7 - EL: Expression language Para remover um pouco do código java que fica na página jsp a Sun desenvolveu uma  linguagem chamada Expression Language que é interpretada pelo servlet contêiner. Nosso primeiro exemplo com essa linguagem é utilizá­la para mostrar parâmetros que o  cliente envia através de sua requisição. Por  exemplo,  se o cliente  chama a página  testaparam.jsp?idade=24 o programa deve  Capítulo 7 ­ JSP – Java Server Pages ­ Página 48 POJO JSP:USEBEAN Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Nome: <input name="nome"/> <br/> Idade: <input name="idade"/> <input type="submit"/> </form> </html> b­)  Mostrando os dois parâmetros: <html> Testando seus parametros:<br/> O nome é ${param.nome} <br/> A idade é ${param.idade} </html> c­)  Exemplo de um resultado final: 7.12 - Instanciando POJOs Como já foi comentado anteriormente, os Javabeans devem possuir o construtor público  sem argumentos (um típico Plain Old Java Object: POJO), getters e setters. Se desejarmos instanciar um objeto desse tipo em nossa página jsp podemos fazer uso  disso através de uma tag simples. Isso mesmo! Uma tag. A Sun percebeu que os programadores estavam abusando do  código Java no jsp e tentou criar algo mais “natural” (um ponto um tanto quanto questionável da  maneira  que  foi  apresentada no  início),   sugerindo  o  uso de  tags  para  substituir   trechos  de  código. O resultado final é um conjunto de tags (uma tag library, ou taglib) padrão, que possui,  entre outras tags, a funcionalidade de instanciar objetos através do construtor sem argumentos. Isso não é tão difícil. Dê uma olhada na tag a seguir: <jsp:useBean id="contato" class="br.com.caelum.jdbc.modelo.Contato"/> Agora podemos imprimir o nome do contato (que está em branco, claro...): ${contato.nome} Mas onde está  o getNome()?  A expression  language é  capaz de perceber  sozinha a  necessidade de chamar um método do tipo getter, por isso o padrão getter/setter do pojo é tão  importante hoje em dia. Desta maneira, classes como Contato são ferramentas poderosas por seguir esse padrão  Capítulo 7 ­ JSP – Java Server Pages ­ Página 51 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web pois diversas bibliotecas importantes estão baseadas nele: Hibernate, Struts, JXPath, EJB etc. Atenção Na Expression Language ${contado.nome} chamará a função getNome por padrão. Para que isso  sempre funcione devemos colocar o parâmetro em letra minúscula ou seja ${contato.Nome} não  funciona. 7.13 - Compilando os arquivos JSP Os arquivos JSPs não são compilados dentro do eclipse, por esse motivo na hora que  estamos escrevendo o JSP no eclipse não precisamos das classes do driver.  Os JSPs são transformados em uma servlet, que veremos adiante, por um compilador  JSP (o Tomcat contém um compilador embutido). Esse compilador JSP pode gerar uma código  java que é então compilado para gerar byte code diretamente para a servlet. Então, somente durante a execução de uma página jsp, quando ele é transformado em  uma servlet, que seu código java é compilado e necessitamos das classes do driver que são  procuradas no diretório lib. Capítulo 7 ­ JSP – Java Server Pages ­ Página 52 JSTL Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 8JSTL – JavaServer Pages Tag Library “Saber é compreendermos as coisas que mais nos convém.” Friedrich Nietzsche ­ Nesse capítulo, você aprenderá: ­ o que é JSTL; ­ taglib core; ­ tag c:forEach ­ tag c:import ­ diretiva include ­ tag c:if ­ tag c:url 8.1 - JSTL Seguindo a idéia de melhorar o código java que precisa de uma maneira ou outra ser  escrito na página jsp, a Sun sugeriu o uso da JavaServer Pages Standard Tag Library.... a JSTL. Observação:   Antes   de   2005   JSTL   significava     JavaServer   Pages   Standard   Template  Library. A  JSTL  é  a api  que encapsulou em  tags simples  toda a   funcionalidade que diversas  páginas   web   precisam,   como   controle   de   laços   (fors),   controle   de   fluxo   do   tipo   if   else,  manipulação de dados xml e a internacionalização de sua aplicação. Antigamente diversas bibliotecas  foram criadas por  vários grupos com funcionalidades  similares  ao  JSTL   (principalmente  ao  Core),   culminando  com a   aparição da  mesma,  numa  tentativa da Sun de padronizar algo que o mercado vê como útil. Existem ainda outras partes da JSTL, por exemplo aquela que acessa banco de dados e  permite escrever códigos sql na nossa página, mas se o designer não compreende java o que  diremos  de  SQL??? O uso  de   tal   parte  da  JSTL  é   desencorajado  exceto  em casos  muito  especiais. A JSTL foi a forma encontrada de padronizar o trabalho de milhares de programadores de páginas JSP. Antes disso muita gente programava como nos exemplos que vimos anteriormente, somente com JSPs e Javabeans, o chamado Modelo 1, que na época fazia parte dos Blueprints de J2EE da Sun (boas práticas). 8.2 - As empresas hoje em dia Muitas páginas jsp no Brasil ainda possuem grandes pedaços de scriptlets espalhados  dentro dela mesma. Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 53 capítulo 8 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web atributo chamado varStatus para a variável desejada e utilizar a propriedade count dessa variável. <c:forEach var="contato" items="${dao.lista}" varStatus="id"> <li>${id.count} ­ ${contato.nome}</li> </c:forEach> 8.6 - Exercícios 1­) Liste os contatos de ContatoDAO usando jsp:useBean e jstl. a) Crie o arquivo lista­elegante.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> </html> b) Coloque o useBean <!­­ cria a lista ­­> <jsp:useBean id="dao" class="br.com.caelum.jdbc.dao.ContatoDAO"/> c) Faça o forEach <!­­ for ­­> <c:forEach var="contato" items="${dao.lista}"> <li> nome: ${contato.nome}, email ${contato.email}, endereço ${contato.endereco} </li> </c:forEach> d) Acesse http://localhost:8080/jspteste/lista­elegante.jsp Repare que após criar uma nova página jsp não precisamos reiniciar o nosso container! 3­) scriptletss ou JSTL. Qual dos dois é mais fácil para o designer entender? 8.7 - c:out e c:set Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 56 C:SET C:IMPORT Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web Tente   substituir  ${contato.nome}  por  <c:out   value="${contato.nome}"/>.   Qual   a  diferença? A tag c:out aceita também um atributo chamado default, que indica o valor padrão caso o  valor  mencionado seja  null   (por  padrão  vazio).  Seria   impossível   fazer   isso  somente  com a  expression language (sem nenhuma gambiarra). A tag c:set permite armazenar o resultado da expressão contida no atributo value em outra  variável, para algum tipo de manipulação futura. Teste, por exemplo: <c:set var="nome" value="${contato.nome}"/> <c:out value="${nome}"/> Como você pode perceber é muito simples aprender a utilizar uma taglib, basta ler o que  ela faz, passar os argumentos corretos e pronto. Sugerimos a leitura completa da especificação da JSTL no site da sun: http://java.sun.com/products/jsp/jstl/ http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html Não precisa decorar tudo, basta ler por cima e saber o que existe e o que não existe. Quando surgir a necessidade do uso de uma dessas tags você terá ela disponível em  suas mãos. 8.8 - Mas quais são as tags da taglib core? A lista completa das tags da versão 1.1 da JSTL core pode ser facilmente compreendida: c:catch ­ bloco do tipo try/catch  c:choose  ­ bloco do tipo switch c:forEach  ­ for c:forTokens  ­ for em tokens (ex: “a,b,c” separados por vírgula) c:if  ­ if c:import  ­ import c:otherwise  ­ default do switch c:out  ­ saída c:param  ­ parâmetro c:redirect  ­ redirecionamento c:remove  ­ remoção de variável c:set  ­ criação de variável c:url  ­ veja adiante c:when  ­ teste para o switch 8.9 - Import: trabalhando com cabeçalhos e rodapés Uma pergunta que sempre aparece na vida dos programadores é a de como executar o  código de outro arquivo  jsp dentro de um primeiro arquivo  jsp,  isto é, você  quer colocar um  cabeçalho? Um rodapé? Existe uma tag da JSTL core que faz isso para você: <c:import url="outrapagina.jsp"/> Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 57 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 8.10 - Exercícios 1­) Crie uma página chamada jstl-import.jsp. a) Defina a JSTL core <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> b) Importe cabecalho.jsp <c:import url="cabecalho.jsp"/> c) Escreva alguma mensagem de texto c) Importe rodape.jsp <c:import url="rodape.jsp"/> 2­) Crie a página cabecalho.jsp e escreva: <html><head><h2>Aplicacao web basica</h2><br/></head> 3­) Crie a página rodape.jsp e escreva: <br/><hr/>Copyright Caelum</html> 4­) Teste no browser abrindo o endereço:  http://localhot:8080/jspteste/jstl­import.jsp A inclusão feita nesse exercício é dinâmica, ou seja, é feita uma requisição para a página  incluída a cada acesso e o resultado é adicionado na página atual. 8.11 - Erros Comuns Você obteve essa página ao invés da de cima? Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 58 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web A JSTL resolve esse problema, supondo que a sua aplicação se chame jspteste, o código  abaixo gera a string /jspteste/imagem/banner.jpg. <c:url value="/imagem/banner.jpg"/> 8.15 - Exercícios opcionais 1­) Crie uma página chamada jstl-url.jsp. a) Defina a JSTL core <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> b) Crie um link utilizando a tag c:url para todas as páginas jsp que você   já criou, por  exemplo: <a href="<c:url value="/bemvindo.jsp"/>"/>link para bemvindo.jsp</a> <a href="<c:url value="/lista­elegante.jsp"/>"/>link para lista­ elegante.jsp</a> <a href="<c:url value="/jstl­import.jsp"/>"/>link para jstl­import.jsp</a> <a href="<c:url value="/testaidade.jsp"/>"/>link para testaidade.jsp</a> <a href="<c:url value="/testa­titulo.jsp"/>"/>link para testa­titulo.jsp</a> 2­) Teste a sua página e veja o resultado (código fonte HTML). 8.16 - Tag <c:if> Ao usar a tag <c:if> é possível construir expressões condicionais simples. Por exemplo: <c:if test="${empty param.nome}"> Voce nao preencheu o campo nome. </c:if> A tag <c:if>  tem uma condição e um pedaço de código.  Caso a condição da  tag  for  satisfeita o pedaço de código é executado. No JSTL não existe a tag <c:else> por questões estruturais do XML. 8.17 - Exercícios 1­) Crie um arquivo jsp web/preenchenome.jsp: <html> Digite seu nome e pressione o botão:<br/> Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 61 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web <form action="testapreencheu.jsp"> Nome: <input name="nome"/> <input type="submit"/> </form> </html> 2­)   Crie um arquivo web/testapreecheu.jsp,  ele vai  checar  se no formulário anterior a  pessoa preencheu ou não o nome. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <c:if test="${empty param.nome}"> Voce nao preencheu o campo nome. </c:if> <c:if test="${not empty param.nome}"> Voce preencheu ${param.nome}. </c:if> </html>  a­) Exemplo caso a pessoa tenha preenchido: b­) Caso a pessoa não tenha preenchido: Capítulo 8 ­ JSTL – JavaServer Pages  Tag Library ­ Página 62 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 9Controle de erro “Divide as dificuldades que tenhas de examinar em tantas partes quantas for possível, para uma melhor solução.” René Descartes ­ ­ Desvantagens na utilização de blocos try/catch em um arquivo jsp; ­ Desvantagens na utilização da tag c:catch em um arquivo jsp; ­ Vantagens no controle de erros através de configuração declarativa; ­ Controle de erros através de exceptions; ­ Controle de erros através de error­codes. 9.1 - Exceptions O que acontece quando diversos pontos da nossa aplicação precisam tratar seus erros? O que acontece quando um tipo de erro que ocorre em diversos pontos deve ser alterado?  Devemos passar por todos as servlets para tratar isso? Por todos os arquivos jsp? Uma  idéia  bem simples  seria   colocar  em  toda  página   jsp  um código   imenso  do  tipo  try/catch como no exemplo a seguir do nosso já conhecido lista­scriptlet.jsp: <%@ page import="java.util.*,br.com.caelum.jdbc.*,br.com.caelum.jdbc.dao.*,br.com.caelum.jdbc.mode lo.*" %> <html><ul> <% try { ContatoDAO dao = new ContatoDAO(); List contatos = dao.getLista(); for (int i = 0; i < contatos.size(); i++ ) { Contato contato = (Contato) contatos.get(i); %> <li><%=contato.getNome()%>, <%=contato.getEmail()%>: <%=contato.getEndereco()%></li> <% } } catch(SQLException ex) { %> Ocorreu algum erro ao acessar o banco de dados. <% } %> </ul></html> Basta olhar o código acima para perceber que não é o melhor caminho. Imagina como  seria   tratar   os   erros   dessa   maneira   em  toda  sua   aplicação?   E   se   a   mensagem   de   erro  Capítulo 9 ­ Controle de erro ­ Página 63 capítulo 9 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web É muito simples controlar erros em páginas jsp. Imagine a página a seguir que simula um  erro de conexão ao banco de dados: <html> <%  java.sql.DriverManager.getConnection("jdbc:teste:invalido","usuario","senha");  %> </html> Agora que já configuramos, quando ocorrer uma SQLException, a página erro.jsp será  mostrada se nada for feito pelo programador:   não precisamos fazer NADA na página jsp que  pode gerar um erro. Simples não? Quem trata o erro é  o servlet  conteiner,  que  lê  o arquivo web.xml e envia o fluxo da  requisição para a página de erro indicada naquele arquivo. 9.8 - Exercícios 1­) Crie o arquivo testa­erro.jsp (repare que na prática você não irá criar esse arquivo) <html> <%  java.sql.DriverManager.getConnection("jdbc:teste:invalido");  %> </html> a­) Teste a url http://localhost:8080/jspteste/testa­erro.jsp  2­) Crie o arquivo erro.jsp. <%@ page isErrorPage="true" %> <html> <h1>Um erro ocorreu.</h1><br/> ${pageContext.errorData.throwable} </html> Capítulo 9 ­ Controle de erro ­ Página 66 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 3­) Altere o arquivo web.xml e adicione uma error­page: a) exception­type: java.sql.SQLException b) location: /erro.jsp <error­page> <exception­type>java.sql.SQLException</exception­type> <location>/erro.jsp</location> </error­page> 5­) Teste a url http://localhost:8080/jspteste/testa­erro.jsp 6­)   Para   generalizar   os   erros   que   são   direcionados   para   erro.jsp   mapeie  java.lang.Exception para a sua página de erro. <error­page> <exception­type>java.lang.Exception</exception­type> <location>/erro.jsp</location> </error­page> Obs: O Tomcat 5.5.17 tem um bug fazendo o exercício não funcionar. 9.9 - Tratamento de outros erros Para   muitas   aplicações   é   importante   mostrar   mensagens   de   erro   padronizadas,   por  exemplo quando o usuário tenta acessar uma página que não existe, ele deve receber como  resposta uma página elegante indicando que não foi possível encontrar a página requisitada,  incluindo o erro 404 (que faz parte do protocolo http). Para fazer isso iremos definir uma nova error­page no arquivo web.xml mas ao invés de  colocar  o  exception­type   iremos  utilizar  a   tag  error­code.  Será  necessário  criar  uma página  separada  para  o  erro  404  pois  a  que criamos  anteriormente  assumia  a  existência  de uma  exception, que não é esse caso: <error­page> <error­code>404</error­code> <location>/paginaNaoEncontrada.jsp</location> </error­page> Capítulo 9 ­ Controle de erro ­ Página 67 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 9.10 - Erros comuns No exercício anterior é muito comum errar nos seguintes detalhes: 1­) Errar algo na página de erro (como o texto da expression language), e visualizar a  página de erro normal do tomcat. 2­) Esquecer a / no mapeamento da página de erro e ver uma página do tipo 404. Porque? Acontece que quando você inicou o tomcat, ele percebeu que seu xml é inválido e não  inicializou seu contexto. Este é um bom momento para você pegar a prática de, sempre que  reinicializar o seu tomcat, verificar se aparece alguma exception no console do mesmo e, se  aparecer, lê­la. Mais importante ainda é aprender a ler exceptions sem a ajuda de terceiros. O nome do  erro, a mensagem, e as linhas onde ela ocorreu na pilha de execução entregam todas as dicas  para você descobrir o que aconteceu – na maior parte das vezes. Verifique seu arquivo de console: Página de erro erro.jsp não começa com uma /, isto é, ele está dizendo exatamente o seu  erro! 9.11 - Exercícios 1­) Trate o erro tipo 404 na sua aplicação. Capítulo 9 ­ Controle de erro ­ Página 68 SERVLET HTTPSERVLET SERVLET REQUEST RESPONSE HTTP CGI Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 10Servlets “Vivemos todos sob o mesmo céu, mas nem todos temos o mesmo horizonte.” Konrad Adenauer ­ Neste capítulo você irá aprender a criar pequenos objetos que funcionam como aplicações web. 10.1 - Servlet Uma servlet funciona como um pequeno servidor (servidorzinho em inglês) que recebe  chamadas de diversos clientes. Uma primeira idéia da servlet seria que cada uma delas é responsável por uma página,  sendo que ela lê dados da requisição do cliente e responde com outros dados (html, gif etc).  Como no Java tentamos sempre que possível trabalhar orientado a objetos, nada mais natural  que uma servlet seja representada como um objeto. Resumindo, cada servlet é um objeto java que recebe tais requisições (request) e retorna  algo (response), como por exemplo uma página html ou uma imagem do formato jpeg. Diversas   requisições  podem ser  feitas à uma mesma servlet ao mesmo  tempo em um único servidor,  por   isso  ela é mais rápida que um programa CGI  comum. A especificação da servlet cita  algumas vantagens da mesma sobre o  antigo CGI. O diagrama ao  lado mostra três  clientes   acessando   o   mesmo   servidor  web/contêiner   de   servlets   através   do  protocolo http. A   página   a   ser   retornada   pela  servlet  pode  ser  um  jpeg,  um gif,  um  arquivo html etc:  arquivos de  texto  ou  simplesmente binários. O   comportamento   das   servlets   que   iremos   ver   neste   capítulo   foi   definido   na   classe  HttpServlet do pacote javax.servlet. Eles se aplicam às servlets que trabalham através do  protocolo Http. A interface Servlet é a que define exatamente como uma servlet funciona, mas não é  necessariamente  o  que  vamos  utilizar  neste  capítulo  uma vez  que ela  possibilita  o  uso  de  qualquer protocolo baseado em requisições e respostas. Capítulo 10 ­ Servlets ­ Página 71 capítulo 10 Cliente IE Servidor Web ­­­­­­­­­­­­­­­­ Servlet  Contêiner recebe  requisições via  http Cliente  Firefox Cliente Opera SERVICE Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web É  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, justamente para obter  as vantagens mencionadas anteriormente contra o uso de CGI. O funcionamento básico de uma servlet compreende: ­ a inicialização da mesma (veremos com mais  detalhes mais adiante) ­   chamadas   a   métodos   de   serviço,   essas  chamadas   passam   dois   argumentos   para   o   método  service, a requisição que o cliente faz e a resposta que  permite enviar dados para o mesmo: void service(HttpServletRequest req,  HttpServletResponse res); ­   finalização   (veremos   com   detalhes   mais  adiante),  O   exemplo   a   seguir   mostra   uma   servlet  implementando o método de service. Um primeiro  exemplo  de  método  service  seria  aquele que não executa nada e mostra uma mensagem  de bem vindo para o usuário. Para isso precisamos “alterar” a resposta que a servlet enviará  para o cliente. O writer  de saída do cliente  pode ser  obtido através do método getWriter  da variável  response e então fica simples utilizar um PrintWriter para imprimir algo como resposta para o  cliente: protected void service(HttpServletRequest request,      HttpServletResponse response) throws ServletException,  IOException { // recebe o writer PrintWriter out = response.getWriter(); // escreve o texto out.println("<html>"); out.println("Caelum explica"); out.println("</html>"); } Servlet x CGI ­ fica na memória entre requisições, não precisa ser reinstanciado ­ o nível de segurança e permissão de acesso pode ser controlado ­ em CGI, cada cliente é representado por um processo, enquanto que com Servlets, cada cliente é  representado por uma linha de execução Esse  capítulo  está   focado  na  HttpServlet,  um  tipo  que  gera  aplicações  web  baseadas  no  protocolo HTTP, mas vale lembrar que a api não foi criada somente para este protocolo, podendo  ser facilmente extendida para outros. Capítulo 10 ­ Servlets ­ Página 72 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 10.2 - A estrutura de diretórios A estrutura de diretórios é a mesma utilizada em uma aplicação que usava páginas jsp e,  portanto, usaremos o mesmo projeto. 10.3 - Mapeando uma servlet no web.xml Para fazer um mapeamento de uma URL específica para uma servlet é necessário usar o  arquivo web.xml. Uma vez que chamar a servlet pelo pacote e nome da classe acabaria criando URLs  estranhas e complexas, é comum mapear, por exemplo, uma servlet como no exemplo, chamada  OiMundo para o nome servletDeTeste: <servlet> <servlet­name>servletDeTeste</servlet­name> <servlet­class>br.com.caelum.servlet.OiMundo</servlet­class> </servlet> E agora colocar o nome servletDeTeste para a url /oi: <servlet­mapping> <servlet­name>servletDeTeste</servlet­name> <url­pattern>/oi</url­pattern> </servlet­mapping> Portanto são necessários dois passos para mapear uma servlet para uma url: 1­) Definir o nome e classe da servlet 2­) Usando o nome da servlet, definir a url Agora a servlet pode ser acessada através das seguintes urls: http://localhost:8080/jspteste/oi Assim que o arquivo web.xml e a classe de servlet  de exemplo  forem colocados nos  diretórios corretos basta configurar o tomcat para utilizar o diretório de base como padrão para  uma aplicação web. 10.4 - Exercícios 1­) Crie a servlet OiMundo no pacote correto. Escolha o menu File, New, Class. Capítulo 10 ­ Servlets ­ Página 73 nome url Caelum — http:/Auww.caelum.com.br - Java para desenvolvimento Web Apache Tomcat/5.5. 12 - Error report - Mozilla Firefox File Edit view Go Bookmarks Tools Help <a ” E> ” & fi E http:;Jlocalhost:s080/spteste/oi 4 Getting Started El Latest Headlines HTTP Status 404 - /jspteste/oi BT status report CEEEEFO isptestejoi FEBRE The requested resource (fspteste/oi) is not available, Apache Tomcat/5.5.12 Done 2-) Digitar errado o nome do pacote da sua servlet: <servlet-class>br .caelum. servlet . OiMundo</servlet-class> Apache Tomcat/5.5.12 - Error report - Mozilla Firefox Ele Edit view Go Bookmarks Tools Help << - E» , E [$i [E httpillocalhost:s080/jspteste/oi 4 Getting started El Latest Headlines Lo EE) BETH Exception report LEEFEETE EESERREI The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet ServletException: Wrapper cannot find servlet class br.caelum.servlet.OiMundo or é org. apache. catalina.valves .ErrorReportvalve. invoke (ErrorReportValve. java: 105) org. apache, catalina. connector. Coyoteadapter. service (CoyoteAdapter. java: 148) org apache. coyote.http1l.HttpllProcessor. process (HttpllProcessor. java: B68) org apache, coyote.http11.Httpl1lBaseProtocolgHttp11ConnectionHandler, processConnection (Hj uu 3-) Esquecer de colocar o nome da classe no mapeamento da servlet: <servlet-class>br .com.caelum. servlet</servlet-class> Capítulo 10 - Servlets - Página 76 INIT DESTROY Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 10.6 - Init e Destroy Toda servlet deve possuir um construtor sem argumentos para que o contêiner possa criá­ la. O servlet contêiner inicializa a servlet com o método init 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. Na inicialização de uma servlet , quando parâmetros podem ser lidos e variáveis  comuns a todas as requisições devem ser inicializadas. Por exemplo, conexões ao banco  de dados são estabelecidas nesse momento: void init (ServletConfig config); Na finalização, quando os recursos devem ser liberados: void destroy(); O método init e destroy, quando reescritos, são obrigados a chamar o super.init() e  super.destroy()   respectivamente.   Isso   acontece   pois   um   método   é   diferente   de   um  construtor,  quando estendemos uma classe  e criamos o nosso próprio  construtor  da  classe   filha,   ela   chama   o   construtor   da   classe   pai   sem   argumentos,   preservando   a  garantia da chamada de um construtor. Supondo que o método init (ou destroy) executa alguma tarefa fundamental em sua classe  pai, se você esquecer de chamar o super terá problemas. O exemplo a seguir mostra uma servlet implementando os método de inicialização e  finalização. Os métodos init e destroy podem ser bem simples (lembre­se que são opcionais): Capítulo 10 ­ Servlets ­ Página 77 OUTPUTSTRE AM Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web package br.com.caelum.servlet; //imports aqui public class OiMundo extends HttpServlet { public void destroy() { super.destroy(); log("Destruindo a servlet"); } public void init() throws ServletException { super.init(); log("Iniciando a servlet"); } // método service aqui } 10.7 - Curiosidades do mapeamento de uma servlet Existe outra maneira de configurar servlets no web.xml. O segundo tipo de mapping é o  que especifica diversas urls para apontar para a mesma a servlet. Se   marcarmos   o   url­pattern   como  /teste/*,   toda   url   que   acessar   o   padrão  http://localhost:PORTA/jspteste/teste/* irá acessar nossa servlet: <servlet­mapping> <servlet­name>servletDeTeste</servlet­name> <url­pattern>/teste/*</url­pattern> </servlet­mapping> Outra opção que o web.xml nos dá é a de marcar a servlet para inicialização junto com a  aplicação web. Para isto basta usar uma tag chamada  load-on-startup  e atribuir um valor  não negativo. <servlet> <servlet­name>servletDeTeste</servlet­name> <servlet­class>br.com.caelum.servlet.OiMundo</servlet­class> <load­on­startup>1</load­on­startup> </servlet> Recurso Avançado: load­on­startup As   servlets   marcadas   com   números   menores   serão   inicializadas   antes   que   as   de   números  maiores. Servlets marcadas com o mesmo número não possuem uma ordem de inicialização que  seja definida pela especificação. 10.8 - OutputStream x PrintWriter No  nosso  primeiro  exemplo  de  servlet   usamos   o  método  getWriter  para   acessar  um  PrintWriter do Java. Para retornar algo ao cliente, podemos usar a OutputStream ou o PrintWriter que é  retornado através do objeto response. PrintWriter writer = response.getWriter(); OutputStream stream = response.getOutputStream(); Também   é   possível   redirecionar   o   usuário   para   outra   página   através   do   método  Capítulo 10 ­ Servlets ­ Página 78 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web writer.println("<html>"); writer.println("Caelum explica o parametro: " +  request.getParameter(“idade”)); writer.println("</html>"); } 4­) Abra o arquivo web.xml e mapeie a servlet TestaParametros para a url /testa­idade. <servlet> <servlet­name>idade</servlet­name> <servlet­class>br.com.caelum.servlet.TestaParametros</servlet­class> </servlet> <servlet­mapping> <servlet­name>idade</servlet­name> <url­pattern>/testa­idade</url­pattern> </servlet­mapping> 5­) Crie um arquivo chamado testa­get.jsp: <html><body> <a href=”/jspteste/testa­idade?idade=24”>Testa Parâmetros</a> </body></html> 6­) Crie um arquivo chamado testa­post.jsp: <html><body> <form action=”/jspteste/testa­idade” method=”POST”> <input type=”text” name=”idade” value=“24”/> <input type=”submit” value=”Enviar”/> </form> </body></html> 7­) Teste a url http://localhost:8080/jspteste/testa­get.jsp Capítulo 10 ­ Servlets ­ Página 81 Fã Caelum — http:/Avww.caelum.com.br - Java para desenvolvimento Web File Edit view Go Bookmarks Tools Help > a É) [EA httpsnlocalhost:so8orjsptesteftesta-idade?id AP Getting started El Latest Headlines Bco [E Caelum explica o parâmetro: 24 Done 8-) Teste a url http://localhost:: - x Ele Edit View Go Bookmarks Tools Help e-»- & A) [FEI httpinlocalhost:s080fisptestejtesta-postjsp 4 Getting Started Bl Latest Headlines as| Enviar O co [EL Done Capítulo 10 - Servlets - Página 82 DOGET DOPOST Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web 10.11 - Exercícios opcionais 1­) Crie uma nova servlet que utiliza o método getParameterNames para mostrar todos os  parâmetros que foram enviados. Todos os parâmetros O   método   request.getParameterNames()   retorna   uma   Enumeration   com   todos   os   nomes   de  parâmetros enviados. 10.12 - doGet, doPost e outros Por causa da arquitetura da API das servlets, o método service é o ponto inicial de uma  nova   requisição   e   delega   o   processo   para   o   representante   adequado,   de   acordo   com   a  requisição. A implementação de nenhum dos métodos abaixo é obrigatória se a sua servlet extender  a classe HttpServlet. Outros  dois  métodos  comuns  para  programadores   iniciantes  na  api   de  servlets  e  no  protocolo http são os que tratam requisiões especifícas de um método como o GET ou o POST: ­ doGet – responsável pelos métodos GET protected void doGet(HttpServletRequest, HttpServletResponse) throws  ServletException,  IOException; ­ doPost – responsável pelo POST protected void doPost(HttpServletRequest,HttpServletResponse) throws  ServletException,  IOException; Capítulo 10 ­ Servlets ­ Página 83 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web <servlet> <servlet­name>conversor</servlet­name> <servlet­class>br.com.caelum.servlet.TestaConversaoParametros </servlet­class> </servlet> <servlet­mapping> <servlet­name>conversor</servlet­name> <url­pattern>/conversor­idade</url­pattern> </servlet­mapping> 4­) Crie um arquivo chamado converte­idade.jsp <html><body> <form action="/jspteste/conversor­idade" method="POST"> <input type="text" name="idade" value="32"/> <input type="submit" value="Enviar"/> </form> </body></html> 5­) Teste a url http://localhost:8080/jspteste/converte­idade.jsp 6­) O que acontece ao passar um número inválido? a­) Um exemplo de número inválido: 10.15 - Exercícios opcionais 1­) Tente utilizar a classe SimpleDateFormat para fazer o parsing de datas. 10.16 - Variáveis membro Nosso próximo exemplo ilustra um exemplo simples de contador utilizando uma variável  Capítulo 10 ­ Servlets ­ Página 86 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web membro de uma servlet. Da maneira que estamos trabalhando, a especificação da servlet garante que só existirá  uma instância dessa servlet por máquina, portanto somente uma instância no total a não ser que  você rode sua aplicação em um cluster. Baseado nesse fato vamos criar uma variável  membro chamada contador para fixar a  idéia de que somente uma instância dessa servlet existirá na memória e que ela sobrevive a  requisições: suas variáveis membro não são “limpadas” após o término das requisições. Escolhendo uma variável do tipo int para nosso contador, nossa servlet deve: a) estender HttpServlet b) conter uma variável membro do tipo int, chamada contador c) a cada requisição somar um no contador e imprimir o número do visitante E, a partir dos três pontos acima, devemos testar as nossas urls diversas vezes, fechar o  browser e tentar novamente etc. Baseando­se no nosso primeiro exemplo vejamos o método service: protected void service(HttpServletRequest request,      HttpServletResponse response) throws ServletException, IOException { contador++; // algum problema aqui? // recebe o writer PrintWriter out = response.getWriter(); // escreve o texto out.println("<html>"); out.println("Caelum explica: " + contador + ” visita."); out.println("</html>"); } 10.17 - Exercícios 1­) Crie a servlet Contador no pacote correto. Escolha o menu File, New, Class. Capítulo 10 ­ Servlets ­ Página 87 Caelum – http://www.caelum.com.br ­ Java para desenvolvimento Web a) Estenda HttpServlet. public class Contador extends HttpServlet { } b) Utilize o CTRL+SHIFT+O para importar HttpServlet. c) Adicione uma variável membro do tipo int, chamada contador. private int contador = 0; d) Escreva a estrutura do método service. Muito cuidado com o nome dos argumentos etc. @Override protected void service(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException { } e) Escreva o código do método service. protected void service(HttpServletRequest request,      HttpServletResponse response) throws ServletException, IOException { contador++; // algum problema aqui? // recebe o writer Capítulo 10 ­ Servlets ­ Página 88
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved