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 exinstrutores 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ódigofonte 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, sintase 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 FJ31 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 FJ31, 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 entidaderelacional 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) Usea 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, recomendase 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 apachetomcat. 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/WEBINF/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: Lembrese 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 acessalá. 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 WEBINF: 7) Clique da direita no diretório WEBINF 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 (ServerSide 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/listascriptlet.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/listascriptlet.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 quickfix 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 listaelegante.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/listaelegante.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/jstlimport.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="/listaelegante.jsp"/>"/>link para lista elegante.jsp</a> <a href="<c:url value="/jstlimport.jsp"/>"/>link para jstlimport.jsp</a> <a href="<c:url value="/testaidade.jsp"/>"/>link para testaidade.jsp</a> <a href="<c:url value="/testatitulo.jsp"/>"/>link para testatitulo.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 errorcodes. 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 listascriptlet.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 testaerro.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/testaerro.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 errorpage: a) exceptiontype: java.sql.SQLException b) location: /erro.jsp <errorpage> <exceptiontype>java.sql.SQLException</exceptiontype> <location>/erro.jsp</location> </errorpage> 5) Teste a url http://localhost:8080/jspteste/testaerro.jsp 6) Para generalizar os erros que são direcionados para erro.jsp mapeie java.lang.Exception para a sua página de erro. <errorpage> <exceptiontype>java.lang.Exception</exceptiontype> <location>/erro.jsp</location> </errorpage> 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 errorpage no arquivo web.xml mas ao invés de colocar o exceptiontype iremos utilizar a tag errorcode. 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: <errorpage> <errorcode>404</errorcode> <location>/paginaNaoEncontrada.jsp</location> </errorpage> 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> <servletname>servletDeTeste</servletname> <servletclass>br.com.caelum.servlet.OiMundo</servletclass> </servlet> E agora colocar o nome servletDeTeste para a url /oi: <servletmapping> <servletname>servletDeTeste</servletname> <urlpattern>/oi</urlpattern> </servletmapping> 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 (lembrese 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 urlpattern como /teste/*, toda url que acessar o padrão http://localhost:PORTA/jspteste/teste/* irá acessar nossa servlet: <servletmapping> <servletname>servletDeTeste</servletname> <urlpattern>/teste/*</urlpattern> </servletmapping> 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> <servletname>servletDeTeste</servletname> <servletclass>br.com.caelum.servlet.OiMundo</servletclass> <loadonstartup>1</loadonstartup> </servlet> Recurso Avançado: loadonstartup 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 /testaidade. <servlet> <servletname>idade</servletname> <servletclass>br.com.caelum.servlet.TestaParametros</servletclass> </servlet> <servletmapping> <servletname>idade</servletname> <urlpattern>/testaidade</urlpattern> </servletmapping> 5) Crie um arquivo chamado testaget.jsp: <html><body> <a href=”/jspteste/testaidade?idade=24”>Testa Parâmetros</a> </body></html> 6) Crie um arquivo chamado testapost.jsp: <html><body> <form action=”/jspteste/testaidade” 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/testaget.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> <servletname>conversor</servletname> <servletclass>br.com.caelum.servlet.TestaConversaoParametros </servletclass> </servlet> <servletmapping> <servletname>conversor</servletname> <urlpattern>/conversoridade</urlpattern> </servletmapping> 4) Crie um arquivo chamado converteidade.jsp <html><body> <form action="/jspteste/conversoridade" 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/converteidade.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. Baseandose 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