corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Gerando um aplicativo CRUD JavaServer Faces 2.0 de um banco de dados

Neste tutorial, você utiliza o NetBeans IDE para criar um aplicativo da Web que interage com um banco de dados back-end. O aplicativo proporciona a você a habilidade de visualizar e modificar os dados contidos no banco de dados, conhecida como o recurso CRUD (Create, Read, Update, Delete). O aplicativo desenvolvido precisa do:

  • JavaServer Faces (JSF) 2.0 para páginas Web front-end, manipulação de validação e gerenciamento do ciclo de solicitação-resposta.
  • Java Persistence API (JPA) 2.0 utilizando EclipseLink para gerar classes de entidade do banco de dados e gerenciar transações. (EclipseLink é a implementação de referência para JPA e é o provedor de persistência padrão para o servidor GlassFish.)
  • Enterprise JavaBeans (EJB) 3.1, que proporciona EJBs sem estado que acessam as classes de entidade e contém a lógica corporativa do aplicativo.

O IDE oferece dois assistentes que geram todos os códigos do aplicativo. O primeiro é o assistente para Classes de entidade do banco de dados que permite gerar as classes de entidade a partir do banco de dados fornecido. Após criar as classes de entidade, você utiliza o assistente de Classes de entidade a partir de páginas JSF para criar EJBs e beans gerenciados do JSF para as classes de entidade, bem como um conjunto de páginas Facelets para manipular as exibições dos dados da classe de entidade. A seção final do tutorial, Explorando o aplicativo, é opcional e oferece vários exercícios para ajudá-lo a entender melhor o aplicativo e a se familiarizar mais com o IDE.

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

Conteúdo

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

Software ou recurso Versão necessária
NetBeans IDE conjunto 6.8, 6.9, 7.0, 7.1, Java EE
Java Development Kit (JDK) 6
Servidor GlassFish Código-fonte aberto edição 3.x
mysql-consult.zip (MySQL)
ou
javadb-consult.zip (JavaDB)
n/d

Observações:

  • O pacote NetBeans IDE Java EE também inclui o servidor GlassFish, um servidor compatível com Java EE 6, que é necessário para este tutorial.
  • Para o projeto de solução deste tutorial, baixe ConsultingAgencyJSF20.zip.

Criando o banco de dados

Este tutorial utiliza um banco de dados de agência de consultoria nomeado como consultar. O banco de dados não está incluído quando você instala o IDE, portanto, você precisa primeiro criar o banco de dados para seguir este tutorial.

O banco de dados consultar foi projetado para demonstrar o escopo do suporte do IDE para manipular uma variedade de estruturas de banco de dados. Portanto, o banco de dados não é um exemplo de melhores práticas ou desenho de banco de dados recomendado. Em vez disso, ele tenta incorporar muitos recursos relevantes encontrados em um desenho de banco de dados. Por exemplo, o banco de dados consultar contém todos os tipos de relacionamento possíveis, chaves primárias compostas e muitos tipos de dados diferentes. Consulte as tabelas abaixo para obter uma visão geral mais detalhada da estrutura do banco de dados.

Notas:

  • Este tutorial utiliza o servidor de banco de dados MySQL, mas também é possível concluir este tutorial utilizando o banco de dados do servidor JavaDB. Para criar o banco de dados no JavaDB, baixe e extraia o arquivo javadb-consult.zip. O arquivo contém scripts SQL para criar, soltar e preencher o banco de dados consultar.
  • Para mais informações sobre a configuração do IDE para trabalhar com MySQL, consulte o tutorial Conectando a um banco de dados MySQL.
  • Para mais informações sobre configurar o IDE para trabalhar com JavaDB, consulte o tutorial Trabalhando com o banco de dados Java DB (Derby).


Efetue as etapas a seguir para criar um banco de dados e conecte-o a partir do IDE.

  1. Baixe o mysql-consult.zip e extraia o arquivo para o seu sistema local. Ao extrair o arquivo, você verá os scripts SQL para criação e preenchimento do banco de dados. O arquivo também tem scripts para omissão de tabelas.
  2. Na janela Serviços, expanda o nó Bancos de dados, clique com o botão direito do mouse no nó MySQL e escolha Iniciar servidor.
  3. Clique com o botão direito do mouse no nó Servidor MySQL e escolha Criar banco de dados.
  4. Digite consult como o Nome do banco de dados na caixa de diálogo Criar banco de dados MySQL. Clique em OK. Um novo nó aparece sob o nó Bancos de dados (jdbc:mysql://localhost:3306/consult [raiz no esquema padrão]).
  5. Clique com o botão direito do mouse no novo nó e escolha Conectar.
  6. Escolha Arquivo > Abrir arquivo no menu principal e navegue para o arquivo extraído mysql_create_consult.sql. Clique em Abrir. O arquivo abre automaticamente no editor SQL.
    Captura de tela do editor SQL
  7. Certifique-se de que o banco de dados consult esteja selecionado na lista suspensa Conexão na barra de ferramentas do editor SQL e clique no botão Executar SQL(botão Executar SQL).

    Quando você clica em Executar SQL, a saída seguinte aparece na janela Saída.
    Captura de tela da janela Saída

Examinando a estrutura do banco de dados

Para ver se as tabelas foram criadas corretamente, expanda o nó Tabelas sob o nó da conexão do banco de dados. É possível expandir um nó da tabela para ver as colunas, índices e quaisquer chaves estrangeiras. É possível clicar com o botão direito do mouse em uma coluna e escolher Propriedades para visualizar informações adicionais sobre a coluna.

Captura de tela da janela Serviços

Nota: se você não ver nenhuma tabela sob o nó Tabelas, clique com o botão direito do mouse no nó Tabelas e escolha Atualizar.

Ao observar a estrutura do banco de dados consultar, você pode ver que o banco de dados contém tabelas que possuem uma variedade de relacionamentos e vários tipos de campo. Ao criar classes de entidade a partir de um banco de dados, o IDE gera automaticamente o código apropriado para os vários tipos de campo.

Diagrama entidade-relacionamento do banco de dados consult

A tabela seguinte descreve as tabelas encontradas no banco de dados consult.

Tabela de banco de dados Descrição Recursos de design
CLIENT Um cliente da agência de consultoria Chave primária composta, não-gerada (cujos campos não constituem uma chave estrangeira)
CONSULTANT Um funcionário da agência de consultoria que os clientes podem contratar Inclui um campo de retomada do tipo LONG VARCHAR
CONSULTANT_STATUS O status de um consultor na agência de consultoria (por exemplo, Ativo e Inativo são status possíveis) Chave primária não-gerada do tipo CHAR
RECRUITER Um funcionário da agência de consultoria responsável por conectar clientes e consultores  
PROJECT Um projeto que um cliente possui com os consultores da agência de consultoria Chave primária composta, não-gerada que inclui dois campos constituindo uma chave estrangeira para a tabela CLIENT
BILLABLE Um conjunto de horas trabalhadas por um consultor em um projeto, o qual a agência de consultoria cobra do cliente relevante Inclui um campo de artefato do tipo CLOB
ADDRESS O endereço de cobrança de um cliente  
PROJECT_CONSULTANT Tabela unida indicando quais consultores estão atribuídos no momento a determinados projetos Faz referência cruzada entre PROJECT e CONSULTANT, a primeira possui uma chave primária composta

O banco de dados consultar inclui uma variedade de relacionamentos. Ao criar classes de entidade a partir de um banco de dados, o IDE gera automaticamente as propriedades do tipo Java apropriado com base no tipo SQL das colunas. A tabela seguinte descreve os relacionamentos de entidade do banco de dados consultar. (Os relacionamentos inversos não são mostrados.)

Entidade Entidade relacionada Informações sobre relacionamento Descrição
CLIENT RECRUITER nulo um para um com edição manual; nulo um para muitos caso não seja editado CLIENT possui muitos RECRUITERs e RECRUITER possui zero ou um CLIENT (se não for manualmente editado)
CLIENT ADDRESS não-nulo um para um CLIENT possui um ADDRESS e ADDRESS possui zero ou um CLIENT
CLIENT PROJECT não-nulo um para muitos; em uma entidade de projeto, o valor do campo do cliente é parte da chave primária do projeto CLIENT possui muitos PROJECTS e PROJECT possui um CLIENT
CONSULTANT PROJECT muitos a muitos muitos
CONSULTANT BILLABLE não nulo um para muitos CONSULTANT possui muitos BILLABLEs e BILLABLE possui um CONSULTANT
CONSULTANT_STATUS CONSULTANT não-nulo um para muitos CONSULTANT_STATUS possui muitos CONSULTANTs e CONSULTANT possui um CONSULTANT_STATUS
CONSULTANT RECRUITER nulo um para muitos CONSULTANT possui zero ou um RECRUITER e RECRUITER possui muitos CONSULTANTs
BILLABLE PROJECT não-nulo um para muitos BILLABLE possui um PROJECT e PROJECT possui muitos BILLABLES

Agora que o banco de dados está criado, você pode criar o aplicativo da Web e utilizar o assistente para Classes de entidade do banco de dados com base nas tabelas do banco de dados.

Criando o projeto de aplicativo da Web

Neste exercício, você cria um projeto da Web e adiciona a estrutura JavaServer Faces ao projeto. Quando você criar o projeto, irá selecionar JavaServer Faces no painel Frameworks do assistente para Novo projeto.

  1. Escolha Arquivo > Novo projeto (Ctrl-Shift-N; &#8984-Shift-N no Mac) no menu principal.
  2. Na categoria Java Web, selecione Aplicativo da Web. Clique em Próximo.
  3. Digite ConsultingAgency para o nome do projeto e defina a localização do projeto. Clique em Próximo.
  4. Defina o servidor como GlassFish e defina a versão de Java EE para Java EE 6 Web. Clique em Próximo.
  5. No painel Frameworks, selecione a opção JavaServer Faces. Clique em Concluir.

Quando você clica em Terminar, o IDE gera o projeto de aplicativo Web e abre index.xhtml no editor.

Gerando as classes de entidade do banco de dados

Depois de se conectar a um banco de dados do IDE, você pode utilizar o assistente para Classes de entidade do banco de dados para gerar rapidamente as classes de entidade com base nas tabelas do banco de dados. O IDE pode gerar classes de entidade para cada tabela que você selecionar, e também pode gerar quaisquer classes de entidade necessárias para tabelas relacionadas.

  1. Na janela Projetos, clique com o botão direito do mouse no nó do projeto ConsultingAgency e escolha Novo > Classes de entidade do banco de dados. (Se esta opção não estiver na lista, escolha Outros. Em seguida, no assistente de arquivo, selecione a categoria Persistência e, a seguir, Classes de entidade do banco de dados.)
  2. Selecione Nova fonte de dados na lista suspensa Fonte de dados para abrir a caixa de diálogo Criar fonte de dados.
  3. Digite jdbc/consult como o Nome JNDI e selecione jdbc:mysql://localhost:3306/consult [raiz no esquema padrão] como a Conexão do banco de dados.
    Caixa de diálogo Criar fonte de dados
  4. Clique em OK para fechar a caixa de diálogo e retornar ao assistente. As tabelas no banco de dados consult aparecem na caixa de listagem Tabelas disponíveis.
  5. Clique no botão Adicionar todos para selecionar todas as tabelas contidas no banco de dados. Clique em Avançar.
    Assistente para novas entidades do banco de dados
  6. Digite jpa.entities como o nome do pacote.
  7. Verifique se as caixas de verificação para gerar as consultas nomeadas e criar uma unidade persistente estão marcadas.

    Observação para o NetBeans IDE 6.8

    Clique no botão Criar unidade de persistência para abrir a caixa de diálogo Criar unidade de persistência e usar os valores padrão.

    Assistente para Novas entidades do banco de dados
  8. Clique em Terminar.

Ao clicar em terminar, o IDE gera as classes de entidade no pacote jpa.entities do projeto.

Ao utilizar o assistente para criar classes de entidade de um banco de dados, o IDE examina os relacionamentos entre as tabelas do banco de dados. Na janela Projetos, se você expandir o nó do pacote jpa.entities, poderá ver que o IDE gerou uma classe de entidade para todas as tabelas, exceto para a tabela PROJECT_CONSULTANT. O IDE não criou uma classe de entidade para PROJECT_CONSULTANT porque a tabela é uma tabela unida.

captura de tela da janela Projetos

O IDE também gerou duas classes adicionais para as tabelas com chaves primárias compostas: CLIENT e PROJECT. As classes de chave primária dessas tabelas (ClientPK.java e ProjectPK.java) possuem PK anexado ao nome.

Se você observar o código gerado para as classes de entidade, poderá ver que o assistente adicionou anotações @GeneratedValue aos campos ID gerados automaticamente e anotações @Basic(optional = "false") a alguns dos campos das classes de entidade. Com base nas anotações @Basic(optional = "false"), o assistente para Páginas JSF de classes de entidade pode gerar o código que inclui verificações para evitar violações de coluna não-nulas para esses campos.


Gerando páginas JSF de classes de entidade

Agora que as classes de entidade estão criadas, você pode criar a interface Web para exibir e modificar os dados. Você utilizará o assistente para Páginas JSF de classes de entidade para gerar páginas JavaServer Faces. O código gerado pelo assistente tem base nas anotações de persistência contidas nas classes de entidade.

Para cada classe de entidade o assistente gera o seguinte:

  • um bean de sessão sem estado

    Observação. No NetBeans IDE 7.0 e 7.1, o IDE tabém gera o arquivo AbstractFacade.java que contém a lógica de negócios para criação, recuperação, modificação e remoção das instâncias de entidade, e cada um dos beans de sessão estende AbstractFacade.java.

  • um bean gerenciado no escopo da sessão JSF
  • um diretório contendo quatro arquivos Facelets para os recursos CRUD (Create.xhtml, Edit.xhtml, List.xhtml e View.xhtml)
  • classes de utilitário utilizadas pelos beans gerenciados JSF (JsfUtil, PaginationHelper)
  • um conjunto de propriedades para mensagens localizadas e uma entrada correspondente no arquivo de configuração Faces do projeto (um arquivo faces-config.xml é criado, caso um já não exista).
  • arquivos web auxiliares, incluindo um estilo de folha padrão para componentes convertidos e um arquivo de modelo de Facelets

Para gerar as páginas JSF:

  1. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e escolha Novo > Páginas JSF de classes de entidade para abrir o assistente. (Se essa opção não estiver na lista, escolha Outros. Em seguida, no assistente de arquivo, selecione a categoria JavaServer Faces e, a seguir, Páginas JSF das classes de entidade.)

    A caixa Classes de entidade disponíveis lista sete classes de entidade contidas no projeto. O quadro não lista as classes incorporadas (ClientPK.java e ProjectPK.java).
  2. Clique em Adicionar todos para mover todas as classes para o quadro Classes de entidade selecionadas.
    Assistente para Novas páginas JSF de classes de entidade
    Clique em Avançar.
  3. Na etapa 3 do assistente, Gerar classes e páginas JSF, digite jpa.session no Pacote de Bean de sessão JPA.
  4. Digite jsf para o pacote de classes JSF.
  5. Insira '/resources/Bundle' no campo Nome de conjunto de localização. Isso gerará um pacote nomeado como recursos no qual o arquivo Bundle.properties residirá. (Se deixá-lo em branco, o conjunto de propriedades será criado no pacote padrão do projeto.)
    Assistente para novas páginas JSF de classes de entidade, etapa 3

    Para que o IDE se ajuste melhor às convenções do projeto, você pode personalizar qualquer arquivo gerado pelo assistente. Clique no link Personalizar modelo para modificar os modelos de arquivo usados pelo assistente.
    Lista suspensa Personalizar modelos
    Em geral, é possível acessar e fazer alterações em todos os modelos mantidos pelo IDE utilizando o Gerenciador de modelos (Ferramentas > Modelos).

  6. Clique em Terminar. O IDE gera os beans de sessão sem estado no pacote jpa.session, escopo de sessão e beans gerenciados com JSF no pacote jsf. Cada bean de sessão sem estado manipula as operações da classe de entidade correspondente, incluindo a criação, edição e destruição de instâncias da classe de entidade por meio da API de persistência Java. Cada Bean gerenciado JSF implementa a interface javax.faces.convert.Converter e realiza as tarefas de conversão das instâncias da classe de entidade correspondente para objetos String e vice-versa.

Se expandir o nó Páginas da Web, você poderá ver que o IDE gerou uma pasta de cada uma das classes de entidade. Cada pasta contém os arquivos Create.xhtml, Edit.xhtml, List.xhtml e View.xhtml. O IDE também modificou o arquivo index.xhtml inserindo links em cada uma das páginas List.xhtml.

Captura de tela do diretório Páginas Web na janela Projetos

Cada Bean gerenciado do JSF é específico dos quatro arquivos Facelets correspondentes e inclui o código que chama os métodos no Bean de sessão apropriado.

Expanda o nó da pasta recursos para localizar a folha de estilo jsfcrud.css padrão gerada pelo assistente. Se abrir a página de boas-vindas do aplicativo (index.xhtml) ou o arquivo de modelo Facelets (template.xhtml) no editor, você verá que contém uma referência à folha de estilo.

<h:outputStylesheet name="css/jsfcrud.css"/>

O arquivo de modelo Facelets é utilizado por cada um dos quatro arquivos Facelets para cada classe de entidade.

Se expandir o nó Pacotes de código-fonte, você pode ver os Beans de sessão, os Beans gerenciados do JSF, as classes de utilitário e o conjunto de propriedades que o assistente gerou.

captura de tela do diretório Pacotes de código-fonte na janela Projetos

O assistente também gerou o arquivo de configuração Faces (faces-config.xml) a fim de registrar a localização do conjunto de propriedades. Se expandir o nó Arquivos de configuração e abrir faces-config.xml no editor XML, você pode ver que a entrada seguinte está incluída.

<application>
    <resource-bundle>
        <base-name>/resources/Bundle</base-name>
        <var>bundle</var>
    </resource-bundle>
</application>

Além disso, se expandir o novo pacote recursos, será possível encontrar o arquivo Bundle.properties que contém mensagens para o idioma padrão do cliente. As mensagens são obtidas das propriedades da classe de entidade.

Para adicionar um novo conjunto de propriedades, clique com o botão direito do mouse no arquivo Bundle.properties e escolha Personalizar. A caixa de diálogo Personalizador permite adicionar novas localidades ao seu aplicativo.


Explorando o aplicativo

Agora que seu projeto contém classes de entidade, Beans de sessão EJB para controlar as classes de entidade e um front-end desenvolvido para JSF para exibir e modificar bancos de dados, tente executar o projeto para ver os resultados.

A seguir, encontra-se uma série de exercícios breves opcional que ajuda você a familiarizar-se com o aplicativo, bem como com os recursos e funcionalidades que o IDE oferece.

Examinando o projeto concluído

  1. Para executar o projeto, clique com o botão direito do mouse no nó do projeto na janela Projetos e escolha Executar ou clique no botão Executar projeto (botão Executar projeto) na barra de ferramentas principal.

    Quando a página de boas-vindas do aplicativo é exibida, aparece uma lista de links que permite visualizar as entradas contidas em cada uma das tabelas do banco de dados.
    Página de boas-vindas do ConsultingAgency no navegador
    Os links foram adicionados à página de boas-vindas (index.xhtml) quando o assistente Páginas JSF de classes de entidade foi concluído. Tais links são fornecidos como pontos de entrada nas páginas Facelets que proporcionam funcionalidade CRUD no banco de dados da agência de consultoria.
    <h:body>
        Hello from Facelets
        <h:form>
            <h:commandLink action="/address/List" value="Show All Address Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/billable/List" value="Show All Billable Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/client/List" value="Show All Client Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/consultant/List" value="Show All Consultant Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/consultantStatus/List" value="Show All ConsultantStatus Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/project/List" value="Show All Project Items"/>
        </h:form>
        <h:form>
            <h:commandLink action="/recruiter/List" value="Show All Recruiter Items"/>
        </h:form>
    </h:body>
  2. Clique no link 'Mostrar todos os itens do consultor'. Ao observar o código acima, é possível ver que a página de destino é /consultant/List.xhtml. (No JSF 2.0, a extensão do arquivo é deduzida devido à navegação implícita.)
    Página Consultants
    Atualmente, o banco de dados não contém nenhum dado de amostra. É possível adicionar dados manualmente clicando no link 'Criar novo consultor' e utilizando o formulário Web fornecido. A página /consultant/Create.xhtml é carregada para que seja exibida. Também é possível executar um script SQL no IDE para preencher as tabelas com os dados de amostra. As subseções seguintes exploram ambas as opções.

É possível clicar no link do índice para voltar à lista de links da página de boas-vindas. Os links oferecem uma visualização dos dados contidos em cada tabela do banco de dados e carrega o arquivo List.xhtml de cada pasta de entidade para que seja exibida. Conforme será demonstrado posteriormente, após adicionar os dados às tabelas, outros links serão exibidos em cada entrada a fim de permitir que você visualize (View.xhtml), edite (Edit.xhmtl) e destrua os dados de um único registro da tabela.

Preenchendo o banco de dados com um script SQL

Execute o script fornecido, que gera dados de amostra para as tabelas do banco de dados. O script (mysql_insert_data_consult.sql) está incluído no arquivo zipado Consultando banco de dados da agência que pode ser baixado da tabela de software requerido.

Dependendo do servidor de banco de dados com que estiver trabalhando (MySQL ou JavaDB), você pode executar o script fornecido, que gera dados de amostra para as tabelas de banco de dados. Para o MySQL, esse é o script mysql_insert_data_consult.sql. Para o JavaDB, esse é o script javadb_insert_data_consult.sql. Ambos os scripts são incluídos nos respectivos arquivos, que podem ser baixados da tabela de software requerido.

  1. Escolha Arquivo > Abrir arquivo no menu principal e, em seguida, navegue até o local do script no seu computador. Clique em Abrir. O arquivo se abre automaticamente no editor SQL do IDE.
  2. Certifique-se de que o banco de dados consult esteja selecionado na lista suspensa Conexão na barra de ferramentas do editor SQL.
    Captura de tela do editor SQL e do script de inserção de dados

    Clique com o botão direito do mouse no editor e escolha Executar instrução ou clique no botão Executar SQL (botão Executar SQL). É possível ver o resultado da execução do script na janela Saída.

  3. Reinicie o servidor GlassFish. Essa é uma etapa necessária para habilitar o servidor a fim de recarregar e efetuar o cache dos novos dados contidos no banco de dados consultar. Para fazer isso, clique na aba do servidor GlassFish na janela Saída (a aba do servidor GlassFish exibe o registro do servidor.) e, em seguida, clique no botão Reiniciar servidor ( botão Reiniciar servidor ) na margem esquerda. O servidor para e, em seguida, reinicia.
  4. Execute o projeto novamente e clique no link 'Mostrar todos os itens do consultor'. Você verá que a lista não está mais vazia.
    página Consultants exibindo as entradas da tabela

Explorando o suporte do editor em páginas Facelets

  1. Abra a página /consultant/List.xhtml no editor. A linha 8 indica que a página depende do arquivo Facelets template.xhtml para que seja processada.
    <ui:composition template="/template.xhtml">
    
    

    Para exibir os números das linhas, clique com o botão direito do mouse na margem esquerda do editor e escolha Exibir números de linhas.

  2. Utilize a caixa de diálogo Ir para arquivo do IDE para abrir template.xhtml. Pressione Alt-Shift-O (Ctrl-Shift-O no Mac) e, em seguida, comece a digitar modelo.
    Caixa de diálogo Ir para arquivo

    Clique em OK (ou pressione Enter).

  3. O modelo aplica as marcações <ui:insert> para inserir o conteúdo de outros arquivos no título e corpo. Coloque seu cursor na marca <ui:insert>, pressione Ctrl-Espaço para chamar uma janela pop-up de documentação.
    Pop-up da documentação exibida no editor

    É possível pressionar Ctrl-Espaço nas marcações JSF e seus atributos para chamar o pop-up da documentação. A documentação exibida é retirada das descrições fornecidas na Documentação da biblioteca de marcas JSF oficial.

  4. Volte para o arquivo List.xhtml (pressione Ctrl-Tab). As marcações <ui:define> são utilizadas para definir o conteúdo que será aplicado ao título e ao corpo do modelo. Esse padrão é utilizado nos quatro arquivos Facelets (Create.xhtml, Edit.xhtml, List.xhtml e View.xhtml) gerados para cada classe de entidade.
  5. Coloque seu cursor em qualquer uma das expressões EL utilizadas nas mensagens localizadas contidas no arquivo Bundle.properties. Pressione Ctrl-Espaço para visualizar a mensagem traduzida.
    Pop-up do preenchimento automático de mensagens do pacote de propriedades

    Na imagem acima, você pode ver que a expressão EL determina 'List', que é aplicada ao título do modelo e pode ser verificada na página processada no navegador.

  6. Navegue para a parte inferior do arquivo e localize o código do link Criar novo consultor (linha 92). Trata-se do seguinte:
    <h:commandLink action="#{consultantController.prepareCreate}" value="#{bundle.ListConsultantCreateLink}"/>
  7. Pressione Ctrl-Espaço no atributo action do commandLink para chamar a janela pop-up da documentação.

    O atributo ação indica o método que manipula a requisição quando o link é clicado no navegador. É fornecida a seguinte documentação:

    MethodExpression que representa a ação do aplicativo que será chamada quando este componente for ativado pelo usuário. A expressão deve ser interpretada como um método público que não toma nenhum parâmetro e retorna um Object (o toString() do qual é chamado para gerar o resultado lógico) que é passado para o NavigationHandler deste aplicativo.

    Em outras palavras, o valor de ação se refere normalmente a um método em um bean gerenciado do JSF que é avaliado como uma String. Então, a string é utilizada pelo NavigationHandler do JSF para encaminhar a requisição para a visualização apropriada. É possível verificar isso nas etapas a seguir.
  8. Coloque o cursor no consultantController e pressione Ctrl-Espaço. O auto-completar código do editor indica que consultantController é um Bean gerenciado do JSF.
    Auto-completar código chamado no editor
  9. Mova o cursor para prepareCreate e pressione Ctrl-Espaço. O auto-completar código lista os métodos contidos no Bean gerenciado ConsultantController.
    Auto-completar código chamado no editor
  10. Pressione Ctrl (&#8984 no Mac) e, em seguida mova o mouse para prepareCreate. É formado um link, que permite ir diretamente para o método prepareCreate() no Bean gerenciado ConsultantController.
    Link exibido no editor
  11. Clique no link e visualize o método prepareCreate() (exibido abaixo).
    public String prepareCreate() {
        current = new Consultant();
        selectedItemIndex = -1;
        return "Create";
    }
    O método retorna Criar. O NavigationHandler coleta informações em segundo plano e aplica a string Criar ao caminho que indica a visualização enviada em resposta à requisição: /consultant/Criar.xhtml. (No JSF 2.0, a extensão do arquivo é deduzida devido à navegação implícita.)

Explorando a integridade do banco de dados com validação de campo

  1. Na página Lista de consultores do navegador, clique no link 'Criar novo consultor'. Conforme demonstrado na subseção anterior, isso carrega a página /consultant/Create.xhtml para que seja processada.
  2. Insira os detalhes a seguir no formulário. Temporariamente, deixe os campos RecruiterId e StatusId em branco.

    Campo Valor
    ConsultantId 2
    Email
    Password jack.smart
    HourlyRate 75
    BillableHourlyRate 110
    HireDate 07/22/2008
    Retornar Sou um ótimo consultor. Contrate-me - Você não vai se arrepender!
    RecruiterId ---
    StatusId ---
  3. Clique em Salvar. Ao clicar em salvar, um erro de validação é sinalizado no campo StatusId.
    Página Criar novo consultor com dados de amostra
    Por que aconteceu isso? Re-examine o diagrama entidade de relacionamento do banco de dados da agência de consultoria. Conforme apresentado na tabela de relacionamentos acima, as tabelas CONSULTANT e CONSULTANT_STATUS compartilham um relacionamento um para muitos não nulo. Portanto, todas as entradas da tabela CONSULTANT devem conter uma referência a uma entrada na tabela CONSULTANT_STATUS. Isso é indicado pela chave estrangeira consultant_fk_consultant_status que vincula as duas tabelas.

    É possível visualizar as chaves estrangeiras contidas nas tabelas expandindo o nó Chaves estrangeiras da tabela na janela Serviços (Ctrl-5; &#8984-5 no Mac).

    Janela Serviços - chaves estrangeiras da tabela consultant
  4. Para solucionar o erro de validação, selecione entity.ConsultantStatus[statusId=A] na lista suspensa StatusId.

    Nota: você pode deixar o campo RecruiterId em branco. Conforme indicado no diagrama entidade-relacionamento do banco de dados, há um relacionamento não-nulo um para muitos entre as tabelas CONSULTANT e RECRUITER, indicando que tais entradas de CONSULTANT não precisam estar associadas a uma entrada de RECRUITER.
  5. Clique em Salvar. É exibida uma mensagem indicando que a entrada consultante foi salva com êxito. Se clicar em Exibir todos os itens do consultor, verá a nova entrada listada na tabela.

Em geral, as páginas Facelets geradas produzem erros em entradas do usuário que introduzem:

  • campos vazios em células de tabela não-nula.
  • modificações de dados que não podem ser alterados (por exemplo, chaves primárias).
  • inserção de dados que não são do tipo correto.
  • modificações de dados quando uma visualização do usuário não estiver mais sincronizada com o banco de dados.

Editando as classes de entidade

Na subseção anterior, você viu como a lista suspensa StatusId forneceu a desagrádavel opção entity.ConsultantStatus[statusId=A]. Você já deve ter notado que o texto exibido em cada item desta lista suspensa é a representação de uma string de cada entidade ConsultantStatus encontrada (por exemplo, o método toString() da classe de entidade é chamado).

Essa subseção demonstra como você pode utilizar o autocompletar de código, a documentação e o suporte à navegação do editor para chegar a essa conclusão. Também oferece uma mensagem mais agradável para a lista suspensa.

  1. Abra o arquivo /consultant/Create.xhtml no editor. Trata-se do formulário Criar novo consultor que você acaba de visualizar no navegador. Role para baixo até o código da lista suspensa StatusId (ilustrado em negrito abaixo).
        <h:outputLabel value="#{bundle.CreateConsultantLabel_resume}" for="resume" />
        <h:inputTextarea rows="4" cols="30" id="resume" value="#{consultantController.selected.resume}" title="#{bundle.CreateConsultantTitle_resume}" />
        <h:outputLabel value="#{bundle.CreateConsultantLabel_statusId}" for="statusId" />
        <h:selectOneMenu id="statusId" value="#{consultantController.selected.statusId}" title="#{bundle.CreateConsultantTitle_statusId}" required="true" requiredMessage="#{bundle.CreateConsultantRequiredMessage_statusId}">
            <f:selectItems value="#{consultantStatusController.itemsAvailableSelectOne}"/>
        </h:selectOneMenu>
        <h:outputLabel value="#{bundle.CreateConsultantLabel_recruiterId}" for="recruiterId" />
        <h:selectOneMenu id="recruiterId" value="#{consultantController.selected.recruiterId}" title="#{bundle.CreateConsultantTitle_recruiterId}" >
            <f:selectItems value="#{recruiterController.itemsAvailableSelectOne}"/>
        </h:selectOneMenu>
    </h:panelGrid>
  2. Examine o valor aplicado à marcação <f:selectItems>. O atributo value determina o texto exibido de cada item na lista suspensa.

    Pressione Ctrl-Espaço em itemsAvailableSelectOne. O auto-completar código do editor indica que o método getItemsAvailableSelectOne() do ConsultantStatusController retorna uma raiz de objetos SelectItem.
    Auto-completar código chamado no editor
  3. Pressione Ctrl (&#8984 no Mac) e, em seguida, mova o mouse sobre itemsAvailableSelectOne. É formado um link que permite ir diretamente para o método getItemsAvailableSelectOne() no código-fonte da entidade ConsultantStatus. Clique neste link.
  4. Coloque o cursor sobre o valor de retorno SelectItem[] na assinatura do método e pressione Ctrl-Espaço para chamar a janela pop-up da documentação.
    Pop-up da documentação chamada na classe Java

    Clique no ícone do navegador Web (Ícone do navegador Web ) na janela da documentação para abrir o Javadoc em um navegador Web externo.

    Como é possível visualizar, a classe SelectItem pertence à estrutura JSF. O componente UISelectOne, conforme mencionado na documentação, é representado pela marca <h:selectOneMenu> da marcação que você examinou na etapa 1 acima.
  5. Pressione Ctrl (&#8984 no Mac) e, em seguida, mova o mouse sobre findAll(). É exibido um pop-up com a assinatura do método.
    Pop-up da assinatura do método
    É possível observar que aqui o ejbFacade.findAll() retorna uma Lista de objetos ConsultantStatus.
  6. Vá para JsfUtil.getSelectItems. Coloque o mouse sobre getSelectItems e pressione Ctrl (&#8984 no Mac), a seguir, clique no link exibido.

    Nota: lembre-se que JsfUtil é uma das classes de utilitário gerada ao concluir o assistente classes de entidade da página JSF.

    O método efetua o loop através da lista de entidades (por exemplo, Lista de objetos ConsultantStatus), criando um SelectItem para cada. Conforme indicado abaixo em negrito, cada SelectItem é criado utilizando o objeto da entidade e um label para o objeto.
    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (selectOne) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Object x : entities) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }
    O rótulo é criado utilizando o método toString() da entidade e corresponde à representação do objeto quando processado na resposta. (Consulte a definição do construtor SelectItem(java.lang.Object value, java.lang.String label) no Javadoc.)

    Agora que averiguou que o método toString() da entidade é o método processado no navegador ao visualizar os itens em uma lista suspensa, modifique o método toString() de ConsultantStatus.
  7. Abra a classe de entidade ConsultantStatus no editor. Modifique o método toString para retornar statusId e descrição. Trata-se das propriedades da entidade que correspondem às duas colunas da tabela CONSULTANT_STATUS.
    public String toString() {
        return statusId + ", " + description;
    }
  8. Execute o projeto novamente. Quando o navegador exibir a página de boas-vindas, clique no link Exibir todos os itens do consultor e, em seguida, em Criar novo consultor.

    Inspecione a lista suspensa StatusId. Você verá que agora exibe o ID de status e a descrição do registro contido na tabela CONSULTANT_STATUS do banco de dados.
    Exibição da lista suspensa StatusId no navegador

Consulte também

Para mais informações sobre o JSF 2.0, consulte os recursos a seguir.