De que se trata o artigo:

Dando sequência ao trabalho de criação de uma rede social usando JSF 2, EJB 3.1 e JPA 2, implementaremos a funcionalidade de envio de mensagens entre amigos para a rede social Java Friends.


Para que serve:

Durante o artigo, teremos a oportunidade de estudar o importante método EntityManager.find(), que permite executar buscas em bancos de dados de maneira eficiente e prática a partir de chaves primárias. Veremos também como trabalhar com relações 1-para-N em JPA, algo necessário em praticamente qualquer aplicação não trivial. Além disto, conheceremos alguns componentes JSF úteis para facilitar a seleção de um valor a partir de uma lista predeterminada, como se faz com a tag <select> de HTML.


Em que situação o tema é útil:

Frequentemente, uma aplicação deve pedir ao usuário que selecione um valor dentre vários já conhecidos previamente. É comum termos de recuperar dados de um banco de dados a partir de uma chave primária – o que é eficiente, também. Por fim, relacionamentos 1-para-N são necessários em inúmeras modelagens de bancos, e o desenvolvedor que utiliza JPA deve saber como lidar com eles.

Resumo DevMan:

Após implementar toda a lógica necessária para que a rede social Java Friends pudesse registrar usuários e os relacionamentos entre eles, vamos acrescentar a funcionalidade de enviar mensagens. Através desta funcionalidade, aprenderemos novos aspectos das tecnologias estudadas, tais como: persistir relações 1-para-N em JPA, apresentar listas para que o usuário selecione um item, a maneira mais prática e eficiente de recuperar uma entidade a partir da sua chave primária, etc. Além disto, teremos a oportunidade de rever outros conceitos, para firmá-los ao fim desta série de artigos.

No artigo EJB, JPA e JSF: uma amizade possível, criamos uma infraestrutura e um ambiente de desenvolvimento para as tecnologias EJB, JPA e JSF usando Eclipse e GlassFish v3. Posteriormente, no artigo EJB, JPA e JSF: uma amizade consolidada, implementamos a lógica de negócio de uma rede social, de modo que os usuários podiam adicionar pessoas à lista de amigos. Como agora os usuários têm amigos de fato, vamos implementar a capacidade de enviar mensagens entre amigos.

Ao implementar o envio de mensagens, revisaremos o padrão Data Access Object, pois, como será necessário gerenciar mensagens no banco de dados, criaremos uma classe DAO responsável por esta tarefa. Como outras classes precisarão de uma instância deste DAO, veremos novamente como fornecer este objeto através de injeção de dependências via EJB. Veremos também como recuperar atributos de um bean gerenciado a partir de outro, uma vez que será necessário trocar informações entre beans gerenciados.

Além de revisar o que já estudamos, aprenderemos como persistir relações 1-para-N em JPA e conheceremos o método find() da interface EntityManager, que permite recuperar objetos de maneira muito prática e eficiente a partir de chaves primárias. Estudaremos novos componentes JSF, usados para listar dados a serem selecionados – no nosso caso, através de um elemento <select>. Ao final, seremos apresentados a uma funcionalidade muito útil de JSF 2, a navegação implícita, que torna o processo de definição de regras de navegação muito menos burocrático.

Apresentando mensagens

Desde o começo, um requisito foi definido como obrigatório para nossa rede social: permitir que amigos trocassem mensagens entre si. É para isto, por exemplo, que criamos a entidade Mensagem. Agora que a lógica para registrar amizades entre usuários está pronta, podemos implementar esta funcionalidade.

Comecemos pelo passo mais simples: apresentar as mensagens recebidas ao usuário. Por questões de praticidade, vamos listar as mensagens na tela principal da aplicação. Portanto, adicionaremos um <div> no facelet principal.xhtml, logo abaixo da listagem de amigos, contendo também um título:


  <div id="mensagens-recebidas">
    <h2><h:outputText value="Mensagens recebidas" /></h2>

Dentro do <div> listaremos as mensagens em um elemento <ul>. Para fazê-lo, utilizaremos o componente <c:forEach> da JSTL, que iterará sobre todas as mensagens recebidas da pessoa autenticada. Este componente pode ser usado de várias maneiras, mas a que nos interessa é a mesma mostrada na seção “Listando amigos utilizando a biblioteca de tags JSTL” do segundo artigo, em que passamos ao atributo items da tag <c:forEach> um objeto iterável, e acessaremos cada um dos seus elementos através de uma variável cujo nome será passado ao atributo var. Para a situação atual, o objeto iterável é a lista de mensagens recebidas pelo usuário autenticado. O nome da variável pode ser qualquer um, mas “mensagem” é uma escolha natural.


  <ul>
  <c:forEach items="#{autenticacaoBean.pessoaAutenticada.mensagensRecebidas}" var="mensagem">

Para uma explicação mais detalhada sobre o funcionamento da tag <c:forEach>, veja a seção mencionada acima do artigo anterior desta série.

Dentro de <c:forEach> escreveremos o conteúdo que deve ser repetidamente adicionado à tela. No nosso caso, para cada mensagem, acrescentaremos um item <li> na lista <ul> previamente aberta. Cada um destes itens apresentará o título, o nome do remetente e o conteúdo da mensagem, como mostrado abaixo:


  <li>
      <strong><h:outputText value="#{mensagem.titulo}" /></strong><br />
      <small><h:outputText value="Enviada por #{mensagem.remetente.nome}" /></small><br/>
      <h:outputText value="#{mensagem.conteudo}" />
  </li> ... 

Quer ler esse conteúdo completo? Tenha acesso completo