caelum - cin.ufpe.brbnm/courses/caelumf21.pdf · caelum "mata o tempo e matarás a tua carreira"...

231
Caelum "Mata o tempo e matarás a tua carreira" Bryan Forbes Sobre a empresa A Caelum atua no mercado desde 2002, desenvolvendo sistemas e prestando consultoria em diversas áreas, sempre à luz da plataforma Java. Foi fundada por profissionais que se encontraram no Brasil após experiências na Alemanha e Itália, desenvolvendo sistemas de grande porte, com integração aos mais variados ERPs. Seus profissionais já publicaram diversos artigos nas revistas brasileiras sobre Java, artigos acadêmicos e são presença constante nos eventos de 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 tecnologias open source que não são abordadas pela Sun. O material utilizado foi elaborado durante os cursos de verão de Java na Universidade de São Paulo, em janeiro de 2004, pelos instrutores da Caelum. Em 2008, a empresa foca seus esforços em duas grandes áreas: Consultoria, mentoring e coaching de desenvolvimento Treinamento com intuito de formação Sobre a apostila Esta apostila da Caelum visa ensinar Java de uma maneira elegante, mostrando apenas o que é necessário e quando é necessário, no momento certo, 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 seu conteúdo não seja alterado e que seus créditos sejam mantidos. Ele não pode ser usado para ministrar qualquer outro curso, porém pode ser utilizado como referência e material de apoio. Caso você esteja interessado em usá-lo para fins comerciais, entre em contato com a empresa. Atenção: Você pode verificar a versão da apostila no fim do índice. Não recomendamos imprimir a apostila que você receber de um amigo ou pegar por e-mail, pois atualizamos constantemente esse material, quase que mensalmente. Vá até nosso site e veja a última versão. www.caelum.com.br

Upload: duongnhan

Post on 24-Aug-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • Caelum"Mata o tempo e matars a tua carreira"

    Bryan Forbes

    Sobre a empresa

    A Caelum atua no mercado desde 2002, desenvolvendo sistemas e prestando consultoria em diversasreas, sempre luz da plataforma Java. Foi fundada por profissionais que se encontraram no Brasil apsexperincias na Alemanha e Itlia, desenvolvendo sistemas de grande porte, com integrao aos mais variadosERPs. Seus profissionais j publicaram diversos artigos nas revistas brasileiras sobre Java, artigos acadmicose so presena constante nos eventos de tecnologia.

    Em 2004, a Caelum criou uma gama de cursos que rapidamente ganharam grande reconhecimento nomercado. Os cursos foram elaborados por ex-instrutores da Sun que queriam trazer mais dinamismo e aplicaras ferramentas e bibliotecas utilizadas no mercado, tais como Eclipse, Hibernate, Struts, e outras tecnologiasopen source que no so abordadas pela Sun. O material utilizado foi elaborado durante os cursos de vero deJava na Universidade de So Paulo, em janeiro de 2004, pelos instrutores da Caelum.

    Em 2008, a empresa foca seus esforos em duas grandes reas:

    Consultoria, mentoring e coaching de desenvolvimento

    Treinamento com intuito de formao

    Sobre a apostila

    Esta apostila da Caelum visa ensinar Java de uma maneira elegante, mostrando apenas o que necessrioe quando necessrio, no momento certo, poupando o leitor de assuntos que no costumam ser de seuinteresse em determinadas fases do aprendizado.

    A Caelum espera que voc aproveite esse material e que ele possa ser de grande valia para auto-didatas eestudantes. Todos os comentrios, crticas e sugestes sero muito bem-vindos.

    O material aqui contido pode ser publicamente distribudo, desde que seu contedo no seja alterado e queseus crditos sejam mantidos. Ele no pode ser usado para ministrar qualquer outro curso, porm pode serutilizado como referncia e material de apoio. Caso voc esteja interessado em us-lo para fins comerciais,entre em contato com a empresa.

    Ateno: Voc pode verificar a verso da apostila no fim do ndice. No recomendamos imprimir a apostilaque voc receber de um amigo ou pegar por e-mail, pois atualizamos constantemente esse material, quase quemensalmente. V at nosso site e veja a ltima verso.

    www.caelum.com.br

  • ndice

    1 Como Aprender Java 1

    1.1 O que realmente importante? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.2 Sobre os exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.3 Tirando dvidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    1.4 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    2 JDBC - java.sql 3

    2.1 Executando o Eclipse pela primeira vez . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2.2 O banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2.3 Sockets: uma idia inocente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2.4 A conexo em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2.5 Fbrica de Conexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.6 Solues para viagem Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.7 Exerccios - ConnectionFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.8 A tabela de exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    2.9 Javabeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    2.10 Exerccios - Contato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    2.11 Inserindo dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    2.12 DAO Data Access Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    2.13 Exerccios - ContatoDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    2.14 Exerccios Opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    2.15 Pesquisando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    i

  • 2.16 Exerccios - Listagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    2.17 Um pouco mais... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    2.18 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    2.19 Outros mtodos para o seu DAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    2.20 Exerccios opcionais - Alterar e remover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    3 O que J2EE? 29

    3.1 Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    3.2 APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    3.3 Implementaes compatveis com a especificao . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    4 Servlet Container 31

    4.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    4.2 Aplicaes web no Java EE e Servlet Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    4.3 Instalando o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    4.4 Sobre o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    4.5 Instalando o Tomcat em casa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    4.6 Outra opo: Jetty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    5 O eclipse e seus plugins 35

    5.1 O plugin WTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    5.2 Configurando o Tomcat no WTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    6 Novo projeto web 39

    6.1 Novo projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    6.2 Anlise do resultado final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    6.3 Exerccios: primeira pgina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    6.4 Para saber mais: configurando o Tomcat sem o plugin . . . . . . . . . . . . . . . . . . . . . . . . 44

    7 JSP - JavaServer Pages 45

    7.1 O que uma pgina JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    7.2 Exerccios: Primeiro JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    7.3 Listando os contatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    7.4 Exerccios: Lista de contatos com scriptlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    ii

  • 7.5 HTML e Java: eu no quero cdigo Java no meu JSP! . . . . . . . . . . . . . . . . . . . . . . . . 49

    7.6 EL: Expression language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    7.7 Exerccios: parmetros com EL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    7.8 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    7.9 Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    7.10 Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    7.11 Instanciando POJOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    7.12 Para saber mais: Compilando os arquivos JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    8 JSTL - JavaServer Pages Tag Library 54

    8.1 JSTL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    8.2 As empresas hoje em dia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    8.3 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    8.4 Cabealho para a JSTL core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    8.5 For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    8.6 Exerccios: forEach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    8.7 Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    8.8 c:out e c:set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    8.9 Mas quais so as tags da taglib core? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    8.10 Import: trabalhando com cabealhos e rodaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    8.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    8.12 Erros Comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    8.13 Incluso esttica de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    8.14 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    8.15 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    8.16 Trabalhando com links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    8.17 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    8.18 c:if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    8.19 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    iii

  • 9 Controle de erro 65

    9.1 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    9.2 JSTL a soluo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    9.3 Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    9.4 Quando acontece um erro em uma pgina JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    9.5 Pgina de erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    9.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    9.7 Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    10 Servlets 70

    10.1 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    10.2 A estrutura de diretrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    10.3 Mapeando uma servlet no web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    10.4 Exerccios: Servlet OiMundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    10.5 Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    10.6 Init e Destroy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    10.7 Curiosidades do mapeamento de uma servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

    10.8 OutputStream x PrintWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    10.9 Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    10.10Exerccios: TestaParametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

    10.11Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    10.12doGet, doPost e outros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    10.13Converso de parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    10.14Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    10.15Variveis membro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    10.16Exerccios: Contador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    10.17HTML e Java: eu no quero cdigo html na minha servlet! . . . . . . . . . . . . . . . . . . . . . . 85

    10.18Como funciona uma pgina JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    10.19Web archive (.war) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    10.20Exerccios: Deploy com war . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    10.21Quando acontece um erro em uma servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    10.22O try e catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    iv

  • 10.23Tratamento padro de erros modo declarativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    10.24Configurando a pgina de erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    10.25Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    10.26Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    10.27Tratamento de outros erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    10.28Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    10.29Outro erro comum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    10.30Servlet para adicionar contatos no banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    10.31Exerccio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    10.32Exerccios Opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    11 Servlet e JSP API 98

    11.1 Propriedades de pginas JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    11.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    11.3 Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    11.4 Configurao de filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    11.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    11.6 Entendendo os filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    11.7 Exerccio Opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    12 Model View Controller 102

    12.1 Servlet ou JSP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    12.2 Request dispatchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    12.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

    12.4 Melhorando o processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

    12.5 Retomando o design pattern Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

    13 Construindo um Framework MVC 108

    13.1 Nossa interface de execuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    13.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    13.3 Criando um controlador e um pouco mais de reflection . . . . . . . . . . . . . . . . . . . . . . . . 109

    13.4 Configurando o web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    13.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    v

  • 13.6 Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

    13.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

    13.8 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    13.9 Model View Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    13.10Lista de tecnologias: camada de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

    13.11Lista de tecnologias: camada de visualizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    13.12MVC 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    14 Struts Framework 117

    14.1 Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    14.2 Configurando o Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    14.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    14.4 Uma ao Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    14.5 Configurando a ao no struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    14.6 Exerccios: TesteSimplesAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    14.7 Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    14.8 Pesquisando um banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    14.9 Criando a ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    14.10O arquivo WebContent/lista.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    14.11ListaContatos no struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    14.12Exerccio: ListaContatosAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    14.13Resultado condicional com o Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    14.14Exerccios: listagem vazia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    14.15Resultado do struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

    14.16Novos contatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

    14.17Formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

    14.18Mapeando o formulrio no arquivo struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . 132

    14.19Exerccio: ContatoForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

    14.20Erro comum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

    14.21Lgica de Negcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

    14.22Exerccio: AdicionaContatoAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

    14.23Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

    vi

  • 14.24Arquivo de mensagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

    14.25Exerccios: Mensagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    14.26Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

    14.27Validando os campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

    14.28Exerccio: validao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

    14.29Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    14.30Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    14.31Limpando o formulrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    14.32Exerccios: scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

    14.33Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

    14.34O mesmo formulrio para duas aes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    14.35Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    14.36Struts-logic taglib: um exemplo antigo de for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    14.37Para saber mais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    15 Autenticao, cookies e sesso 148

    15.1 Preparando um sistema de login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

    15.2 Nossas classes: Funcionario e FuncionarioDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

    15.3 Passo 1: Formbean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

    15.4 Passo 2: A pgina de login: formulario-login.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

    15.5 Exerccios: formulrio de login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    15.6 A ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

    15.7 A ao no struts-config.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

    15.8 ok.jsp e erro.jsp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

    15.9 Exerccios: LoginAction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

    15.10Erro comum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    15.11Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    15.12Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    15.13Sesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

    15.14Configurando o tempo limite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

    15.15Registrando o usurio logado na sesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

    15.16Exerccios: autorizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    15.17Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

    vii

  • 16 Hibernate 160

    16.1 Vantagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    16.2 Criando seu projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    16.3 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

    16.4 Configurando a classe/tabela Produto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

    16.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

    16.6 Propriedades do banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

    16.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

    16.8 Configurando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

    16.9 Criando as tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    16.10Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

    16.11Dica: log do Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

    16.12HibernateUtil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    16.13Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    16.14Erros comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    16.15Salvando novos objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    16.16Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    16.17Buscando pelo id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

    16.18Criando o ProdutoDAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

    16.19Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

    16.20Buscando com uma clusula where . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    16.21ProdutoDAO: Listar tudo e fazer paginao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    16.22Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

    16.23Exerccios para o preguioso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

    16.24Exerccio opcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

    17 VRaptor 180

    17.1 Eu no quero o que eu no conheo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

    17.2 Vantagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    17.3 Vraptor 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    17.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    17.5 Internacionalizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

    viii

  • 17.6 A classe de modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

    17.7 Minha primeira lgica de negcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

    17.8 Como configurar a minha lgica? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

    17.9 E o JSP com o formulrio? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    17.10E a pgina final? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    17.11Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

    17.12A lista de produtos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

    17.13Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    17.14Velocity, Freemaker e Sitemesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    17.15Configuraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    17.16Um pouco mais... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    17.17Plugin para o Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    17.18Pequenos exemplos de simplicidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    18 E agora? 192

    18.1 Certificao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

    18.2 Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

    18.3 Revistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

    18.4 Grupo de Usurios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

    18.5 Falando em Java - Prximos mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

    19 Apndice A - Servlet e JSP API 194

    19.1 Incio e trmino da sua aplicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

    19.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

    19.3 getServletContext() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

    19.4 Exerccios opcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

    19.5 Acessando a aplicao no JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

    19.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

    19.7 Configurao de uma servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

    19.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

    19.9 Descobrindo todos os parmetros do request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

    ix

  • 20 Apndice B - Design Patterns 200

    20.1 Factory exemplo de cache de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

    20.2 Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

    20.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    20.4 Um pouco mais... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

    21 Respostas dos Exerccios 205Verso: 10.9.18

    x

  • CAPTULO 1

    Como Aprender Java

    Homens sbios fazem provrbios, tolos os repetem Samuel Palmer

    1.1 - O que realmente importante?

    Muitos livros, ao passar dos captulos, mencionam todos os detalhes da linguagem juntamente com seusprincpios bsicos. Isso acaba criando muita confuso, em especial pois o estudante no consegue distinguirexatamente o que importante aprender e reter naquele momento daquilo que ser necessrio mais tempo eprincipalmente experincia para dominar.

    Se uma classe abstrata deve ou no ter ao menos um mtodo abstrato, se o if s a ceitar argumentosbooleanos e todos os detalhes de classes internas realmente no devem ser preocupaes para aquele quepossui como objetivo primrio aprender Java. Esse tipo de informao ser adquirida com o tempo, e no necessrio at um segundo momento.

    Neste curso, separamos essas informaes em quadros especiais, j que so informaes extras. Ou ento,apenas citamos num exerccio e deixamos para o leitor procurar informaes se for de seu interesse.

    Algumas informaes no so mostradas e podem ser adquiridas em tutoriais ou guias de referncia. Sodetalhes que para um programador experiente em Java podem ser importantes, mas no para quem estcomeando.

    Por fim, falta mencionar sobre a prtica, que deve ser tratada seriamente: todos os exerccios so muitoimportantes e os desafios podem ser feitos quando o curso acabar. De qualquer maneira, recomendamos aosalunos estudar em casa, principalmente queles que fazem os cursos intensivos.

    O curso

    Para aqueles que esto fazendo o curso Java para Desenvolvimento Web, recomendado estudarem casa aquilo que foi visto durante a aula, tentando resolver os exerccios que no foram feitos eos desafios que esto l para envolver mais o leitor no mundo do Java.

    Convenes de Cdigo

    Para mais informaes sobre as convenes de cdigo-fonte Java, acesse: http://java.sun.com/docs/codeconv/

    1

    http://java.sun.com/docs/codeconv/http://java.sun.com/docs/codeconv/

  • Material do Treinamento Java para Desenvolvimento Web

    1.2 - Sobre os exerccios

    Os exerccios do curso variam de prticos at pesquisas na Internet, ou mesmo consultas sobre assuntosavanados em determinados tpicos para incitar a curiosidade do aprendiz na tecnologia.

    1.3 - Tirando dvidas

    Para tirar dvidas, tanto dos exerccios quanto de Java em geral, recomendamos o frum do GUJ (http://www.guj.com.br/), onde sua dvida ser respondida prontamente.

    Se voc j participa de um grupo de usurios Java ou alguma lista de discusso, incentivamos tirar suasdvidas nos dois lugares.

    Fora isso, sinta-se vontade para entrar em contato conosco e tirar todas as dvidas que tiver durante ocurso.

    1.4 - Bibliografia

    possvel aprender muitos dos detalhes e pontos no cobertos no treinamento em tutoriais na Internet emportais como o GUJ, em blogs (como o da Caelum: http://blog.caelum.com.br) e em muitos Sites especializa-dos.

    Mas se voc deseja algum livro para expandir seus conhecimentos ou ter como guia de referncia, temosalgumas indicaes dentre vrias possveis:

    Sobre Java para Web

    Use a cabea! JSP e Servlets

    Struts em ao - Ted Husted

    Sobre Java e melhores prticas

    Refactoring, Martin Fowler

    Effective Java - 2nd edition, Joshua Bloch

    Design Patterns, Erich Gamma et al

    Para iniciantes na plataforma Java:

    Java - Como programar, de Harvey M. Deitel

    Use a cabea! - Java, de Bert Bates e Kathy Sierra

    Captulo 1 - Como Aprender Java - Sobre os exerccios - Pgina 2

    http://www.guj.com.br/http://www.guj.com.br/http://blog.caelum.com.br

  • CAPTULO 2

    JDBC - java.sql

    O medo o pai da moralidade Friedrich Wilhelm Nietzsche

    Ao trmino desse captulo, voc ser capaz de:

    conectar-se a um banco de dados qualquer atravs da API java.sql;

    criar uma fbrica de conexes usando o design pattern Factory;

    pesquisar dados atravs de queries;

    DAO Data Access Object.

    2.1 - Executando o Eclipse pela primeira vez

    1) Abra o terminal e digite eclipsejee

    2) Escolha Workbench.

    3

  • Material do Treinamento Java para Desenvolvimento Web

    Baixando em o Eclipse em casa

    Estamos usando o Eclipse Java EE 3.4. Voc pode obt-lo direto no site do Eclipse emwww.eclipse.org

    2.2 - O banco

    O banco de dados onde guardamos os dados que pertencem ao nosso sistema. A maioria dos bancos dedados comerciais hoje em dia so 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 seguintecomando no seu terminal para acessar o mesmo:

    mysql -u root

    Banco de dados

    Para aqueles que no conhecem um banco de dados, recomendado ler mais sobre o assunto eSQL para comear a usar a API JDBC.

    O processo de armazenamento e captura de dados em um banco chamado de persistncia. A bibliotecapadro de persistncia em banco de dados em Java a JDBC, mas j existem diversos projetos do tipo ORM(Object Relational Mapping) que solucionam muitos dos problemas que a estrutura da API JDBC (e ODBC)gerou. Veremos um pouco de Hibernate no final do curso.

    Captulo 2 - JDBC - java.sql - O banco - Pgina 4

  • Material do Treinamento Java para Desenvolvimento Web

    2.3 - Sockets: uma idia inocente

    Para conectar-se a um banco de dados, a primeira idia, simples em sua forma mas complexa em suaimplementao, a de abrir sockets diretamente com o banco de dados desejado, por exemplo um Oracle, e secomunicar com ele atravs de seu protocolo proprietrio e no s SQL.

    Mas voc conhece o protocolo proprietrio de algum banco de dados?

    Devido natureza complexa desses protocolos, seria muito mais simples se existisse algo em Java comquem nosso programa fosse capaz de se comunicar em Java e que se comunicasse com o banco em umprotocolo qualquer, alheio ao nosso programa.

    2.4 - A conexo em Java

    O sistema desenvolvido em Java abstrai o mtodo atravs do qual possvel fazer uma conexo pois asconexes so feitas atravs de uma ponte que implementa todas as funcionalidades que um banco de dadospadro deve nos fornecer.

    Por exemplo, toda conexo deve permitir executar cdigo de atualizao, pesquisa, etc.

    Essa implementao precisa ser escolhida. Essa escolha no feita programaticamente, e sim basta usaruma ponte.

    Veja no esquema ao lado a ponte (implementao) entre o programa (cliente) e o banco de dados.

    O servio de encontrar uma ponte, um driver, certa delegado para um controlador de drivers. Um gerentede drivers. Nada mais normal que ele se chame DriverManager.

    Atravs dele, possvel chamar um mtodo getConnection com uma url que indica qual o banco que desejoabrir.

    Captulo 2 - JDBC - java.sql - Sockets: uma idia inocente - Pgina 5

  • Material do Treinamento Java para Desenvolvimento Web

    O padro da url para o driver do mysql que iremos utilizar :

    jdbc:mysql://ip/banco

    Devemos substituir ip pelo IP da mquina e banco pelo nome do banco a ser utilizado.

    Seguindo o exemplo da linha acima e tudo que foi dito at agora, possvel rodar o exemplo abaixo ereceber uma conexo para um banco MySQL na prpria mquina:

    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 cdigo acima, nada funciona. A conexo no pode ser aberta. Por qu?

    O sistema ainda no consegue descobrir qual implementao do JDBC deve ser usado para a URL menci-onada.

    O primeiro passo adicionar a implementao ao classpath: o arquivo jar contendo a implementaodo mysql (mysql connector) precisa ser colocado em um lugar visvel ou adicionado varivel de ambienteclasspath.

    Ainda falta registrar o driver do mysql no sistema. Para isso basta carregar ele atravs do mtodoClass.forName(). Esse mtodo abre uma classe que se registra com o DriverManager.getConnection().

    Captulo 2 - JDBC - java.sql - A conexo em Java - Pgina 6

  • Material do Treinamento Java para Desenvolvimento Web

    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

    Teoricamente, basta alterar as duas Strings que escrevemos para mudar de um banco para outro.Porm, no tudo to simples assim! O cdigo SQL que veremos a seguir pode funcionar em umbanco e no em outros. Depende de qual padro SQL o banco suporta.Isso s causa dor de cabea e existem certos arcabouos que resolvem isso facilmente, como ocaso do Hibernate (www.hibernate.org) e da JPA (Java Persistence API).

    Captulo 2 - JDBC - java.sql - A conexo em Java - Pgina 7

  • Material do Treinamento Java para Desenvolvimento Web

    Lista de drivers

    Os drivers podem ser baixados normalmente no site do fabricante do banco de dados. A Sun possuium sistema de busca de drivers em seu site: http://developers.sun.com/product/jdbc/driversAlguns casos, como no MSSQL, existem outros grupos que desenvolvem o driver em http://jtds.sourceforge.net . Enquanto isso, voc pode achar o driver do MYSQL (chamado demysql connector) no site http://www.mysql.org.

    2.5 - Fbrica de Conexes

    Em determinado momento de nossa aplicao, gostaramos de ter o controle sobre a construo dos ob-jetos da nossa classe. Muita coisa pode ser feita atravs do construtor, como saber quantos objetos foraminstanciados ou fazer o log sobre essas instanciaes.

    s vezes, tambm queremos controlar um processo muito repetitivo e trabalhoso, como abrir uma conexocom o banco de dados.

    [subsection Fbrica de Conexes facilitando o acesso ao banco]

    Tomemos como exemplo a classe a seguir que seria responsvel por abrir uma conexo com o banco:

    package br.com.caelum.jdbc;

    // imports aqui (ctrl + shift + o)

    public class ConnectionFactory {

    public static Connection getConnection() throws SQLException {try {

    Class.forName("com.mysql.jdbc.Driver");return DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");

    } catch (ClassNotFoundException e) {throw new SQLException(e.getMessage());

    }}

    }

    Poderamos colocar um aviso na nossa aplicao, notificando todos os programadores a adquirir uma cone-xo:

    Connection con = ConnectionFactory.getConnection();

    Note que o mtodo getConnection() uma fbrica de conexes, isto , ele fabrica conexes para ns,no importando de onde elas vieram. Portanto, vamos chamar a classe de ConnectionFactory e o mtodo degetConnection.

    2.6 - Solues para viagem Design Patterns

    Orientao a objetos resolve as grandes dores de cabeas que tnhamos na programao procedural, res-tringindo e centralizando responsabilidades.

    Captulo 2 - JDBC - java.sql - Fbrica de Conexes - Pgina 8

    http://developers.sun.com/product/jdbc/drivershttp://jtds.sourceforge.nethttp://jtds.sourceforge.nethttp://www.mysql.org.

  • Material do Treinamento Java para Desenvolvimento Web

    Mas algumas coisas no podemos simplesmente resolver com orientao a objetos, pois no existe palavrachave para uma funcionalidade to especfica.

    Alguns desses pequenos problemas aparecem com tamanha freqncia que as pessoas desenvolvem umasoluo padro para ele. Com isso, ao nos defrontarmos com um desses problemas clssicos, podemos rapi-damente implementar essa soluo genrica com uma ou outra modificao. Essa soluo padro tem o nomede Design Pattern (Padro de Projeto).

    A melhor maneira para aprender o que um Design Pattern vendo como surgiu sua necessidade.

    A nossa ConnectionFactory implementa o design pattern Factory que prega o encapsulamento da constru-o (fabricao) de objetos complicados.

    A bblia

    O livro mais conhecido de Design Patterns foi escrito em 1995 e tem trechos de cdigo em C++ eSmalltalk. Mas o que realmente importa so os conceitos e os diagramas que fazem desse livroindependente de qualquer linguagem. Alm de tudo, o livro de leitura agradvel.Design Patterns, Erich Gamma et al.

    2.7 - Exerccios - ConnectionFactory

    1) a) Crie um projeto no Eclipse chamado jdbc e confirme a mudana de perspectiva.

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 9

  • Material do Treinamento Java para Desenvolvimento Web

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 10

  • Material do Treinamento Java para Desenvolvimento Web

    2) Copie o driver do mysql para o seu projeto.

    a) no seu Desktop, clique na pasta caelum;

    b) clique da direita no driver do mysql mais novo, escolha Copy;

    c) v para sua pasta principal (webXXX) na coluna da direita do FileBrowser;

    d) entre no diretrio workspace, jdbc;

    e) clique da direita e escolha Paste: voc acaba de colocar o arquivo .jar no seu projeto.

    3) Vamos criar a classe que fabrica conexes:

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 11

  • Material do Treinamento Java para Desenvolvimento Web

    a) Crie-a no pacote br.com.caelum.jdbc e nomeie-a ConnectionFactory.

    b) Crie o mtodo esttico getConnection que retorna uma nova conexo. Quando perguntado, importe asclasses do pacote java.sql (cuidado para no importar de com.mysql).

    1 public static Connection getConnection() throws SQLException {

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 12

  • Material do Treinamento Java para Desenvolvimento Web

    2 try {3 Class.forName("com.mysql.jdbc.Driver");4 System.out.println("Conectando ao banco");5 return DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "");6 } catch (ClassNotFoundException e) {7 throw new SQLException(e.getMessage());8 }9 }

    4) Crie uma classe chamada TestaConexao no pacote br.com.caelum.jdbc.teste. Todas as nossas classes deteste devero ficar nesse pacote.

    a) coloque o mtodo main

    public static void main (String[] args) { ...

    b) fabrique uma conexo:

    Connection connection = ConnectionFactory.getConnection();

    c) feche a conexo

    connection.close();

    d) Trate os erros com throws. ( Use: Ctrl + 1 e escolha add throws declaration).

    5) Rode a sua classe TestaConexao

    a) Clique da direita na sua classe TestaConexao

    b) Escolha Run as, Java Application

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 13

  • Material do Treinamento Java para Desenvolvimento Web

    6) Parece que sua aplicao no funciona pois o driver no foi encontrado? Esquecemos de colocar o jar noclasspath! (buildpath no eclipse)

    a) Clique no seu projeto, pressione F5 para executar um Refresh.

    b) Selecione o seu driver do mysql, clique da direita e escolha Build Path, Add to Build Path.

    Captulo 2 - JDBC - java.sql - Exerccios - ConnectionFactory - Pgina 14

  • Material do Treinamento Java para Desenvolvimento Web

    c) Rode novamente sua aplicao TestaConexao agora que colocamos o driver no classpath.

    2.8 - 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 captulo:

    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.

    Captulo 2 - JDBC - java.sql - A tabela de exemplo - Pgina 15

  • Material do Treinamento Java para Desenvolvimento Web

    2.9 - Javabeans

    O que so Javabeans? A pergunta que no quer se calar pode ser respondida muito facilmente uma vezque a maior confuso feita a fora entre Javabeans e Enterprise Java Beans (EJB).

    Javabeans so classes que possuem o construtor sem argumentos e mtodos de acesso do tipo get e set!Mais nada! Simples, no?

    J os EJBs so javabeans com caractersticas mais avanadas e so o assunto principal do curso FJ-31 daCaelum.

    Podemos usar beans por diversos motivos, normalmente as classes de modelo da nossa aplicao costu-mam ser javabeans.

    Agora utilizaremos:

    uma classe com mtodos do tipo get e set para cada um de seus parmetros, que representa algumobjeto;

    uma classe com construtor sem argumentos que representa uma coleo de objetos.

    A seguir, voc v um exemplo de uma classe javabean que seria equivalente ao nosso modelo de entidadedo banco de dados:

    package br.com.caelum.jdbc.modelo;

    public class Contato {

    private Long id;private String nome;private String email;private String endereco;

    // mtodos get e set para id, nome, email e endereo

    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;}

    Captulo 2 - JDBC - java.sql - Javabeans - Pgina 16

  • Material do Treinamento Java para Desenvolvimento Web

    public Long getId() {return this.id;

    }public void setId(Long novo) {

    this.id = novo;}

    }

    A tecnologia javabeans muito grande e mais informaes sobre essa vasta rea que a base dos compo-nentes 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. No osconfunda com Java Beans!

    2.10 - Exerccios - Contato

    1) Crie a classe de Contato.

    a) No pacote br.com.caelum.jdbc.modelo, crie uma classe chamada Contato.

    1 package br.com.caelum.jdbc.modelo;23 public class Contato {4 private Long id;5 private String nome;6 private String email;7 private String endereco;8 }

    b) Aperte Ctrl + 3 e digite ggas ou Generate getters and setters e selecione todos os getters e setters.

    Captulo 2 - JDBC - java.sql - Exerccios - Contato - Pgina 17

    http://java.sun.com/products/javabeans

  • Material do Treinamento Java para Desenvolvimento Web

    2.11 - Inserindo dados

    Para inserir dados em uma tabela de um banco de dados entidade-relacional basta usar a clusula INSERT.Precisamos especificar quais os campos que desejamos atualizar e os valores.

    Primeiro o cdigo SQL:

    String sql = "insert into contatos (nome,email,endereco)values (" + nome + ", " + email + ", " + endereco + ")";

    O exemplo acima possui dois pontos negativos que so importantssimos. O primeiro que o programadorque no escreveu o cdigo original no consegue bater o olho e entender o que est escrito. O que o cdigoacima faz? Lendo rapidamente fica difcil. Mais difcil ainda saber se faltou uma vrgula, um fecha parntesestalvez?

    Outro problema o clssico preconceito contra Joana Darc, formalmente chamado de SQL Injection. Oque acontece quando o contato a ser adicionado possui no nome uma aspas simples? O cdigo sql se quebratodo e pra de funcionar ou, pior ainda, o usurio final capaz de alterar seu cdigo sql para executar aquiloque ele deseja (SQL injection)... tudo isso porque escolhemos aquela linha de cdigo e no fizemos o escapede caracteres especiais.

    Por esses dois motivos no usaremos cdigo sql como mostrado anteriormente... vamos imaginar algo maisgenrico e um pouco mais interessante:

    String sql = "insert into contatos (nome,email,endereco) values (?,?,?)";

    Existe uma maneira em Java de escrever o cdigo sql como no primeiro exemplo dessa seo (com conca-tenaes de strings). Essa maneira no ser ensinada durante o curso pois uma pssima prtica que dificultaa manuteno do seu projeto.

    Captulo 2 - JDBC - java.sql - Inserindo dados - Pgina 18

  • Material do Treinamento Java para Desenvolvimento Web

    Perceba que no colocamos os pontos de interrogao de brincadeira, e sim porque realmente no sabemoso que desejamos inserir. Estamos interessados em executar aquele cdigo mas no sabemos ainda quais soos parmetros que iremos utilizar nesse cdigo sql que ser executado, chamado de statement.

    As clusulas so executadas em um banco de dados atravs da interface PreparedStatement. Para re-ceber um PreparedStatement relativo conexo, basta chamar o mtodo prepareStatement, passando comoargumento o comando SQL com os valores vindos de variveis preenchidos com uma interrogao.

    String sql = "insert into contatos (nome,email,endereco) values (?,?,?)";PreparedStatement stmt = con.prepareStatement(sql);

    Logo em seguida, chamamos o mtodo setString do PreparedStatement para preencher os valores, pas-sando a posio (comeando em 1) da interrogao no SQL e o valor que deve ser colocado.

    // preenche os valoresstmt.setString(1, "Caelum");stmt.setString(2, "[email protected]");stmt.setString(3, "R. Vergueiro 3185 cj57");

    Por fim, uma chamada a execute() executa o comando SQL.

    stmt.execute();

    Agora imagine todo esse processo sendo escrito toda vez que desejar inserir algo no banco? Ainda noconsegue visualizar o quo destrutivo isso pode ser?

    Veja o exemplo abaixo, que abre uma conexo e insere um contato no banco:

    public class JDBCInsere {

    public static void main(String[] args) throws SQLException {

    // conectandoConnection con = ConnectionFactory.getConnection();

    // cria um preparedStatementString sql = "insert into contatos (nome,email,endereco) values (?,?,?)";PreparedStatement stmt = con.prepareStatement(sql);

    // preenche os valoresstmt.setString(1, "Caelum");stmt.setString(2, "[email protected]");stmt.setString(3, "R. Vergueiro 3185 cj57");

    // executastmt.execute();stmt.close();

    System.out.println("Gravado!");

    con.close();}

    }

    Captulo 2 - JDBC - java.sql - Inserindo dados - Pgina 19

  • Material do Treinamento Java para Desenvolvimento Web

    Fechando a conexo

    No comum utilizar JDBC hoje em dia. O mais praticado o uso de alguma api de ORM como oHibernate ou EJB, porm aqueles que ainda insistem no uso de JDBC devem prestar ateno nomomento de fechar a conexo.O exemplo dado acima no a fecha caso algum erro ocorra no momento de inserir um dado nobanco de dados.O comum fechar a conexo em um bloco finally.

    M prtica: StatementEm vez de usar o PreparedStatement, voc pode usar uma interface mais simples chamadaStatement, que simplesmente executa uma clusula SQL no mtodo execute:

    Statement stmt = con.createStatement();stmt.execute("INSERT INTO ...");stmt.close();

    Mas prefira a classe PreparedStatement que mais rpida que Statement e deixa seu cdigo muito maislimpo.Geralmente, seus comandos SQL contero valores vindos de variveis do programa Java; usandoStatements, voc ter que fazer muitas concatenaes, mas usando PreparedStatements, isso fica maislimpo e fcil.

    2.12 - DAO Data Access Object

    J foi possvel sentir que colocar cdigo SQL dentro de suas classes de lgica algo nem um pouco elegantee muito menos vivel quando voc precisa manter o seu cdigo.

    Quantas vezes voc no ficou bravo com o programador responsvel por aquele cdigo ilegvel?

    A idia a seguir remover o cdigo de acesso ao banco de dados de suas classes de lgica e coloc-loem uma classe responsvel pelo acesso aos dados. Assim o cdigo de acesso ao banco de dados fica em umlugar s, tornando mais fcil a manuteno.

    Que tal seria se pudssemos chamar um mtodo adiciona que adiciona um Contato ao banco?

    Em outras palavras quero que o cdigo a seguir funcione:

    // adiciona os dados no bancoMisterio bd = new Misterio();bd.adiciona("meu nome", "meu email", "meu endereo");

    Mas... Java orientado a Strings? Vamos tentar novamente: em outras palavras quero que o cdigo aseguir funcione:

    // adiciona um contato no bancoMisterio bd = new Misterio();

    // mtodo muito mais elegantebd.adiciona(contato);

    Tentaremos chegar ao cdigo anterior: seria muito melhor e mais elegante poder chamar um nico mtodoresponsvel pela incluso, certo?

    Captulo 2 - JDBC - java.sql - DAO Data Access Object - Pgina 20

  • Material do Treinamento Java para Desenvolvimento Web

    public class TestaInsere {

    public static void main(String[] args) throws SQLException {

    // pronto para gravarContato contato = new Contato();contato.setNome("Caelum");contato.setEmail("[email protected]");contato.setEndereco("R. Vergueiro 3185 cj87");

    // grave nessa conexo!!!Misterio bd = new Misterio();

    // mtodo elegantebd.adiciona(contato);

    System.out.println("Gravado!");

    }}

    O cdigo anterior j mostra o poder que alcanaremos: atravs de uma nica classe seremos capazes deacessar o banco de dados e, mais ainda, somente atravs dessa classe ser possvel acessar os dados.

    Esta idia, inocente primeira vista, capaz de isolar todo o acesso a banco em classes bem simples, cujainstncia um objeto responsvel por acessar os dados. Da responsabilidade deste objeto surgiu o nomede Data Access Object ou simplesmente DAO, um dos mais famosos padres de desenvolvimento (designpattern).

    O que falta para o cdigo acima funcionar uma classe chamada ContatoDAO com um mtodo chamadoadiciona. Vamos criar uma que se conecta ao banco ao construirmos uma instncia dela:

    public class ContatoDAO {

    // a conexo com o banco de dadosprivate Connection connection;

    public ContatoDAO() throws SQLException {this.connection = ConnectionFactory.getConnection();

    }}

    Agora que todo ContatoDAO possui uma conexo com o banco podemos focar no mtodo adiciona, querecebe um Contato como argumento e responsvel por adicion-lo atravs de cdigo sql.

    public void adiciona(Contato contato) throws SQLException {

    // prepared statement para inseroString sql = "insert into contatos (nome,email,endereco) values (?,?,?)";PreparedStatement stmt = con.prepareStatement(sql);

    // seta os valoresstmt.setString(1,contato.getNome());stmt.setString(2,contato.getEmail());

    Captulo 2 - JDBC - java.sql - DAO Data Access Object - Pgina 21

  • Material do Treinamento Java para Desenvolvimento Web

    stmt.setString(3,contato.getEndereco());

    // executastmt.execute();stmt.close();

    }

    2.13 - Exerccios - ContatoDAO

    1) Crie a classe br.com.caelum.jdbc.dao.ContatoDAO

    1 package br.com.caelum.jdbc.dao;23 // imports aqui (CTRL+SHIFT+O)45 public class ContatoDAO {67 // a conexo com o banco de dados8 private Connection connection;910 public ContatoDAO() throws SQLException {11 this.connection = ConnectionFactory.getConnection();12 }1314 public void adiciona(Contato contato) throws SQLException {1516 // prepared statement para insero17 String sql = "insert into contatos (nome,email,endereco) values (?,?,?)";18 PreparedStatement stmt = connection.prepareStatement(sql);1920 // seta os valores21 stmt.setString(1,contato.getNome());22 stmt.setString(2,contato.getEmail());23 stmt.setString(3,contato.getEndereco());2425 // executa26 stmt.execute();27 stmt.close();28 }29 }

    Lembre-se de importar as classes de SQL do pacote java.sql!

    2) Crie, no pacote br.com.caelum.jdbc.teste, uma classe chamada TestaInsere com um mtodo main:

    package br.com.caelum.jdbc.teste;

    // imports aqui (CTRL+SHIFT+O)

    public class TestaInsere {

    public static void main(String[] args) throws SQLException {

    Captulo 2 - JDBC - java.sql - Exerccios - ContatoDAO - Pgina 22

  • Material do Treinamento Java para Desenvolvimento Web

    // pronto para gravarContato contato = new Contato();contato.setNome("Caelum");contato.setEmail("[email protected]");contato.setEndereco("R. Vergueiro 3185 cj57");

    // grave nessa conexo!!!ContatoDAO dao = new ContatoDAO();

    // mtodo elegantedao.adiciona(contato);

    System.out.println("Gravado!");}

    }

    3) Teste seu programa.

    4) Verifique se o contato foi adicionado. Abra o terminal e digite:

    mysql -h localhost -u rootuse teste;select * from contatos;

    exit para sair do console do MySQL.

    2.14 - Exerccios Opcionais

    1) Altere seu programa e use a classe java.util.Scanner do Java 5 para ler os dados atravs do teclado:

    // cria o ScannerScanner teclado = new Scanner(System.in);

    // pronto para gravarContato contato = new Contato();

    System.out.print("Nome: ");contato.setNome(teclado.nextLine());

    System.out.print("E-mail: ");contato.setEmail(teclado.nextLine());

    System.out.print("Endereo: ");contato.setEndereco(teclado.nextLine());

    2.15 - Pesquisando

    Para pesquisar tambm utilizamos a interface PreparedStatement, de forma que o mtodo executeQueryretorna todos os contatos no exemplo a seguir.

    O objeto retornado do tipo ResultSet que permite navegar por seus registros atravs do mtodo next.

    Captulo 2 - JDBC - java.sql - Exerccios Opcionais - Pgina 23

  • Material do Treinamento Java para Desenvolvimento Web

    Esse mtodo ir retornar false quando chegar ao fim da pesquisa, portanto ele normalmente utilizado parafazer um loop nos registros como no exemplo a seguir:

    // pega a conexo e o StatementConnection con = ConnectionFactory.getConnection();PreparedStatement stmt = con.prepareStatement("select * from contatos");

    // executa um selectResultSet rs = stmt.executeQuery();

    // itera no ResultSetwhile (rs.next()) {}

    rs.close();stmt.close();con.close();

    Para retornar o valor de uma coluna no banco de dados basta chamar um dos mtodos get do ResultSet,dentre os quais, o mais comum: getString.

    // pega a conexo e o StatementConnection con = ConnectionFactory.getConnection();PreparedStatement stmt = con.prepareStatement("select * from contatos");

    // executa um selectResultSet rs = stmt.executeQuery();

    // itera no ResultSetwhile (rs.next()) {

    System.out.println(rs.getString("nome") + " :: " + rs.getString("email")

    );}

    stmt.close();con.close();

    Recurso Avanado: O cursor

    Assim como o cursor do banco de dados, s possvel mover para o prximo registro. Para permitirum processo de leitura para trs necessrio especificar na abertura do ResultSet que tal cursordeve ser utilizado.

    Mas, novamente, podemos aplicar as idias de DAO e criar um mtodo getLista() no nosso ContatoDAO.Mas o que esse mtodo retornaria? Um ResultSet? E teramos o cdigo de manipulao de ResultSet espa-lhado por todo o cdigo? Vamos fazer nosso getLista() devolver algo mais interessante, uma lista de Contato:

    PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");ResultSet rs = stmt.executeQuery();

    List contatos = new ArrayList();

    Captulo 2 - JDBC - java.sql - Pesquisando - Pgina 24

  • Material do Treinamento Java para Desenvolvimento Web

    while (rs.next()) {

    // criando o objeto ContatoContato contato = new Contato();contato.setNome(rs.getString("nome"));contato.setEmail(rs.getString("email"));contato.setEndereco(rs.getString("endereco"));

    // adicionando o objeto listacontatos.add(contato);

    }

    rs.close();stmt.close();

    return contatos;

    2.16 - Exerccios - Listagem

    1) Crie o mtodo getLista na classe ContatoDAO. Importe List da java.util.

    1 public List getLista() throws SQLException {23 PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");4 ResultSet rs = stmt.executeQuery();56 List contatos = new ArrayList();78 while (rs.next()) {9 // criando o objeto Contato10 Contato contato = new Contato();11 contato.setNome(rs.getString("nome"));12 contato.setEmail(rs.getString("email"));13 contato.setEndereco(rs.getString("endereco"));1415 // adicionando o objeto lista16 contatos.add(contato);17 }1819 rs.close();20 stmt.close();2122 return contatos;23 }

    2) Vamos usar o mtodo getLista agora para listar todos os contatos do nosso banco de dados.

    3) Crie uma classe chamada TestaListaDAO com um mtodo main:

    a) Crie um ContatoDAO:

    ContatoDAO dao = new ContatoDAO();

    Captulo 2 - JDBC - java.sql - Exerccios - Listagem - Pgina 25

  • Material do Treinamento Java para Desenvolvimento Web

    b) Liste os contatos com o DAO:

    List contatos = dao.getLista();

    c) Itere nessa lista e imprima as informaes dos contatos:

    for (Contato contato : contatos) {System.out.println("Nome: " + contato.getNome());System.out.println("Email: " + contato.getEmail());System.out.println("Endereo: " + contato.getEndereco() + "\n");

    }

    4) Rode o programa anterior clicando da direita no mesmo, Run, Run as Java Application.

    2.17 - Um pouco mais...

    1) Assim como o MYSQL existem outros bancos de dados gratuitos e opensource na internet. O HSQLDB umbanco desenvolvido em Java que pode ser acoplado a qualquer aplicao e libera o cliente da necessidadede baixar qualquer banco de dados antes da instalao de um produto Java!

    2) O Hibernate tomou conta do mercado e virou febre mundial pois no se faz necessrio escrever uma linhade cdigo SQL!

    3) Outros projetos como o Hibernate so bastante famosos como o OJB e o Torque, cada um com suas prpriascaractersticas implementando a funcionalidade de ORM.

    4) O Prevayler, iniciativa brasileira, funciona como uma camada de prevalncia de seus objetos, de uma ma-neira muito diferente de uma ferramenta de ORM convencional.

    5) Se um projeto no usa nenhuma das tecnologias de ORM disponveis, o mnimo a ser feito seguir o DAO.

    2.18 - Exerccios opcionais

    1) Use clusulas where para refinar sua pesquisa no banco de dados. Por exemplo: where nome like C%

    2) Crie o mtodo pesquisar que recebe um id (int) e retorna um objeto do tipo Contato.

    Desafios

    1) Faa conexes para outros tipos de banco de dados disponveis.

    Captulo 2 - JDBC - java.sql - Um pouco mais... - Pgina 26

  • Material do Treinamento Java para Desenvolvimento Web

    2.19 - Outros mtodos para o seu DAO

    Agora que voc j sabe usar o PreparedStatement para executar qualquer tipo de cdigo SQL e ResultSetpara receber os dados retornados da sua pesquisa fica simples, porm maante, escrever o cdigo de diferentesmtodos de uma classe tpica de DAO.

    Veja primeiro o mtodo 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 " +3 "set nome=?, email=?, endereco=? where id=?");4 stmt.setString(1, contato.getNome());5 stmt.setString(2, contato.getEmail());6 stmt.setString(3, contato.getEndereco());7 stmt.setLong(4, contato.getId());8 stmt.execute();9 stmt.close();10 }

    No existe nada de novo nas linhas acima. Uma execuo de query! Simples, no?

    Agora o cdigo para remoo: comea com uma query baseada em um contato, mas usa somente o id delepara 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.20 - Exerccios opcionais - Alterar e remover

    1) Adicione o mtodo para alterar contato no seu ContatoDAO.

    1 public void altera(Contato contato) throws SQLException {2 PreparedStatement stmt = connection.prepareStatement("update " +3 "contatos set nome=?, email=?, endereco=? where id=?");4 stmt.setString(1, contato.getNome());5 stmt.setString(2, contato.getEmail());6 stmt.setString(3, contato.getEndereco());7 stmt.setLong(4, contato.getId());8 stmt.execute();9 stmt.close();10 }

    2) Adicione o mtodo 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();

    Captulo 2 - JDBC - java.sql - Outros mtodos para o seu DAO - Pgina 27

  • Material do Treinamento Java para Desenvolvimento Web

    stmt.close();}

    3) Use os mtodos criados anteriormente para fazer testes com o seu banco de dados: atualize e remova umcontato.

    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 DAO.

    7) Use-a para instanciar novos funcionrios e coloc-los no seu banco.

    Captulo 2 - JDBC - java.sql - Exerccios opcionais - Alterar e remover - Pgina 28

  • CAPTULO 3

    O que J2EE?

    Ensinar aprender duas vezes. Joseph Joubert

    O que o Java Enterprise Edition?

    Servidor de aplicao

    Servlet Continer

    Implementao de referncia

    3.1 - Java EE

    O Java EE (Java Enterprise Edition ou Java EE) no passa de uma srie de especificaes bem detalhadas,dando uma receita de como deve ser implementado um software que faz um determinado servio.

    Veremos no curso os vrios servios que um software deve implementar para seguir as especificaes doJava EE. Veremos tambm conceitos muito importantes, para depois firmar jarges como servidor de aplica-o e continers.

    Esses servios variam desde envio de emails, at complexos servios de transao.

    Porque a Sun faz isso? A idia que voc possa criar uma aplicao que utilize esses servios. Comoesses servios so bem complicados, voc no perder tempo implementando essa parte do sistema, pormter de comprar de algum (existem implementaes gratuitas de excelente qualidade).

    Algum dia, voc poder querer trocar essa implementao atual por uma que mais rpida em determi-nados pontos (e conseqentemente mais cara). Porm continuar utilizando a mesma interface, isto , comovoc chama aquelas funcionalidades do Java EE. O que muda a implementao da especificao: voc temessa liberdade, no est preso a um cdigo e a especificao garante que sua aplicao funcionar com aimplementao de outra empresa.

    Onde encontrar as especificaes

    O grupo responsvel por gerir as especificaes 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 debibliotecas e especificaes para o Java, tanto para JSE, quanto EE e outros.Sobre o Java EE, voc pode encontrar em: http://java.sun.com/javaee/

    29

    http://www.jcp.org/http://www.jcp.org/http://java.sun.com/javaee/

  • Material do Treinamento Java para Desenvolvimento Web

    J2EE

    O nome J2EE era usado nas verses mais antigas, at a 1.4. Hoje, o nome correto Java EE, masvoc ainda vai ver muitas referncias a J2EE.

    3.2 - APIs

    As APIs a seguir so as principais dentre as disponibilizadas pelo Java Enterprise Edition atravs de suaespecificao em sua verso 5:

    1) JavaServer Pages (JSP), Java Servlets, Java Server Faces (JSF) (trabalhar para a web)

    2) Enterprise Javabeans Components (EJB) e Java Persistence Api (objetos distribudos, clusters, acesso re-moto a objetos etc)

    3) Java API for XML Web Services (JAX-WS), Java API for XML Binding (JAX-B) (trabalhar com arquivos xml)

    4) Java Autenthication and Authorization Service (JAAS) (API padro do Java para segurana)

    5) Java Transaction API (JTA) (controle de transao no continer)

    6) Java Message Service (JMS) (troca de mensagens sncronas ou no)

    7) Java Naming and Directory Interface (JNDI) (espao de nomes e objetos)

    8) Java Management Extensions (JMX) (administrao da sua aplicao e estatsticas sobre a mesma)

    Entre outras para trabalhar com Webservices e outros tipos de acesso remoto ou invocao remota demtodos (RMI).

    3.3 - Implementaes compatveis com a especificao

    Existem diversos servidores de aplicao famosos compatveis com a especificao do J2EE 1.4, abaixolistamos alguns. A verso 5 j vem sendo utilizada em projetos mais recentes, mas empresas usualmenteresistem em migrar projetos j antigos para uma nova verso da tecnologia.

    Do grupo a seguir, o JBoss se destaca como o primeiro a implementar essas novas especificaes.

    1) RedHat/Jboss, JBoss Application Server, gratuito, Java EE 5;

    2) Sun, GlassFish, gratuito, Java EE 5.

    3) Apache, Apache Geronimo, gratuito, Java EE 5;

    4) Oracle/BEA, WebLogic Application Server, Java EE 5;

    5) IBM, IBM Websphere Application Server, Java EE 5;

    6) Sun, Sun Java System Application Server (baseado no GlassFish), pago, Java EE 5;

    7) SAP, SAP Application Server, pago, Java EE 5;

    8) Objectweb, Objectweb Jonas, gratuito, J2EE 1.4;

    9) (outros)

    Captulo 3 - O que J2EE? - APIs - Pgina 30

  • CAPTULO 4

    Servlet Container

    Que ningum se engane: s se consegue a simplicidade atravs de muito trabalho. Clarisse Lispector

    O que e como funciona um Servlet Container?

    4.1 - Introduo

    No comeo, a Internet era uma dzia de pginas estticas contendo pesquisas acadmicas de diversasinstituies.

    Da necessidade de gerar contedo dinmico, como os primeiros contadores, uma idia considerada bemsimples hoje em dia, surgiram os primeiros programas de CGI (Common Gateway Interface).

    Atravs de linguagens como C, C++, Perl, ASP, PHP, Cobol, Delphi, Shell, etc, foi possvel gerar contedoque permite ao usurio acesso a diversas funcionalidades atravs de pginas HTML, como quando voc desejacomprar produtos em uma loja virtual.

    Para melhorar o desempenho do ltimo, inventaram o que viria a ser uma servlet, uma nova forma detrabalhar com requisies de clientes via web que economiza o tempo de processamento de uma chamada e amemria que seria gasta para tal processo, alm de ser em Java e possuir todas as vantagens e facilidades daorientao a objetos.

    Alm do mais, servlets so to portveis quanto qualquer programa escrito em Java, e aqueles que progra-mam servlets no precisam mais se preocupar com a funcionalidade do servidor, que j foi escrita para ns eno precisa ser alterada.

    HTML

    Este curso tem como pr-requisito o conhecimento de HTML: saber utilizar as tags principais paraa construo de pginas dinmicas (html, body, form, input, textarea e select).Caso no esteja acostumado com pginas HTML, recomenda-se que tente ler algum tutorial paraque no apaream dificuldades durante o curso.

    Em breve estudaremos as servlets, mas antes veremos o JSP (Java Server Pages), que como escrevemosa maior parte de nossas pginas dinmicas em Java.

    31

  • Material do Treinamento Java para Desenvolvimento Web

    4.2 - Aplicaes web no Java EE e Servlet Container

    O Java EE 5 composto pelas seguintes especificaes ligadas a uma aplicao web:

    JSP

    Servlets

    JSTL

    JSF

    Um Servlet Container um servidor que suporta essas funcionalidades mas no o Java EE completo. indicado a quem no precisa de tudo do Java EE e est interessado apenas na parte web (boa parte do mercadose encaixa nessa categoria).

    H alguns servlet containers famosos no mercado. O mais famoso o Apache Tomcat, mas h outros comoo Jetty da Mortbay.

    4.3 - Instalando o Tomcat

    Para instalar o Tomcat na Caelum, siga os seguintes passos:

    1) Entre no atalho caelum na sua rea de Trabalho;

    2) Entre na pasta 21 e selecione o arquivo do apache-tomcat;

    3) D dois cliques para abrir o Archive Manager do Linux;

    Captulo 4 - Servlet Container - Aplicaes web no Java EE e Servlet Container - Pgina 32

  • Material do Treinamento Java para Desenvolvimento Web

    4) Clique em Extract;

    5) Escolha o seu Desktop e clique em extract;

    6) O resultado uma pasta chamada apache-tomcat: o tomcat j est instalado.

    4.4 - Sobre o Tomcat

    Baixe o Tomcat em http://tomcat.apache.org na pgina de downloads da verso que escolher, voc precisade uma Binary Distribution.

    O Tomcat considerado implementao padro e referncia de novas APIs de servlets, isto , quando umanova especificao surge, o Tomcat costuma ser o primeiro servlet continer a implementar a nova API. Eletambm o servlet continer padro utilizado pelo JBoss.

    Captulo 4 - Servlet Container - Sobre o Tomcat - Pgina 33

    http://tomcat.apache.org

  • Material do Treinamento Java para Desenvolvimento Web

    4.5 - Instalando o Tomcat em casa

    Iniciando o Tomcat

    Entre no diretrio de instalao e rode o programa startup.sh:

    cd apache-tomcat/bin./startup.sh

    Parando o tomcat

    Entre no diretrio de instalao do tomcat e rode o programa shutdown.sh:

    cd apache-tomcat/bin./shutdown.sh

    Tomcat no Windows

    Para instalar o Tomcat no Windows basta executar o arquivo .exe que pode ser baixado no site do Tomcat.Depois disso, voc pode usar os scripts startup.bat e shutdown.bat, analogamente aos scripts do Linux.

    Tudo o que vamos desenvolver neste curso funciona em qualquer ambiente compatvel com o Java Enter-prise Edition.

    4.6 - Outra opo: Jetty

    O Jetty uma outra implementao criada pela MortBay (http://jetty.mortbay.org) de Servlet Container eHTTP Server.

    Pequeno e eficiente, ele uma opo ao Tomcat bastante utilizada devido a algumas de suas caractersticas.Especialmente:

    facilmente embarcvel;

    escalvel;

    plugabilidade, isto , fcil trocar para diferentes implementaes dos principais componentes da API.

    O Jetty tambm costuma implementar, antes do Tomcat, idias diferentes que ainda no esto na API deservlets do Java EE. Uma dessas implementaes pioneiras foi do uso de conectores NIO, por exemplo.

    Captulo 4 - Servlet Container - Instalando o Tomcat em casa - Pgina 34

    http://jetty.mortbay.org

  • CAPTULO 5

    O eclipse e seus plugins

    O repouso uma boa coisa mas o tdio seu irmo. Voltaire (Franois-Marie Arouet)

    Neste captulo, voc aprender a:

    instalar o Eclipse com WTP;

    configurar o Tomcat dentro do WTP;

    conhecer outros plugins.

    5.1 - O plugin WTP

    O WTP, Web Tools Platform, um conjunto de plugins que auxilia o desenvolvimento de aplicaes JavaEE, em particular, de aplicaes Web. Contm desde editores para JSP, JS e HTML at perspectivas e jeitosde rodar servidores de dentro do Eclipse.

    Este plugin vai nos ajudar bastante com content-assists e atalhos para tornar o desenvolvimento Web maiseficiente.

    Para instalar o eclipse com WTP basta ir no site do Eclipse e:

    1) Abra a pgina www.eclipse.org/downloads ;

    2) Baixe o Eclipse IDE for Java EE Developers;

    3) Descompacte o arquivo e pronto.

    Para saber mais: outros plugins

    O WTP o plugin oficial do eclipse para desenvolvimento Java EE. Mas h muitas outras possibilidades deplugins.

    Antes do WTP, era muito comum o uso do plugin Sysdeo Tomcat para gerenciar o tomcat e o AmaterasHTMLEditor para suporte a JSPs. So alternativas ainda disponveis e com a vantagem de serem mais levesque o WTP, embora com muito menos recursos.

    O MyEclipse outro plugin muito famoso. Ele bem completo, com suporte a Java EE, Spring, Struts,Desktop, Mobile e outros. uma ferramenta paga para o Eclipse, mas sua anuidade barata.

    H outras possibilidades. No curso, usaremos o WTP por ser oficial, gratuito e bastante completo.

    35

  • Material do Treinamento Java para Desenvolvimento Web

    5.2 - Configurando o Tomcat no WTP

    Vamos primeiro configurar no WTP o servidor Tomcat que acabamos de descompactar.

    1) Mude a perspectiva do Eclipse para Java (e no Java EE, por enquanto). Para isso, v no canto direitosuperior e selecione Java;

    2) Abra a View de Servers na perspectiva atual. Aperte Ctrl + 3 e digite Servers:

    3) Clique com o boto direito dentro da aba Servers e v em New > Server:

    4) Selecione o Apache Tomcat 6.0 e clique em Next:

    Captulo 5 - O eclipse e seus plugins - Configurando o Tomcat no WTP - Pgina 36

  • Material do Treinamento Java para Desenvolvimento Web

    5) Na prxima tela, selecione o diretrio onde voc descompactou o Tomcat e clique em Finish:

    6) Por padro, o WTP gerencia todo o Tomcat para ns e no permite que configuraes sejam feitas por forado Eclipse. Para simplificar, vamos desabilitar isso e deixar o Tomcat no modo padro do prprio Tomcat.

    Na aba Servers, d dois cliques no servidor Tomcat que uma tela de configurao se abrir. Localize aseo Server Locations. Repare que a opo use workspace metadata est marcada. Marque a opoUse Tomcat installation:

    Captulo 5 - O eclipse e seus plugins - Configurando o Tomcat no WTP - Pgina 37

  • Material do Treinamento Java para Desenvolvimento Web

    Salve e feche essa tela.

    7) Selecione o servidor que acabamos de adicionar e clique em Start (cone play verde na view servers):

    8) Abra o navegador e acesse a URL http://localhost:8080/ Deve aparecer uma tela de mensagem do Tomcate a verso do mesmo.

    Pronto! O WTP est configurado para rodar com o Tomcat!

    Captulo 5 - O eclipse e seus plugins - Configurando o Tomcat no WTP - Pgina 38

    http://localhost:8080/

  • CAPTULO 6

    Novo projeto web

    So muitos os que usam a rgua, mas poucos os inspirados. Plato

    Nesse captulo, voc aprender:

    a criar um novo projeto web no eclipse;

    quais so os diretrios importantes de uma aplicao web;

    quais so os arquivos importantes de uma aplicao web;

    onde colocar suas pginas e arquivos estticos;

    rodar a aplicao no Tomcat de dentro do Eclipse.

    6.1 - Novo projeto

    Primeiro, vamos criar um novo projeto web no Eclipse usando os recursos do Eclipse WTP.

    1) V em New > Project e selecione Dynamic Web Project e clique Next:

    2) Coloque o nome do projeto como jspteste e selecione a verso do Tomcat que acabamos de configurarcomo Runtime Environment:

    39

  • Material do Treinamento Java para Desenvolvimento Web

    3) Clique em Finish. Se for perguntado sobre a mudana para a perspectiva Java EE, selecione No.

    O ltimo passo configurar o projeto para rodar no Tomcat que configuramos:

    1) Na aba Servers, clique com o boto direito no Tomcat e v em Add and remove projects:

    2) Agora basta selecionar o nosso projeto jspteste e clicar em Add:

    Captulo 6 - Novo projeto web - Novo projeto - Pgina 40

  • Material do Treinamento Java para Desenvolvimento Web

    D uma olhada nas pastas que foram criadas e na estrutura do nosso projeto nesse instante. Vamos analis-la em detalhes!

    6.2 - Anlise do resultado final

    Olhe bem a estrutura de pastas e ver algo parecido com isso:

    A pasta src j velha conhecida. onde vamos colocar nosso cdigo fonte Java. Em um projeto normal doEclipse, essas classes seriam compiladas para a pasta bin, mas no WTP costume se usar a pasta build quevemos no nosso projeto.

    Nosso projeto ser composto de muitas pginas web e vamos querer acess-lo no navegador web. Jsabemos que o servidor acessado pelo http://localhost:8080, mas como ser que dizemos que queremosacessar o nosso projeto e no eventuais outros projetos?

    Captulo 6 - Novo projeto web - Anlise do resultado final - Pgina 41

    http://localhost:8080,

  • Material do Treinamento Java para Desenvolvimento Web

    No Java EE, trabalhamos com o conceito de diferentes contextos web para diferenciar sites ou projetosdistintos em um mesmo servidor. Na prtica, como uma pasta virtual que, quando acessada, remete a algumprojeto em questo.

    Por padro, o WTP gera o context name com o mesmo nome do projeto; no nosso caso, jspteste. Podemosmudar isso na hora de criar o projeto ou posteriormente indo em Project > Properties > Web Project Settingse mudando a opo Context Root. Repare que no necessrio que o nome do contexto seja o mesmo nomedo projeto.

    Agora sabemos que, para acessar o projeto na URL, usaremos: http://localhost:8080/jspteste/

    Mas o que ser que vai aparecer quando abrirmos essa URL? Ser que veremos todo o contedo doprojeto? Por exemplo, ser possvel acessar a pasta src que est dentro do nosso projeto? Tomara que no.

    Para solucionar isso, uma outra configurao importante no WTP: o Content Directory. Ao invs deabrir acesso a tudo, criamos uma pasta dentro do projeto e dizemos que ela a raiz (root) do contedo a serexibido no navegador. No WTP, por padro, criada a pasta WebContent, mas poderia ser qualquer outrapasta configurada na criao do projeto (outro nome comum de se usar web).

    Tudo que colocarmos na pasta WebContent ser acessvel na URL do projeto. Por exemplo, se que-remos uma pgina de boas vindas http://localhost:8080/jspteste/bemvindo.html criamos o arquivo jsp-teste/WebContent/bemvindo.html

    WEB-INF

    Mas repare que dentro da WebContent j h uma pasta chamada WEB-INF. Essa pasta extremamenteimportante para qualquer projeto web Java EE. Ela contm configuraes e recursos necessrios para nossoprojeto rodar no servidor.

    Boa parte das configuraes fica no arquivo web.xml dentro dessa pasta. Abra-o e veja sua estrutura, porenquanto bem simples:

    jspteste

    index.htmlindex.htmindex.jspdefault.htmldefault.htmdefault.jsp

    o bsico gerado pelo prprio WTP. Tudo o que ele faz definir o nome da aplicao e a lista de arquivosacessados que vo ser procurados por padro. Todas essas configuraes so opcionais.

    Captulo 6 - Novo projeto web - Anlise do resultado final - Pgina 42

    http://localhost:8080/jspteste/http://localhost:8080/jspteste/bemvindo.html

  • Material do Treinamento Java para Desenvolvimento Web

    Repare ainda que h uma pasta chamada lib dentro da WEB-INF. Muitos projetos web que vamos escrevervo precisar usar bibliotecas externas, como o driver do MySQL por exemplo. Copiamos todas elas para essapasta lib. Cuidado que podemos copiar apenas arquivos .jar para essa pasta.

    WEB-INF/lib

    O diretrio lib dentro do WEB-INF pode conter todas as bibliotecas necessrias para a aplicaoweb, evitando assim que o classpath da mquina que roda a aplicao precise ser alterado.Alm do mais, cada aplicao web poder usar suas prprias bibliotecas com suas verses es-pecficas! Voc vai encontrar projetos open source que somente fornecem suporte e respondemperguntas aqueles usurios que utilizam tal diretrio para suas bibliotecas, portanto evite ao m-ximo o uso do classpath global.

    H ainda um ltimo diretrio, oculto no Eclipse, o WEB-INF/classes. Para rodarmos nossa aplicao noservidor, precisamos ter acessado s classes compiladas (no necessariamente ao cdigo fonte). Por isso,nossos .class so colocados nessa pasta dentro do projeto. Repare que o WTP compila nossas classes napasta build e depois automaticamente copia as coisas para o WEB-INF/classes.

    Note que a pasta WEB-INF muito importante e contm recursos vitais para o funcionamento do projeto.Imagine se o usurio tiver acesso a essa pasta! Cdigos compilados (facilmente descompilveis), bibliotecaspotencialmente sigilosas, arquivos de configurao internos etc.

    Para que isso no acontea, a pasta WEB-INF com esse nome especial uma pasta invisvel ao usuriofinal. Isso quer dizer que se algum acessar a URL http://localhost:8080/jspteste/WEB-INF ver apenasuma pgina de erro (404).

    Resumo final das pastas

    src - cdigo fonte Java (.java)

    build - onde o WTP compila as coisas (.class)

    WebContent - content directory (pginas, imagens, css etc vo aqui)

    WebContent/WEB-INF/ - pasta oculta com configuraes e recursos do projeto

    WebContent/WEB-INF/lib/ - bibliotecas .jar

    WebContent/WEB-INF/classes/ - arquivos compilados so copiados para c

    META-INF

    A pasta META-INF opcional mas gerada pelo WTP. onde fica o arquivo de manifesto comousado em arquivos .jar.

    Captulo 6 - Novo projeto web - Anlise do resultado final - Pgina 43

    http://localhost:8080/jspteste/WEB-INF

  • Material do Treinamento Java para Desenvolvimento Web

    6.3 - Exerccios: primeira pgina

    Vamos testar nossas configuraes criando um arquivo HTML de teste.

    1) Crie o arquivo WebContent/index.html com o seguinte contedo:

    Novo projeto jspteste

    2) Inicie (ou reinicie) o Tomcat clicando no boto de play verde na aba Servers.

    3) Acesse no navegador: http://localhost:8080/jspteste/index.html

    Teste tambm a configurao do welcome-file: http://localhost:8080/jspteste/