corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Utilizando o Hibernate em um aplicativo da Web

Neste tutorial, você utiliza o NetBeans IDE para criar e implantar um aplicativo da Web que exibe dados a partir de um banco de dados. O aplicativo da Web utiliza a estrutura do Hibernate como a camada de persistência para recuperar e armazenar objetos Java simples antigos (POJOs) em um banco de dados relacional.

O Hibernate é a estrutura que fornece ferramentas para o mapeamento relacional de objeto (ORM). O tutorial demonstra como adicionar suporte para a estrutura do Hibernate ao IDE e criar os arquivos necessários do Hibernate. Depois de criar objetos Java e configurar o aplicativo para utilizar o Hibernate, você cria um bean gerenciado JSF e páginas JSF 2.0 para exibir dados.

Antes de começar este tutorial, talvez você queira se familiarizar com os seguintes documentos.

Nota. Se estiver utilizando o NetBeans IDE 6.7, consulte Utilizando Hibernate em um aplicativo da Web no NetBeans IDE 6.7.

Conteúdo

 O conteúdo desta página se aplica ao IDE NetBeans 6.8 e 6.9

Para seguir este tutorial, você precisa dos seguintes recursos e softwares.

Software ou recurso Versão necessária
NetBeans IDE Versão do Java, 6.8 e 6.9
Java Development Kit (JDK) Versão 6
GlassFish Server Open Source Edition 3.0.1
Servidor de banco de dados MySQL Versão 5.x
Banco de dados Sakila Plug-in disponível na Central de Atualizações

Notas.

É possível baixar um arquivo zip do projeto concluído.

Criando o banco de dados

Este tutorial utiliza um banco de dados MySQL chamado sakila, uma amostra gratuita do banco de dados MySQL que está disponível no site do MySQL. O banco de dados sakila não está incluído quando você instala o IDE, portanto, você precisa primeiro criar o banco de dados para seguir este tutorial.

Para criar o banco de dados sakila, baixe e instale o plug-in do banco de dados de amostra utilizando o gerenciador de plug-ins. Depois que você instala o plug-in, o banco de dados sakila é adicionado à lista de bancos de dados na caixa de diálogo Criar banco de dados MySQL.

Para obter mais informações sobre a configuração do IDE para trabalhar com MySQL, consulte o tutorial Conectando a um banco de dados MySQL.

  1. Abra o gerenciador de plug-ins e instale o plug-in de banco de dados de amostra Sakila.
  2. Depois da instalação do plug-in, inicie o banco de dados MySQL, expandindo o nó Bancos de dados na janela Serviços, clicando com o botão direito do mouse no nó Servidor MySQL e escolhendo Iniciar.
  3. Clique com o botão direito do mouse no nó Servidor MySQL e escolha Criar banco de dados.
  4. Selecione o banco de dados Sakila a partir da lista suspensa Novo nome de banco de dados, na caixa de diálogo Criar banco de dados MySQL. Clique em OK.
    Captura de tela da caixa de diálogo Criar banco de dados MySQL

    Quando você clicar em OK, um nó do Salkila será exibido sob o nó Servidor MySQL.

  5. Clique com o botão direito do mouse e escolha Conectar.

Quando você clicar em Conectar, o nó de conexão de um banco de dados do banco de dados Sakila (jdbc:mysql://localhost:3306/sakila [nome de usuário em Padrão]) será listado sob o nó Bancos de dados. Quando uma conexão é aberta, você pode visualizar os dados no banco de dados, expandindo o nó da conexão.

Criando o projeto de aplicativo da Web

Nesse exercício, você criará um projeto de aplicativo da Web e adicionará as bibliotecas do Hibernate ao projeto. Quando criar o projeto, você selecionará Hibernate no painel Frameworks do assistente para Novo projeto e especificará o banco de dados.

  1. Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione Aplicação Web na categoria Java Web e clique em Próximo.
  2. Digite DVDStore para o nome do projeto e defina a localização do projeto.
  3. Desmarque a opção Utilizar pasta dedicada, se ela estiver selecionada. Clique em Avançar.

    Para este tutorial, não é necessário copiar as bibliotecas do projeto em uma pasta dedicada, pois você não precisará compartilhar bibliotecas com outros usuários.

  4. Defina o servidor como GlassFish 3 e defina a versão de Java EE para Java EE 6 Web. Clique em Próximo.
  5. Selecione a caixa de verificação JavaServer Faces e utilize as bibliotecas padrão JSF 2.0.
  6. Selecione a caixa de verificação Hibernate 3.2.5.
  7. Selecione o banco de dados sakila na lista suspensa Conexão de banco de dados. Clique em Terminar.

Nota: se o banco de dados sakila não estiver disponível como uma opção no painel Frameworks no assistente, verifique se a conexão está listada no nó Bancos de dados na janela Serviços. Se a conexão não existir, você precisa criar a conexão do banco de dados.

Painel Frameworks do assistente para Novo projeto

Quando você clica em Terminar, o IDE cria o projeto de aplicativo da Web e abre o arquivo hibernate.cfg.xml e index.xhtml no editor.

Se expandir o nó Bibliotecas na janela Projetos, você pode ver que o IDE adicionou as bibliotecas do Hibernate ao projeto.

Captura de tela da janela Projetos mostrando as bibliotecas do Hibernate

Modificando o arquivo de configuração do Hibernate

Quando você cria um novo projeto que utiliza a estrutura do Hibernate, o IDE cria automaticamente o arquivo de configuração hibernate.cfg.xml na raiz do classpath de contexto do aplicativo (na janela Arquivos, src/java). O arquivo está localizado em <pacotes padrão> no nó Pacotes de código-fonte na janela Projetos. O arquivo de configuração contém informações sobre a conexão do banco de dados, os mapeamentos de recurso e outras propriedades da conexão. É possível editar o arquivo utilizando o editor de visualização múltipla ou editar o XML diretamente no editor XML.

Neste exercício, você editará as propriedades padrão especificadas em hibernate.cfg.xml para ativar o log das declarações SQL e para ativar o gerenciamento de contexto da sessão do Hibernate.

  1. Abra hibernate.cfg.xml na aba Desenho. É possível abrir o arquivo expandindo o Pacotes de códigos-fonte > <pacotes padrão> na janela Projetos e clicando duas vezes em hibernate.cfg.xml.
  2. No editor XML com várias visualizações, expanda o nó Propriedades da configuração em Propriedades opcionais.
  3. Clique em Adicionar para abrir a caixa de diálogo Adicionar propriedade do Hibernate.
  4. Na caixa de diálogo, selecione a propriedade hibernate.show_sql e defina o valor para verdadeiro. Isso permite o registro de depuração das declarações SQL.
    Caixa de diálogo Adicionar propriedade hibernate para a propriedade hibernate.show_sql property
  5. Expanda o nó Propriedades de miscelânea e clique em Adicionar.
  6. Na caixa de diálogo, selecione properties hibernate.current_session_context_class e defina o valor para thread para ativar o gerenciamento de contexto automático da sessão do Hibernate.
    Caixa de diálogo Adicionar propriedade hibernate para propriedades hibernate.current_session_context_class

    Se clicar na aba XML no editor, você pode ver o arquivo na visualização XML. O arquivo deve ter uma aparência semelhante a esta:

    <hibernate-configuration>
        <session-factory name="session1">
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">######</property>
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.current_session_context_class">thread</property>
        </session-factory>
    </hibernate-configuration>
  7. Salve as alterações feitas no arquivo.

É possível fechar o arquivo porque não é necessário editá-lo novamente.

Criando o arquivo de ajuda HibernateUtil.java

Para utilizar o Hibernate, é necessário criar uma classe assistente que manipule a inicialização e acesse SessionFactory do Hibernate para obter um objeto Sessão. A classe chama configure() e carrega o arquivo de configuração hibernate.cfg.xml e constrói SessionFactory para obter o objeto Sessão.

Nesta seção, você utiliza o assistente para Novo arquivo a fim de criar a classe helper HibernateUtil.java.

  1. Clique com o botão direito do mouse no nó Pacotes de códigos-fonte e selecione Novo > Outro para abrir o assistente para Novo arquivo.
  2. Selecione Hibernate na lista Categorias e HibernateUtil.java na lista Tipos de arquivo. Clique em Próximo.
  3. Digite HibernateUtil para o nome da classe e dvdrental para o pacote. Clique em Terminar.
Captura de tela do assistente HibernateUtil

Quando você clica em Terminar, HibernateUtil.java se abre no editor. É possível fechar o arquivo porque não é necessário editá-lo.

Gerando arquivos de mapeamento do Hibernate e classes Java

Neste tutorial, você utiliza um POJO (plain old Java object) para representar os dados em cada uma das tabelas do banco de dados a ser utilizado. A classe Java especifica os campos das colunas nas tabelas e utiliza setters e getters simples para recuperar e gravar os dados. Para mapear os POJOs para as tabelas, utilize um arquivo de mapeamento do Hibernate ou utilize anotações na classe.

É possível utilizar os Arquivos de mapeamento do Hibernate e POJOs obtidos de um assistente de banco de dados para criar vários POJOs e arquivos de mapeamento com base nas tabelas de banco de dados. Ao utilizar o assistente, você seleciona todas as tabelas para as quais deseja POJOs e arquivos de mapeamento e o IDE gera os arquivos com base nas tabelas do banco de dados e adiciona as entradas de mapeamento no hibernate.cfg.xml. Ao utilizar o assistente, você pode escolher os arquivos que deseja que o IDE gere (somente os POJOs, por exemplo) e selecionar as opções de geração de código (gerar código que utilize anotações EJB 3, por exemplo).

Nota. O IDE também oferece assistentes para ajudar você a criar POJOs individuais e arquivos de mapeamento do rascunho.

Criando o arquivo de engenharia reversa do Hibernate

Se quiser utilizar os arquivos de mapeamento Hibernate e POJOs de um assistente de banco de dados, primeiro é necessário criar um arquivo de engenharia reversa hibernate.reveng.xml. Os arquivos de mapeamento Hibernate e POJOs de um assistente de banco de dados precisa de hibernate.reveng.xml e hibernate.cfg.xml.

O arquivo de engenharia reversa permite ter maior controle sobre a estratégia de mapeamento do banco de dados. O assistente para engenharia reversa do Hibernate cria um arquivo de engenharia reversa com uma configuração padrão que pode ser editada no editor XML.

Para criar o arquivo de engenharia reversa do Hibernate, realize as etapas seguintes.

  1. Clique com o botão direito do mouse no nó Pacotes de código-fonte na janela Projetos e escolha Novo > Outro para abrir o assistente para Novo arquivo.
  2. Selecione o assistente para engenharia reversa do Hibernate na categoria Hibernate. Clique em Avançar.
  3. Especifique hibernate.reveng como o Nome do arquivo e src/java para a Pasta. Clique em Próximo.
  4. Selecione hibernate.cfg.xml na lista suspensa Arquivo de configuração, caso não esteja selecionado.
  5. Selecione as tabelas seguintes em Tabelas disponíveis e clique em Adicionar para adicionar as tabelas a Tabelas selecionadas.
    • actor
    • category
    • film
    • film_actor
    • film_category
    • language

    Clique em Terminar.

    Novo assistente para engenharia reversa do Hibernate

O assistente gera um arquivo de engenharia reversa hibernate.reveng.xml e abre o arquivo no editor. É possível fechar o arquivo de engenharia reversa porque não será necessário editar o arquivo.

Para obter detalhes sobre como trabalhar com o arquivo hibernate. reveng.xml, consulte o Capítulo 5. Controlando a engenharia reversa no Guia de referência das ferramentas do Hibernate.

Criando arquivos de mapeamento do Hibernate e POJOs

É possível utilizar os Arquivos de mapeamento do Hibernate e POJOs obtidos de um assistente de banco de dados para gerar arquivos. O assistente pode gerar um POJO e um arquivo de mapeamento correspondente para cada tabela que você selecionar no assistente. Os arquivos de mapeamento são arquivos XML que contêm dados sobre como as colunas das tabelas são mapeadas para os campos nos POJOs. Você precisa possuir os arquivos hibernate.reveng.xml e hibernate.cfg.xml para utilizar o assistente.

Para criar POJOS e arquivos de mapeamento utilizando um assistente, efetue as etapas a seguir.

  1. Clique com o botão direito do mouse no nó Pacotes de código-fonte na janela Projetos e escolha Novo > Outro para abrir o assistente para Novo arquivo.
  2. Selecione Arquivos de mapeamento do Hibernate e POJOs provenientes de um banco de dados na categoria Hibernate. Clique em Próximo.
  3. Certifique-se de que os arquivos hibernate.cfg.xml e hibernate.reveng.xml estejam selecionados nas listas suspensas.
  4. Selecione Recursos da linguagem JDK sob as opções Configurações gerais.
  5. Verifique se as opções Código de domínio e Mapeamentos XML do Hibernate estão selecionadas.
  6. Selecione dvdrental para o Nome do pacote. Clique em Terminar.
    Assistente de geração de arquivos de mapeamento do Hibernate e POJOs

Quando você clica em Terminar, o IDE gera POJOs e arquivos de mapeamento do Hibernate com os campos mapeados para as colunas especificadas em hibernate.reveng.xml. O IDE também adiciona entradas de mapeamento em hibernate.cfg.xml. É possível expandir o pacote dvdrental para ver os arquivos gerados pelo assistente.

Captura de dela da janela Projetos mostrando os POJOs gerados

É possível utilizar o assistente para mapeamento do Hibernate se quiser criar um arquivo de mapeamento do Hibernate que mapeie uma tabela específica para uma classe específica.

Para mais detalhes sobre como trabalhar com o arquivo hibernate.reveng.xml, consulte o Capítulo 5. Mapeamento O/R básico na Documentação de referência do Hibernate.

Criando a classe Helper FilmHelper.java

Agora você criará uma classe assistente no pacote dvdrental que será utilizada para efetuar consultas do Hibernate no banco de dados. Você utilizará o editor Hibernate Query Language (HQL) para construir e testar as consultas para recuperar dados. Depois de testar as consultas, serão criados métodos na classe assistente que constroem e executam as consultas. Em seguida, você chamará os métodos na classe de helper a partir de um Bean gerenciado JSP.

Criando a classe

Nesta seção, o assistente Novo arquivo é utilizado para criar a classe assistente FilmHelper.java no pacote dvdrental. Você criará uma sessão do Hibernate, chamando getSessionFactory em HibernateUtil.java e alguns métodos assistentes para criar as consultas para recuperar dados do banco de dados. Você chamará os métodos do helper a partir de páginas JSP.

  1. Clique com o botão direito do mouse no nó do pacote de códigos-fonte dvdrental e selecione Novo > Classe Java para abrir o assistente para Novo arquivo.
  2. Digite FilmHelper como nome da classe.
  3. Verifique se o Pacote é dvdrental. Clique em Terminar.
  4. Adicionando o código seguinte (em negrito) para criar uma sessão do Hibernate.
    public class FilmHelper {
    
        Session session = null;
    
        public FilmHelper() {
            this.session = HibernateUtil.getSessionFactory().getCurrentSession();
        }
    
    }
  5. Corrija as importações (org.hibernate.Sessione) e salve as alterações.

Agora você modificará FilmHelper.java para adicionar métodos do que consultam o BD.

Enumerando títulos de filme e recuperando atores utilizando uma consulta HQL

Neste exercício, você criará uma consulta Hibernate Query Language (HQL) que consulta o banco de dados para recuperar uma lista de filmes da tabela Film. A seguir, adicionará um método que consulta as tabelas Actor e Film_actor para procurar os atores que atuam em um filme específico.

A tabela Filme possui 1000 registros, de modo que o método para recuperar a lista de filmes deveria ser capaz de recuperar os registros com base na chave primária filmId. O editor HQL será utilizado para construir e testar a consulta HQL. Depois de ter criado a consulta correta, você adicionará o método à classe que pode gerar a consulta apropriada.

  1. Clique com o botão direito do mouse em hibernate.cfg.xml na janela Projetos e escolha Executar consulta HQL para abrir o editor de consultas HQL.
  2. Selecione hibernate.cfg na lista suspensa na barra de ferramentas.
  3. Teste a conexão, digitando o seguinte no editor e clicando no botão Executar consulta HQL ( botão Executar consulta HQL ) na barra de ferramentas.
    from Film

    Quando clica em Executar consulta HQL, você pode ver os resultados da consulta na janela inferior do editor de consultas HQL.

    Assistente para Gerar arquivos de mapeamento do Hibernate e POJOs

    Se clicar no botão SQL, você pode ver a consulta SQL equivalente.

    select film0_.film_id as col_0_0_ from sakila.film film0_
  4. Digite a consulta seguinte para recuperar os registros na tabela Filme, onde o id do filme está entre 100 e 200.
    from Film as film where film.filmID between 100 and 200

    A janela de resultado exibe uma lista de registros. Agora que a consulta testada retorna os resultados desejados, utilize a consulta na classe assistente.

  5. Adicione o método seguinte getFilmTitles a FilmHelper.java para recuperar os filmes, onde o id do filme está entre um certo intervalo especificado pelas variáveis startID e endID.
    public List getFilmTitles(int startID, int endID) {
        List<Film> filmList = null;
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery ("from Film as film where film.filmId between '"+startID+"' and '"+endID+"'");
            filmList = (List<Film>) q.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return filmList;
    }
  6. Adicione o método a seguir getActorsByID que recupera os atores de um filme específico. O método constrói a consulta utilizando filmId como a variável de entrada.
    public List getActorsByID(int filmId){
        List<Actor> actorList = null;
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery ("from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')");
            actorList = (List<Actor>) q.list();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return actorList;
    }
  7. Corrija as importações e salve as alterações.

    Quando corrige suas importações, você escolhe java.util.List e org.hibernate.Query.

Adicionando métodos adicionais do helper

Agora você adicionará métodos adicionais ao assistente que criam consultas com base em uma variável de entrada. É possível verificar as consultas no editor de consultas HQL.

  1. Adicione o método seguinte para recuperar uma lista de categorias de acordo com filmId.
    public Category getCategoryByID(int filmId){
        List<Category> categoryList = null;
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Category as category where category.categoryId in (select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId='" + filmId + "')");
            categoryList = (List<Category>) q.list();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return categoryList.get(0);
    }
  2. Adicione o método seguinte para recuperar um único filme de acordo com o filmId.
    public Film getFilmByID(int filmId){
    
        Film film = null;
    
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Film as film where film.filmId=" + filmId);
            film = (Film) q.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return film;
    }
  3. Adicione o método seguinte para recuperar o idioma do filme de acordo com o filmId.
    public String getLangByID(int langId){
    
        Language language = null;
    
        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery("from Language as lang where lang.languageId=" + langId);
            language = (Language) q.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return language.getName();
    }

Criando o Bean gerenciado JSF

Neste exercício, você criará um bean gerenciado JSF. Os métodos do bean gerenciado são utilizados para exibir dados nas páginas JSF e para acessar métodos na classe assistente para recuperar registros. A especificação JSF 2.0 permite utilizar anotações em uma classe bean para identificar a classe como um bean gerenciado JSF, especificar o escopo e um nome para o bean.

Para criar o bean gerenciado, execute as seguintes etapas.

  1. Clique com o botão direito do mouse no nó do pacote dvdrental e escolha Novo > Outro.
  2. Selecione Bean gerenciado JSF na categoria JavaServer Faces. Clique em Avançar.
  3. Digite FilmController para Nome da classe.

    Você usará o nome filmController do Bean gerenciado como o valor para inputText e commandButton na página JSF index.xhtml ao chamar métodos no Bean.

  4. Selecione dvdrental no Pacote.
  5. Digite filmController como o nome que será utilizado para o bean gerenciado.
  6. Defina escopo como sessão. Clique em Concluir.
Assistente Novo bean gerenciado JSF

Ao clicar em Terminar, o IDE gera a classe bean e abre a classe no editor. O IDE adicionou as anotações @ManagedBean e @SessionScoped e o nome do Bean.

@ManagedBean(name="filmController")
@SessionScoped
public class FilmController {

    /** Creates a new instance of FilmController */
    public FilmController() {
    }

}

  1. Adicione os campos seguintes (em negrito) à classe.
    @ManagedBean(name="filmController")
    @SessionScoped
    public class FilmController {
        int startId;
        int endId;
        DataModel filmTitles;
        FilmHelper helper;
        private int recordCount = 1000;
        private int pageSize = 10;
    
        private Film current;
        private int selectedItemIndex;
    }
  2. Adicione o código seguinte (em negrito) para criar a instância do FilmController e recuperar os filmes.
    /** Creates a new instance of FilmController */
    public FilmController() {
        helper = new FilmHelper();
        startId = 1;
        endId = 10;
    }
    
    public FilmController(int startId, int endId) {
        helper = new FilmHelper();
        this.startId = startId;
        this.endId = endId;
    }
    
    public Film getSelected() {
        if (current == null) {
            current = new Film();
            selectedItemIndex = -1;
        }
        return current;
    }
    
    
    public DataModel getFilmTitles() {
        if (filmTitles == null) {
            filmTitles = new ListDataModel(helper.getFilmTitles(startId, endId));
        }
        return filmTitles;
    }
    
    void recreateModel() {
        filmTitles = null;
    }
  3. Adicione os métodos seguintes usados para exibir a tabela e explorar as páginas.
    public boolean isHasNextPage() {
            if (endId + pageSize <= recordCount) {
                return true;
            }
            return false;
        }
    
        public boolean isHasPreviousPage() {
            if (startId-pageSize > 0) {
                return true;
            }
            return false;
        }
    
        public String next() {
            startId = endId+1;
            endId = endId + pageSize;
            recreateModel();
            return "index";
        }
    
        public String previous() {
            startId = startId - pageSize;
            endId = endId - pageSize;
            recreateModel();
            return "index";
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public String prepareView(){
            current = (Film) getFilmTitles().getRowData();
            return "browse";
        }
        public String prepareList(){
            recreateModel();
            return "index";
        }
    

    Os métodos que retornam "index" ou "browse" solicitarão o manipulador de navegação JSF para tentar abrir uma página denominada index.xhtml ou browse.xhtml. A especificação JSF 2.0 permite a utilização de regras de navegação implícitas em aplicativos que utilizam a tecnologia Facelets. Nesse aplicativo, nenhuma regra de navegação está configurada em faces-config.xml. Ao invés disso, o manipulador de navegação irá tentar localizar a página adequada no aplicativo.

  4. Adicione os métodos seguintes que acessam a classe para recuperar detalhes adicionais do filme.
    
        public String getLanguage() {
            int langID = current.getLanguageByLanguageId().getLanguageId().intValue();
            String language = helper.getLangByID(langID);
            return language;
        }
    
        public String getActors() {
            List actors = helper.getActorsByID(current.getFilmId());
            StringBuffer totalCast = new StringBuffer();
            for (int i = 0; i < actors.size(); i++) {
                Actor actor = (Actor) actors.get(i);
                totalCast.append(actor.getFirstName());
                totalCast.append(" ");
                totalCast.append(actor.getLastName());
                totalCast.append("  ");
            }
            return totalCast.toString();
        }
    
        public String getCategory() {
            Category category = helper.getCategoryByID(current.getFilmId());
            return  category.getName();
        }
    
  5. Corrija suas importações (Ctrl-Shift-I) e salve suas alterações.

Você pode utilizar o autocompletar de código no editor para digitar seu código como mais facilidade.

Criando as páginas da Web

Neste exercício, serão criadas duas páginas da Web para exibir dados. Você modificará o index.xhtml gerado pelo IDE a fim de adicionar uma tabela que exibe os filmes no banco de dados. Em seguida, criará browse.xhtml para exibir detalhes do filme ao clicar no link "Visualizar" da tabela. Criará também uma página de modelo JSF utilizada por index.xhtml e browse.xhtml.

Para saber mais sobre a utilização de JSF 2.0 e modelos Facelets, consulte Introdução ao JavaServer Faces 2.0

Criando template.xhtml

Primeiro, você criará o modelo Facelets JSF template.xhtml utilizado na composição das páginas index.xhtml e browse.xhtml.

  1. Clique com o botão direito do mouse em DVDStore na janela Projetos e escolha Novo > Outro.
  2. Selecione Modelo Facelets na categoria JavaServer Faces. Clique em Avançar.
  3. Digite template em Nome do arquivo e escolha o primeiro estilo de layout CSS.
  4. Clique em Terminar.

    Quando você clica em Terminar, o arquivo template.xhtml é aberto no editor. O modelo contém o código padrão seguinte.

    <h:body>
    
        <div id="top" class="top">
            <ui:insert name="top">Top</ui:insert>
        </div>
    
        <div id="content" class="center_content">
            <ui:insert name="content">Content</ui:insert>
        </div>
    
    </h:body>
  5. Modifique o elemento <ui:insert> para alterar o nome gerado padrão para "corpo".
    <div id="content" class="center_content">
            <ui:insert name="body">Content</ui:insert>
    </div>
  6. Salve as alterações.

O conteúdo dentro do elemento <ui:define name="body"> em index.xhtml e browse.xhtml será inserido no local identificado com <ui:insert name="body">Content</ui:insert> no modelo.

Modificando index.xhtml

Quando você criou o aplicativo da Web, o IDE gerou automaticamente a página index.xhtml. Neste exercício, você modifica a página para exibir uma lista de títulos de filmes. A página JSF chama os métodos no Bean gerenciado JSF FilmController para recuperar a lista de filmes e exibir uma tabela com títulos e descrições dos filmes.

  1. Expanda a pasta Páginas da Web na janela Projetos e abra index.xhtml no editor.

    O assistente para novo projeto gerou a seguinte página index.xhtml padrão.

    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
            <title>Facelet Title</title>
        </h:head>
        <h:body>
            Hello from Facelets
        </h:body>
    </html>
  2. Modifique a página para que utilize os elementos JSF <ui:composition> e <ui:define> e adicione um elemento <h:form>.
    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
        <ui:composition template="./template.xhtml">
            <ui:define name="body">
                <h:form>
    
                </h:form>
            </ui:define>
        </ui:composition>
    </html>

    Quando você começa a digitar as marcas, o IDE adiciona a declaração da biblioteca de marcas xmlns:ui="http://java.sun.com/jsf/facelets".

    Os elementos <ui:composition> e <ui:define> são utilizados em combinação com o modelo de página que você criará. O elemento <ui:composition> faz referência à localização do modelo que será utilizado por essa página. O elemento <ui:define> faz referência à posição no modelo que o código ocupará.

  3. Adicione os seguintes links de navegação que chamam os métodos previous e next no Bean gerenciado JSF.
        <ui:define name="body">
                <h:form>
                    <h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/> 
                    <h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/> 
                </h:form>
        </ui:define>
  4. Adicione o seguinte elemento dataTable (em negrito) para gerar a tabela para exibir os itens recuperados.
                <h:form styleClass="jsfcrud_list_form">
                    <h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/> 
                    <h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/> 
                    <h:dataTable value="#{filmController.filmTitles}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Title"/>
                            </f:facet>
                            <h:outputText value="#{item.title}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Description"/>
                            </f:facet>
                            <h:outputText value="#{item.description}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value=" "/>
                            </f:facet>
                            <h:commandLink action="#{filmController.prepareView}" value="View"/>
                        </h:column>
                    </h:dataTable>
                    <br/>
                </h:form>
    
  5. Salve as alterações.

A página de índice exibirá agora uma lista de títulos de filmes no banco de dados. Cada linha da tabela inclui um link "Visualizar" que chama o método prepareView no bean gerenciado. O método prepareView retorna "browse" e abrirá o browse.xhtml.

Quando você digitar a marca <f:facet>, o IDE adicionará a declaração da biblioteca de marcas xmlns:f="http://java.sun.com/jsf/core.

Criando browse.xhtml

Agora você criará a página browse.xhtml para exibir os detalhes do filme selecionado. É possível utilizar o assistente Cliente de modelo Facelets para criar a página com base no modelo Facelets JSF template.xhtml que você criou.

  1. Clique com o botão direito do mouse em DVDStore na janela Projetos e escolha Novo > Outro.
  2. Selecione Cliente de modelo Facelets na categoria JavaServer Faces. Clique em Avançar.
    Modelo Facelets no assistente para novo arquivo
  3. Digite browse para o Nome do arquivo
  4. Localize o modelo da página clicando em Procurar para abrir a caixa de diálogo Procurar arquivos.
  5. Expanda a pasta Páginas da Web e selecione template.xhtml. Clique em Selecionar arquivo.
    Caixa de diálogo Selecionar modelo
  6. Selecione <ui:composition> em Marcação de raiz gerada. Clique em Terminar.

    Quando você clica em Terminar, o arquivo browse.xhtml se abre no editor com o código seguinte.

    <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
        template="./template.xhtml">
    
        <ui:define name="top">
            top
        </ui:define>
    
        <ui:define name="body">
            body
        </ui:define>
    
    </ui:composition>

    É possível ver que o novo arquivo especifica o arquivo template.xhtml e que a marcação <ui:define> possui a propriedade name="body"

  7. Adicione o código seguinte (em negrito) entre as marcas <ui:define> para criar o formulário e chamar os métodos no Bean gerenciado FilmController para recuperar os dados e preencher o formulário.
    <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
        template="./template.xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
    
            <ui:define name="top">
                top
            </ui:define>
    
            <ui:define name="body">
            
                <h:form>
                    <h:panelGrid columns="2">
                        <h:outputText value="Title:"/>
                        <h:outputText value="#{filmController.selected.title}" title="Title"/>
                        <h:outputText value="Description"/>
                        <h:outputText value="#{filmController.selected.description}" title="Description"/>
                        <h:outputText value="Genre"/>
                        <h:outputText value="#{filmController.category}"/>
    
                        <h:outputText value="Cast"/>
                        <h:outputText value="#{filmController.actors}"/>
    
    
                        <h:outputText value="Film Length"/>
                        <h:outputText value="#{filmController.selected.length} min" title="Film Length"/>
    
                        <h:outputText value="Language"/>
                        <h:outputText value="#{filmController.language}" title="Film Length"/>
    
                        <h:outputText value="Release Year"/>
                        <h:outputText value="#{filmController.selected.releaseYear}" title="Release Year">
                            <f:convertDateTime pattern="MM/dd/yyyy" />
                        </h:outputText>
                        <h:outputText value="Rental Duration"/>
                        <h:outputText value="#{filmController.selected.rentalDuration}" title="Rental DUration"/>
                        <h:outputText value="Rental Rate"/>
                        <h:outputText value="#{filmController.selected.rentalRate}" title="Rental Rate"/>
                        <h:outputText value="Replacement Cost"/>
                        <h:outputText value="#{filmController.selected.replacementCost}" title="Replacement Cost"/>
                        <h:outputText value="Rating"/>
                        <h:outputText value="#{filmController.selected.rating}" title="Rating"/>
                        <h:outputText value="Special Features"/>
                        <h:outputText value="#{filmController.selected.specialFeatures}" title="Special Features"/>
                        <h:outputText value="Last Update"/>
                        <h:outputText value="#{filmController.selected.lastUpdate}" title="Last Update">
                            <f:convertDateTime pattern="MM/dd/yyyy HH:mm:ss" />
                        </h:outputText>
                    </h:panelGrid>
                    <br/>
                    <br/>
                    <h:commandLink action="#{filmController.prepareList}" value="View All List"/>
                    <br/>
                </h:form>
    
            </ui:define>
        </ui:composition>
    </html>

    É possível ver que browse.xhtml e index.xhtml utilizarão o mesmo modelo de página.

  8. Salve as alterações.

Executando o projeto

O conceito básico do aplicativo está agora concluído. Agora você pode executar o aplicativo para verificar se tudo está funcionando corretamente.

  1. Clique em Executar projeto principal na barra de ferramentas principal ou clique com o botão direito do mouse no nó do aplicativo DVDStore na janela Projetos e escolha Executar.

    O IDE salva todos os arquivos alterados, constrói e implanta o aplicativo no servidor. O IDE abre a janela do navegador na URL http://localhost:8080/DVDStore/ que exibe a lista de filmes.

    Captura de tela do navegador exibindo a lista de filmes na página de índice
  2. No navegador, clique em "Visualizar" para carregar o browse.xhtml a fim de visualizar os detalhes do filme.

Fazendo download do projeto da solução

É possível baixar a solução para este tutorial como um projeto das formas a seguir:

  • Faça o download de um arquivo zip do projeto acabado.
  • Verifique os códigos-fonte do projeto a partir das amostras do NetBeans ao efetuar as etapas a seguir:
    1. Escolha Equipe > Subversão > Verificar no menu principal.
    2. Na caixa de diálogo Verificar, insira o repositório URL a seguir:
      https://svn.netbeans.org/svn/samples~samples-source-code
      Clique em Próximo.
    3. Clique em Navegador para abrir a caixa de diálogo Pasta de repositório do navegador.
    4. Expanda o nó raiz e selecione samples/javaee/DVDStoreEE6. Clique em OK.
    5. Especifique a pasta local para o código-fonte (a pasta local precisa estar vazia).
    6. Clique em Terminar.

      Ao clicar em Terminar, o IDE inicializa a pasta local como um repositório Subversão e verifica os códigos fonte do projeto.

    7. Clique em Abrir projeto na caixa de diálogo que aparece quando a retirada estiver completada.

    Notas.

    • A etapas de checkout de códigos-fonte a partir do Kenai se aplicam somente ao NetBeans IDE 6.8.
    • Você precisa de um cliente Subversão para verificar os códigos-fonte a partir do Kenai. Para saber mais sobre a instalação do Subversion, consulte a seção Configurando o Subversion no Guia do Subversion no NetBeans IDE.

Consulte também