Arquivo da Categoria ‘Aula CPWJ’

Aula 15: Oracle e Hibernate, fazendo uma busca

terça-feira, 19 de fevereiro de 2008

Sejam bem vindos, esta é a décima quinta aula de Programação Web em Java, para saber mais sobre o curso, começe em Curso de Programação Web em Java – CPWJ

Vamos construir uma aplicação de verdade usando Java e Web e o modelo MVC. Já sabemos lidar com java, xhtml e css e um pouco de teoria sobre o MVC. Vamos colocar tudo pra funcionar?

Definindo o que será nosso primeiro programa: um sistema de busca. Vamos começar com um formulário simples com uma caixa de texto e um botão buscar, que quando clicado leva a outra página com a lista de sites com a palavra chave procurada.

Eu prometi que o conteúdo seria apresentado com o banco de dados mysql, porém tive uma seqüência de problemas com o hibernate mais mysql. Não quiz perder tempo com os detalhes. Eu não trabalho com o mysql, mas com o Oracle. Acredito que vocês possam encontrar material sobre o uso do mysql e hibernate, porém eu estou com pressa para publicar logo este material e como tenho experiência com Oracle é com ele mesmo que vou continuar. A forma de trabalho é a mesma, mudando apenas o xml de conexão com o banco.

Para uso do Oracle faça o download do Oracle 10g Express Edition em http://www.oracle.com/technology/software/products/database/index.html. É uma versão limitada mas de uso gratuíto. (Debian, Mandriva, Novell, Red Hat, Ubuntu e Windows compatíveis conforme o site Oracle).

Após o processo de instalação crie um usuário “sbusca” com senha “suasenha”.

É só o que você precisa na parte do banco de dados, o restante ficará por conta do Hibernate.

Para a configuração do ambiente do Netbeans 6.0, você precisa das seguintes arquivos de biblioteca:

  • para conectar no banco:
    • classes12.jar
  • para o Hibernate:
    • ant-antlr-1.6.5.jar
    • asm-attrs.jar
    • asm.jar
    • cglib-2.1.3.jar
    • commons-collections-2.1.1.jar
    • commons-logging-1.0.4.jar
    • dom4j-1.6.1.jar
    • ehcache-1.2.3.jar
    • hibernate3.jar
    • jta.jar

O classes12.jar você encontra aqui mesmo:jdbc Oracle. As bibliotecas do Hibernate você encontra no site do Hibernate em http://www.hibernate.org/6.html. A opção de download do Core é suficiente. (hibernate3.jar está na raiz do zip e os outros no diretório lib)

Reserve os arquivos indicados acima, somente eles, em um diretório qualquer de sua máquina.

Abra agora o Netbeans e vamos começar a fazer a mágica. Após o processo de carga escolha o opção File/New Project…

Escolha a Categoria Web e o tipo de projeto Web Application conforme a figura abaixo:
Novo Projeto

Clique em Next e digite o nome do projeto e se quiser escolha outra localização para a pasta do projeto. O restante pode deixar como indicado na tela:
Novo Projeto (2)

Clique em Next e ative a biblioteca do Struts conforme a figura:
Novo Projeto (3)

Clicando em Finish o projeto estará criado.

Vamos instalar as bibliotecas hibernate e do oracle para uso no nosso projeto. Na aba Projects use o botão direito sobre o nome do projeto (sbusca) e clique em properties. Na janela “Project Properties – sbusca” clique em libraries nas Categorias e no botão “Add JAR/Folder”. Selecione todos os arquivos do diretório que você colocou os arquivos jar e confirme clicando em “OK”.

Criado o projeto e definido as bibliotecas que vamos utilizar, o próximo passo é o Hibernate. Esta biblioteca auxilia no acesso ao Banco de Dados. Implementa a persistência aos objetos, fazendo a ponte objeto/relacional.

Vamos configurar o Hibernate para conexão com o Oracle. Para isso vamos escrever um arquivo de configuração XML. Clique com o botão direito do mouse sobre “Source Package” na aba do projeto e escolha a opção “New/ XML Document”. Digite o nome do arquivo como “hibernate.cfg.xml” (xml é automaticamente preenchido digite somente hibernate.cfg). Clique em “Next” e “Finish”.

Digite ou copie o código de configuração da conexão com o Oracle: (sempre cuidado com as aspas em códigos fonte, o WordPress detona lembra-se?)

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@10.89.9.6:1521:orabkl</property>
<property name="connection.username">SBUSCA</property>
<property name="connection.password">suasenha</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<!--property name="dialect">org.hibernate.dialect.HSQLDialect</property-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache  -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<!-- Depois que executar uma vez a classe de teste elimine a linha seguinte. Esta linha provoca a exclusão de todas as tabelas e recriação.-->
<property name="hbm2ddl.auto">create</property>
<mapping resource="sbusca/Sites.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Para facilitar a codificação com o Hibernate vamos criar uma classe para a conexão e desconexão do banco de dados. Clique com o botão direito do mouse sobre “Source Package” na aba do projeto e escolha a opção “New\java class”. Chame a classe de “HibernateUtil” e defina o package como “util”:

HibernateUtil

Clique em finish e copie o código da classe:

package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
  private static final SessionFactory sessionFactory;
  static {
    try {
      // Create the SessionFactory from hibernate.cfg.xml
      sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
      // Make sure you log the exception, as it might be swallowed
      System.err.println("Initial SessionFactory creation failed." + ex);
      throw new ExceptionInInitializerError(ex);
    }
  }
  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }
}

Com a biblioteca carregada e as configurações do hibernate certas, vamos codificar uma classe Sites para representar um dado persistente. Clique em File/New File e escolha Categoria “java” e “File Types” igual a “Java Class”:

Nova Classe

Clique em “Next” e defina o nome da classe como Sites e o package como sbusca:

Nova Classe (2)

Clicando em “Finish” o Netbeans irá abrir a página com o código da Classe. Complete o código da classe criando os campos necessários:

package sbusca;
public class Sites {
  private Long id;
  private String nome;
  private String url;
  private String descricao;
  private String keyword;
  public Sites() {}
  public Long getId() {
    return id;
  }
  private void setId(Long id) {
    this.id = id;
  }
  public String getNome() {
    return nome;
  }
  public void setNome(String nome) {
    this.nome = nome;
  }
  public String getUrl() {
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  public String getDescricao() {
    return descricao;
  }
  public void setDescricao(String descricao) {
    this.descricao = descricao;
  }
  public String getKeyword() {
    return keyword;
  }
  public void setKeyword(String keyword) {
    this.keyword = keyword;
  }
}

Para o funcionamento perfeito do Hibernate são necessários alguns detalhes:

  • Um campo Id para ser usado como campo chave automático;
  • Funções Get e Set públicos para manipulação dos dados privados;

Após a criação da classe é necessário definir um arquivo de mapeamento Hibernate. Com o botão direito do mouse sobre “sbusca” em destaque na figura, escolha a opção “new” e “others”.
Conectando Hibernate

Na janela “New File” escolha a categoria “XML” e “File Type” “Xml Document”. Clique em “Next” e defina o nome do arquivo como “Sites.hbm.xml” (a extensão xml é automaticamente inserida). Clique em “Next” e por fim em “Finish”. Copie o código abaixo para realizar a amarração:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="sbusca.Sites" table="SITES">
<id name="id" column="SITES_ID">
<generator class="native"/>
</id>
<property name="nome"/>
<property name="url"/>
<property name="descricao"/>
<property name="keyword"/>
</class>
</hibernate-mapping>

Para verificar se tudo funcionou até aqui, vamos criar uma classe para ver se o hibernate está conseguindo criar os registros: (espero que já saiba como criar a classe depois de eu repetir mais de uma vez a seqüencia de teclas!)

package sbusca;
import org.hibernate.Session;
import util.HibernateUtil;
public class MaquinaDeBusca {
  public static void main(String[] args) {
    MaquinaDeBusca mgr = new MaquinaDeBusca();
    mgr.createAndStoreEvent("Tecnoclasta","http://www.tecnoclasta.com","Detonanto Tecnologia","java, tecnologia, astronáutica, astronomia");
    mgr.createAndStoreEvent("Uol Universo On-line","http://www.uol.com.br/","Universo On-line - O maior portal em língua portuguesa","portal, uol, sites, notícias");
    mgr.createAndStoreEvent("Portal Terra","http://www.terra.com.br/","Qual a sua Terra","portal, terra, notícias, sites");
    mgr.createAndStoreEvent("Folha de São Paulo","http://www.folha.uol.com.br/","O Jornal com Credibilidade","jornal, folha, notícias");
    HibernateUtil.getSessionFactory().close();
  }
  private void createAndStoreEvent(String nome, String url, String descricao, String keyword) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Sites umSite = new Sites();
    umSite.setNome(nome);
    umSite.setDescricao(descricao);
    umSite.setUrl(url);
    umSite.setKeyword(keyword);
    session.save(umSite);
    session.getTransaction().commit();
  }
}

Executando esta classe o NetBeans vai trabalhar um bocado, e no fim do processo tudo deverá funcionar. Veja você mesmo se foi criada a tabela e se os registros foram criados corretamente.

Observe que o hibernate elimina toda a necessidade de codificação em SQL. Isso facilita muito a manutenção e mesmo portar o sistema para um banco de dados diferente.

Um segundo teste do hibernate consiste em executar uma consulta. Mude a função main para esta, inclua uma nova função “buscaSites()” e execute a classe novamente:

public static void main(String[] args) {
  MaquinaDeBusca mgr = new MaquinaDeBusca();
  //String teste="store";
  String teste = "list";
  if (teste.equals("store")) {
    mgr.createAndStoreEvent("Tecnoclasta", "http://www.tecnoclasta.com", "Detonanto Tecnologia", "java, tecnologia, astronáutica, astronomia");
    mgr.createAndStoreEvent("Uol Universo On-line", "http://www.uol.com.br", "Universo On-line - O maior portal em língua portuguesa", "portal, uol, sites, notícias");
    mgr.createAndStoreEvent("Portal Terra", "http://www.terra.com.br", "Qual a sua Terra", "portal, terra, notícias, sites");
    mgr.createAndStoreEvent("Folha de São Paulo", "http://www.folha.uol.com.br", "O Jornal com Credibilidade", "jornal, folha, notícias");
  } else if (teste.equals("list")) {
    List sites = mgr.buscaSites("notícias");
    for (int i = 0; i < sites.size(); i++) {
      Sites umSite = (Sites) sites.get(i);
      System.out.println("Site: " + umSite.getNome() +": " + umSite.getDescricao()+ ", Url:"+umSite.getUrl());
    }
  }
  HibernateUtil.getSessionFactory().close();
} //fim da função main
public List buscaSites(String keyword) {
  Session session = HibernateUtil.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  List result = session.createQuery("from Sites where keyword like '"+ keyword+"'").list();
  session.getTransaction().commit();
  return result;
}

Dando certo será listado os sites da Uol, Terra e Folha.

Pensei em fazer isso em uma aula só, porém está ficando muito, muito longo. Então fica aqui a primeira parte do sistema de busca. Na próxima aula terminamos.

Dúvidas? vá para o fórum.

Aula 14: O modelo MVC

quinta-feira, 14 de fevereiro de 2008

Sejam bem vindos, esta é a décima quarta aula de Programação Web em Java, para saber mais sobre o curso, começe em Curso de Programação Web em Java – CPWJ.

Até a última aula de HTML e CSS descobrimos como preparar uma página para publicação na Internet. Porém estas página preparadas assim tem um problema: são estáticas. Uma vez escritas e copiadas para o servidor, permanecerão exatamente iguais em todos os detalhes.

Com o conteúdo de Java aprendemos como construir programas. Vamos juntar as duas coisas agora.

JSP é uma sigla para Java Server Pages, e é uma tecnologia desenvolvida pela Sun para permitir o uso do Java para produzir páginas dinâmicas na Web. É utilizada em conjunto com classes Java com regras específicas para atendimento a requisições dos usuários. Estas classes são os Servlets.

Revisando como funciona a Web

O cliente faz uma requisição através do navegador quando:

  • Digita um endereço na barra de endereço e envia;
  • Clica em um botão de envio de um formulário;
  • Modifica um dado em um formulário com código javascript relacionado;

Na ação do usuário esta requisição é enviada pela Internet (ou Intranet) até o servidor de Web e este faz uma série de ações:

  • Interpreta a requisição
  • Procura na pasta root o arquivo HTML pedido
  • Envia o arquivo de volta ao navegador do cliente

Por fim o navegador do cliente interpreta o código Html, css e “desenha” o resultado.

Páginas dinâmicas

Com as páginas dinâmicas a diferença está nas ações do servidor de WEB:

  • Interpreta a requisição e detectando um pedido para página dinâmica:
  • Aciona uma classe Servlet
  • A classe Servlet interpreta qual ação foi requisitada e aciona as classes adequadas
  • Após a execução das ações, é chamada a página JSP para preparar a resposta visuais à requisição. As páginas JSP possuem código para produção de uma página HTML ad-roc, isto é sob demanda.
  • O Servidor envia para o navegador cliente a página de resposta gerada

Observe que temos duas camadas de código para produção de uma página dinâmica: os Servlets e o JSP. Um modelo mais completo utiliza três camadas e é chamada MVC Model-View-Control. Vamos ver cada uma destas camadas:

Model

A camada Model (modelo) possui a representação das informações do programa. No nosso exemplo, esta camada irá implementar classes para representar as entidades envolvidas no programa. Por exemplo em um programa de frente de caixa, haveria classes para representar produtos, compras, notas fiscais, itens de notas fiscais, métodos de pagamento. Estas classes iriam também armazenar todas as ações que eventualmente o usuários necessitasse realizar sobre estas entidades. Normalmente as classes utilizam um sistema de banco de dados para fazer o armazenamento persistente. Utilizaremos a biblioteca Hibernate para facilitar a persistência dos dados. Iremos utilizar o banco de dados Mysql para os exemplos

View

A camada View (visão) é responsável por construir uma interface para interação do usuário. Ela prepara a apresentação da informação para que o usuário possa reagir as respostas e continuar utilizando o programa. Em Java utilizaremos páginas JSP com Jstl para produzir as páginas de resposta. Observe que a camada View não acessa diretamente o banco de dados, ela recebe normalmente objetos Collection geradas pelas classes da camada Model e produz código HMTL a partir deles. Percebeu porque tivemos uma longa aula sobre coleções? (revise)

Control

A camada Control (controle) é a camada que controla o processo. Cada requisição do usuário é primeiro interpretado pela camada de controle que determina qual ação deve ser executada no modelo e encaminha depois a resposta do modelo para a camada de visão. No nosso exemplo quem irá fazer toda a camada de controle será o Struts.

Preparem-se, na próxima aula um sistema de busca completo será nosso primeiro programa!

Arrumem suas máquinas:

Dúvidas? vá para o fórum.

Atraso na Aula do Curso Java e novidades

quinta-feira, 14 de fevereiro de 2008

Os alunos do curso de programação web em Java não precisam se preocupar, apesar do atraso desde terça-feira, pretendo publicar a primeira aula de JSP entre hoje e amanhã. O motivo do atraso é uma boa notícia para alguns: estou preparando um material também de Asp.NET.

Uma mudança na grade curricular do curso que leciono na faculdade me fez rever os conteúdos ministrados e estou sendo obrigado a acertar o material para os alunos presenciais. As aulas começaram nesta segunda-feira e está sendo uma correria.

Se houver interesse, após as aulas de Java, eu até poderia passar alguma coisa de Asp.NET. Se manifestem se houver interesse.

Aula 13: Exceções e tratamento de erros

terça-feira, 29 de janeiro de 2008

Sejam bem vindos, esta é a décima terceira aula de Programação Web em Java, para saber mais sobre o curso, começe em Curso de Programação Web em Java – CPWJ.

Hoje a aula é bem curta e semana que vem é carnaval e teremos folga. Aproveite para adiantar nas aulas e conseguir acompanhar o ritmo. Vamos falar de Exceções ou tratamento de erros em Java.

O sistema de exceções do Java é uma ferramenta para ajudar os programadores a reportar e manipular erros.

Sempre que uma função chamada em um programa puder gerar uma exceção o programador é obrigado a tomar uma ação. Esta ação pode ser a captura e tratamento do erro, ou simplesmente o lançamento do erro para outra função tratar. Vamos ver primeiro como tratar o erro:

Exemplo de tratamento/captura de erro típico: (Exception Catch)

public float dividir(int a, int b) {
  Float resultado;
  float r=0;
  try {  // Bloco try delimita a porção de código que pode apresentar erro
    resultado = new Float(a / b);
    r=resultado.floatValue(); //divisão executada armazena resultado
  } catch (ArithmeticException e) { //bloco catch trata o tipo de exceção indicado
    return 0; //divisão por zero
  } catch (Exception x) { //são permitidos vários blocos catch, um para cada tipo de exceção.
    //Exception é usada para qualquer tipo de exceção não específica encontrada
    //tratar aqui outros erros
  } finally { // é executada após o tratamento das exceções ou quando nenhuma exceção
    //é gerada normalmente quando é liberado os recursos usados na função
    resultado = null;
    System.out.println(r);
  }
  // após a execução das exceções ou de todo o bloco try, o fluxo prossegue deste ponto
  return r;
}

Lançamento de Exceções (Exception throwing)

Neste caso a função lança exceções para a função chamadora, isso é, quem deverá capturar o erro e tratá-lo é uma função que usa esta função para funcionar. Em outras palavras, a função escrita não trata o erro, simplesmente avisa que o erro aconteceu e interrompe seu processamento.

Exemplo de lançamento de erro:

public class File {
  public File(String nomeArquivo) throws FileNotFoundException {
    ...
    if (arquivo não encontrado ) {
      throw new FileNotFoundException();
    }
  }
}

“throws FileNotFoundException” na linha de declaração da função, indica que nesta função este tipo de exceção poderá ocorrer. Isso obriga o programador que usar esta função a tratar esta exceção (ou lançar para outro nível novamente).

“throws new FileNotFoundException();” indica que uma exceção foi detectada e avisa a máquina Java a respeito.

E por hoje é só.

Na Seqüência

  • dia 5 de Fevereiro: Carnaval. (não esqueçam a camisinha moçada!)
  • dia 12 de Fevereiro: Introdução a Jsp.

Dúvidas? vá para o fórum.

Procure os mais baratos Livros sobre a Web, Livros sobre Java, Livros HTML ou Livros CSS nas melhores lojas do Brasil.