Este é um post disponível para assinantes MVPEste post também está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Java EE 6 na Prática – Parte 2 - Java Magazine 81
A plataforma consiste em uma coletânea de outros padrões, como Servlets, JSF, JPA, etc., que permitem que desenvolvedores foquem na construção da lógica de negócio de suas aplicações, deixando serviços de infraestrutura sob a responsabilidade da plataforma. Esta é a segunda parte de uma série de artigos sobre o tema, portanto sugere-se a leitura da primeira parte na Edição anterior da Java Magazine.
Java Magazine 81
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 81
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 81
Java EE 6 na Prática – Parte 2
O que há de novo na plataforma Java Enterprise Edition
Esta é a segunda parte de uma série de artigos sobre a plataforma Java EE 6, iniciada na Edição 80 da Java Magazine. Naquela edição, apresentamos uma visão geral da plataforma Java Enterprise Edition 6, lançada em dezembro de 2009, e começamos o desenvolvimento de uma aplicação real utilizando a plataforma. Por meio desta aplicação, mostramos algumas novidades da nova versão, como: novas funcionalidades do JPA 2.0, Bean Validation e o CDI, Contexts and Dependency Injection.
Nesta edição, continuaremos a desenvolver o SisContrAm, nosso sistema de controle de ambulâncias, e mostraremos mais novidades do Java EE 6:
• Facelets: apresentado como framework para substituir o uso de JSP com JSF 1.x, Facelets agora foi incorporado à plataforma Java EE 6 e é a escolha padrão para a construção de páginas Web com JSF 2.0. Além de utilizar o padrão XHTML para construção das páginas, o que já traz algumas vantagens, Facelets permite a criação de decoradores que podem ser utilizados para aplicação de leiaute gráfico automaticamente em todas as páginas e criação de componentes visuais a serem reutilizados;
• API de Critérios: em versões anteriores da JPA (Java Persistence API), para recuperar objetos do banco de dados a única opção disponível era a criação de consultas em JPQL (Java Persistence Query Language). Com o JPA 2.0 agora é possível criar consultas de forma programática utilizando a API de Critérios. Consultas programáticas podem ser verificadas em tempo de compilação;
• Conversações: a introdução do CDI na plataforma Java EE permite que sejam criados componentes com escopo definido: requisição, sessão, conversação, aplicação ou dependente. Neste artigo elaboraremos um pouco mais sobre o contexto de conversação, explicando como funciona e como gerenciar múltiplas conversações entre clientes e aplicação. Conversações aliviam o programador de uma série de tarefas tediosas e complicadas de infraestrutura;
• AJAX: hoje em dia a maioria das aplicações Web possuem suporte a AJAX, o que permite que partes da página sejam recarregadas mediante uma requisição JavaScript, que promove uma maior interatividade entre cliente e servidor. A versão 2.0 de JSF vem com suporte a AJAX embutido, assim não é necessário adaptar um framework externo para utilizar esta tecnologia. Mostraremos como fazer requisições AJAX utilizando as tags padrão do JSF.
Apresentaremos estas tecnologias desenvolvendo as funcionalidades de login e de registro de chamadas de emergência, além de evoluir o cadastro de ambulâncias apresentado na primeira parte da série.
Decoração de páginas com Facelets
Facelets foi criado em 2005 como uma alternativa ao JSP para criação de páginas JSF. O uso de JSP como tecnologia de visão (renderização de páginas Web) do JSF pode causar alguns problemas devido a incompatibilidades entre ambas as tecnologias. Para o leitor interessado em aprofundar-se na questão, um artigo de Hans Bergsten (em inglês) explica o assunto em mais detalhes (veja Links).
Nas versões 1.1 e 1.2 de JSF, Facelets era utilizado como framework externo. Porém, dado a sua grande aceitação, foi incorporado como tecnologia padrão para criação de páginas do JSF 2.0, que por sua vez é parte da plataforma Java EE 6. De fato, na primeira parte desta série de artigos utilizamos Facelets para as páginas do cadastro de ambulância. A Listagem 1 mostra o código-fonte da página com o formulário de cadastro de ambulância, já apresentado na edição anterior .
Listagem 1. Página com o formulário de cadastro de ambulância.
xmlns:h="http://java.sun.com/jsf/html">
Páginas Web em Facelets são geralmente escritas em XHTML, uma especificação de HTML utilizando XML. Uma vantagem deste formato é que as páginas podem ser verificadas em tempo de compilação se estão bem formadas, se os parâmetros dos componentes (das tags) foram especificados corretamente, etc.
"
ATENÇÃO! A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVP
O que há de novo na plataforma Java Enterprise Edition
Esta é a segunda parte de uma série de artigos sobre a plataforma Java EE 6, iniciada na Edição 80 da Java Magazine. Naquela edição, apresentamos uma visão geral da plataforma Java Enterprise Edition 6, lançada em dezembro de 2009, e começamos o desenvolvimento de uma aplicação real utilizando a plataforma. Por meio desta aplicação, mostramos algumas novidades da nova versão, como: novas funcionalidades do JPA 2.0, Bean Validation e o CDI, Contexts and Dependency Injection.
Nesta edição, continuaremos a desenvolver o SisContrAm, nosso sistema de controle de ambulâncias, e mostraremos mais novidades do Java EE 6:
• Facelets: apresentado como framework para substituir o uso de JSP com JSF 1.x, Facelets agora foi incorporado à plataforma Java EE 6 e é a escolha padrão para a construção de páginas Web com JSF 2.0. Além de utilizar o padrão XHTML para construção das páginas, o que já traz algumas vantagens, Facelets permite a criação de decoradores que podem ser utilizados para aplicação de leiaute gráfico automaticamente em todas as páginas e criação de componentes visuais a serem reutilizados;
• API de Critérios: em versões anteriores da JPA (Java Persistence API), para recuperar objetos do banco de dados a única opção disponível era a criação de consultas em JPQL (Java Persistence Query Language). Com o JPA 2.0 agora é possível criar consultas de forma programática utilizando a API de Critérios. Consultas programáticas podem ser verificadas em tempo de compilação;
• Conversações: a introdução do CDI na plataforma Java EE permite que sejam criados componentes com escopo definido: requisição, sessão, conversação, aplicação ou dependente. Neste artigo elaboraremos um pouco mais sobre o contexto de conversação, explicando como funciona e como gerenciar múltiplas conversações entre clientes e aplicação. Conversações aliviam o programador de uma série de tarefas tediosas e complicadas de infraestrutura;
• AJAX: hoje em dia a maioria das aplicações Web possuem suporte a AJAX, o que permite que partes da página sejam recarregadas mediante uma requisição JavaScript, que promove uma maior interatividade entre cliente e servidor. A versão 2.0 de JSF vem com suporte a AJAX embutido, assim não é necessário adaptar um framework externo para utilizar esta tecnologia. Mostraremos como fazer requisições AJAX utilizando as tags padrão do JSF.
Apresentaremos estas tecnologias desenvolvendo as funcionalidades de login e de registro de chamadas de emergência, além de evoluir o cadastro de ambulâncias apresentado na primeira parte da série.
Decoração de páginas com Facelets
Facelets foi criado em 2005 como uma alternativa ao JSP para criação de páginas JSF. O uso de JSP como tecnologia de visão (renderização de páginas Web) do JSF pode causar alguns problemas devido a incompatibilidades entre ambas as tecnologias. Para o leitor interessado em aprofundar-se na questão, um artigo de Hans Bergsten (em inglês) explica o assunto em mais detalhes (veja Links).
Nas versões 1.1 e 1.2 de JSF, Facelets era utilizado como framework externo. Porém, dado a sua grande aceitação, foi incorporado como tecnologia padrão para criação de páginas do JSF 2.0, que por sua vez é parte da plataforma Java EE 6. De fato, na primeira parte desta série de artigos utilizamos Facelets para as páginas do cadastro de ambulância. A Listagem 1 mostra o código-fonte da página com o formulário de cadastro de ambulância, já apresentado na edição anterior .
Listagem 1. Página com o formulário de cadastro de ambulância.
xmlns:h="http://java.sun.com/jsf/html">
Cadastro de Ambulâncias
Número:
Placa:
immediate="true" />
Páginas Web em Facelets são geralmente escritas em XHTML, uma especificação de HTML utilizando XML. Uma vantagem deste formato é que as páginas podem ser verificadas em tempo de compilação se estão bem formadas, se os parâmetros dos componentes (das tags) foram especificados corretamente, etc.
"
ATENÇÃO! A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVPEste post também está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais!

20 COMENTÁRIOS
Otávio Gonçalves De Santana
A matéria foi muito boa.
Só não estou conseguindo ter acesso ao código-fonte do artigo.
Alguém pode me ajudar ?
[há +1 ano] -
Responder
Paulo Sérgio Pinheiro
Otávio,
O código fonte está em http://www.devmedia.com.br/resumo/download.asp?site=6&idrevista=205
O que exatamente está dando errado?
O código fonte está em http://www.devmedia.com.br/resumo/download.asp?site=6&idrevista=205
O que exatamente está dando errado?
[há +1 ano] -
Responder

Paulo Sérgio Pinheiro
Notei também que os managed beans CtrLogin e CtrCadastrarAmbulancia (são os que criei até aqui) só funcionam com a anotação @ManagedBean
Se usar apenas o @Model (conforme apresentado pelo artigo e também como consta no download do código fonte) ele também dá NullPointerException.
Teria isso a ver com o problema da injeção do Sessao?
Se usar apenas o @Model (conforme apresentado pelo artigo e também como consta no download do código fonte) ele também dá NullPointerException.
Teria isso a ver com o problema da injeção do Sessao?
[há +1 ano] -
Responder
[autor]
Vítor Estêvão Silva Souza
Respondendo às suas duas perguntas:
Se tirar o @Named e colocar @Stateful, o bean passa a ser injetável como EJB, mas não possui mais um nome para referência das páginas XHTML, por isso não funciona mais nas páginas. Com @Named deveria funcionar via @Inject, desde que a propriedade que é anotada com @Inject tenha o nome igual ao da classe anotada com @Named, porém com a primeira letra minúscula. Em todas estas anotações você pode definir o nome do componente pra ficar mais explícito.
A anotação @ManagedBean ela pertence à API do JSF 2, que pode ser usado sem o CDI ou em conjunto com o CDI. Quando usados em conjunto, @Named e @ManagedBean tem o mesmo efeito na prática e tanto faz usar um ou outro. Quando o CDI não está disponível no servidor, devem ser utilizadas somente as anotações do JSF 2.
O código-fonte disponibilizado deveria funcionar normalmente em um GlassFishV3.
Bons estudos,
Vítor Souza
[há +1 ano] -
Responder
Paulo Sérgio Pinheiro
Vítor,
O código-fonte baixado roda perfeitamente aqui.
É que eu prefiro aprender digitando tudo mesmo, experimentando e estava tentando descobrir o que fiz errado.
Postei o problema aqui por achar que talvez seja recorrente. Desisti e vou seguir do código-fonte baixado do site mesmo.
A propósito, a série está excelente e estou esperando ansiosamente o próximo número.
Desde já agradeço e congratulo-me pelo belo trabalho.
O código-fonte baixado roda perfeitamente aqui.
É que eu prefiro aprender digitando tudo mesmo, experimentando e estava tentando descobrir o que fiz errado.
Postei o problema aqui por achar que talvez seja recorrente. Desisti e vou seguir do código-fonte baixado do site mesmo.
A propósito, a série está excelente e estou esperando ansiosamente o próximo número.
Desde já agradeço e congratulo-me pelo belo trabalho.
[há +1 ano] -
Responder
Reinaldo Oliveira
Paulo Sérgio,
Tive o mesmo problema que você e comecei a comparar os arquivos da minha aplicação com os arquivos disponibilizados pelo Vitor, verifiquei que o net beans ao criar o projeto não criou alguns arquivos de configuração um deles foi o beans.xml adicionei este arquivo no meu projeto (CTRL+C no projeto do Vitor e CTRL+V no meu projeto na mesma pasta) e comecei a receber outro erro :
Exception attempting to inject Remote ejb-ref name=br.com.accmm.mb.AreaMB/areaBeanImpl,Remote 3.x interface =br.com.accmm.bean.AreaBeanImpl,ejb-link=null,lookup=null,mappedName=,jndi-name=br.com.accmm.bean.AreaBeanImpl,refType=Session into class br.com.accmm.mb.AreaMB
Estou procurando agora a solução para o problema acima, encontrei algo parecido neste link:
Mas ainda não consegui corrigir, assim que conseguir eu posto aqui.
[há +1 ano] -
Responder

Reinaldo Oliveira
Pessoal,
Poderiam me ajudar com o erro abaixo?
Exception attempting to inject Remote ejb-ref name=br.com.accmm.mb.AreaMB/areaBeanImpl,Remote 3.x interface =br.com.accmm.bean.AreaBeanImpl,ejb-link=null,lookup=null,mappedName=,jndi-name=br.com.accmm.bean.AreaBeanImpl,refType=Session into class br.com.accmm.mb.AreaMB
Não consegui resolver e não encontrei nada relevante na internet, talvez não esteja procurando os termos certos.
Obrigado.
Obs.: Tentei anexar os arquivos da minha aplicação mas não consegui, mesmo estando no formato permitido e com tamanho menor que 500k.
[há +1 ano] -
Responder
[autor]
Vítor Estêvão Silva Souza
Pelo erro, desconfio que exista na classe AreaMB algo tipo isso:
@Inject
private AreaBeanImpl areaBeanImpl;
Para que essa injeção funcione, é preciso que exista uma classe com o mesmo nome da propriedade, ou seja, areaBeanImpl. Isso acontecerá no seguinte caso:
@Named
public class AreaBeanImpl { ... }
No caso se esse AreaBeanImpl é a implementação de um EJB, você teria algo assim:
@Local
public class AreaBean { ... }
@Stateless
public class AreaBeanImpl { ... }
Mas nesse caso a injeção na classe AreaMB seria feita assim:
@EJB
private AreaBean areaBean;
Claro que esta não é a única forma de fazer injeção de dependência, as anotações acima possuem diversos parâmetros que podem ser configurados. Estou dando esta ideia geral porque sem olhar o seu código é realmente muito difícil dizer onde encontra-se o problema.
Boa sorte,
Vítor Souza
[há +1 ano] -
Responder
Reinaldo Oliveira
Cara estava a dois dias com este problema e no fim das coisas era uma coisa muito simples, passei por cima do problemas várias vezes não tinha identificado, mas você foi a "Luz".
Eu estava fazendo da seguinte forma:
-- Interface EJB Local
@Local
public interface AreaBean { ... }
-- Implementação
@Stateless
public class AreaBeanImpl { ... }
e no meu Bean estava fazendo chamada à implementação como EJB e não à interface
Assim
public class AreaMB {
@EJB
private AreaBeanImpl areaBeanImpl;
}
Quando na verdade deveria ser
public class AreaMB {
@EJB
private AreaBean areaBean;
}
Fiz essa alteração e funcionou legal.
Muito obrigado
[há +1 ano] -
Responder

Mauricio
Venho tentando realizar esse projeto mas não estou conseguindo. Td é muito confuso e mal redigido, pelo menos p/ mim que sou iniciante. Na 1º parte tem a interface "AmbulanciaDAO" mas não tem os códigos dos métodos ? Na classe "Funcionario" Tem um objeto Endereco mas não há código e nem o mapeamento na figura 3 da edição 80. Também tem o um tal de "DAOJPA2" mas tb não código nenhum e é extendido na classe "AmbulanciaDAOJPA2". E a classe "Despacho" que pertence ao pacote dominio?
Já fiz alguns projeto fornecido na web e free e sempre consegui fazer e intender, mas esse além de não entender não consigo sequer codificar. Espero esclarecimentos. Obrigado
[há +1 ano] -
Responder
Reinaldo Oliveira
Mauricio, acredito que seu comentário foi um pouco equivocado. O conteúdo deste artigo na minha opinião (também sou iniciante) está muito bom. Os códigos apresentados na matéria são apenas para explicação didática do conteúdo, se você não conseguiu implementar sozinho existe uma seção para download dos mesmos. E se tiver alguma dúvida ou problema ao implementar os códigos baixados, poste aqui a sua dúvida e acredito que muitas pessoas ficarão contentes em ajudar.
[há +1 ano] -
Responder
[autor]
Vítor Estêvão Silva Souza
Olá Maurício,
Agradeço sua franqueza. Sei que não se pode agradar a todos e críticas são também válidas :)
Muitos códigos realmente não estão disponíveis no artigo. Isso é porque para uma aplicação completa não é possível exibir todos os códigos. Não há espaço suficiente. Nossa abordagem foi de incluir mais explicações sobre os diferentes assuntos relacionados ao Java EE 6. Veja, no entanto, o seguinte trecho:
"Assim como no caso dos objetos de domínio, dado que a maioria das operações de armazenamento do DAO (recuperar por id, salvar, excluir, etc.) pode ser generalizada em uma superclasse, o fizemos na classe DAOBaseJPA2 (e respectiva interface DAOBase), cujos códigos estão disponíveis"
A última parte, "cujos códigos estão disponíveis", quer dizer que é possível fazer o download do código aqui no site da DevMedia. Ali você irá encontrar a classe DAOBaseJPA2 que, em conjunto com as listagens 7 e 8, provê o DAO de Ambulancia. Para a classe Despacho é a mesma coisa.
Quanto à propriedade endereco, da Listagem 6, ela é um exemplo, digamos, "fictício". Quero dizer com isso que não faz parte do SisContrAm. Foi só um exemplo criado na hora pra mostrar como funciona a anotação @Valid. Isso é explicado no texto por exemplo na frase "se em nosso sistema quiséssemos armazenar ...". Neste ponto eu realmente poderia ter feito melhor e incluído um exemplo de @Valid no SisContrAm, mas não o fiz.
Por fim, gostaria de agradecer ao Reinaldo pelos elogios. Não se pode agradar a todos, mas fico muito contente de ter agradado a alguns! ;)
Abraços,
Vítor Souza
[há +1 ano] -
Responder

Cassio Cunha Noronha
To tendo o mesmo problema de não conseguir Injetar a variavel session do tipo Session na classe GerenciadorLoginImpl.
Inclusive copiei o contudo dos arquivos Session e GerenciadorLoginImpl, mas ele não consegue injetar a Session.
Existe mais alguma coisa, fora o que já foi dito, que possa ser testada para resolver esse problema?
Obrigado.
Inclusive copiei o contudo dos arquivos Session e GerenciadorLoginImpl, mas ele não consegue injetar a Session.
Existe mais alguma coisa, fora o que já foi dito, que possa ser testada para resolver esse problema?
Obrigado.
[há +1 ano] -
Responder
Cassio Cunha Noronha
Onde escrevi ''''Session'''', leiam ''''Sessao''''. Errei enquanto estava escrevendo a dúvida.
[há +1 ano] -
Responder
[autor]
Vítor Estêvão Silva Souza
Desculpe, mas o que você quer dizer com "o mesmo problema de não conseguir Injetar a variavel session do tipo Session na classe GerenciadorLoginImpl" ?
Como você implementou? Que erro ou comportamento inesperado está dando?
Preciso de mais informações para tentar te ajudar.
Abraços,
Vítor
[há +1 ano] -
Responder

Wagner Alves Da Silva Junior
Novamente parabéns otimo post!
[há +1 ano] -
Responder

Paulo Sérgio Pinheiro
Não estou conseguindo injetar o objeto sessao com a anotação @Inject em GerenciadorLoginImpl
Ele cria NullPointerException quando tento usar o método do objeto sessao. A classe Sessao está anotada conforme o exemplo (com @SessionScoped e @Named)
Funciona normalmente se eu anoto a classe Sessao com @Stateful e injeto em GerenciadorLoginImpl como @EJB
Mas o problema é que o JSF passa a não enxergar mais o sessao lá nas páginas xhtml
Ele cria NullPointerException quando tento usar o método do objeto sessao. A classe Sessao está anotada conforme o exemplo (com @SessionScoped e @Named)
Funciona normalmente se eu anoto a classe Sessao com @Stateful e injeto em GerenciadorLoginImpl como @EJB
Mas o problema é que o JSF passa a não enxergar mais o sessao lá nas páginas xhtml
[há +1 ano] -
Responder
Davi Lima
Verifique se em seu projeto tando no ejb quanto no war, existe o arquivo beans.xml, pode ser esse seu problema em relação ao uso do @Inject.
[há +1 ano] -
Responder

Carlos Hilner Ferreira Costa
desculpa, mas estou usando o eclipse e a parte do banco não foi criada automaticamente pelo jpa como no netbeans. como crio as tabelas?
[há +1 mês] -
Responder
[autor]
Vítor Estêvão Silva Souza
Olá Carlos,
As instruções para criação do banco de dados encontram-se na parte 1 (seção "Implementando o domínio com POJOs e JPA") e são para o NetBeans.
No eclipse, você precisa ter o arquivo persistence.xml dentro da pasta META-INF, que por sua vez deve estar junto com o código-fonte (pasta ejbModule ou src) do módulo EJB da sua aplicação.
Neste arquivo, além da configuração normal da camada de persistência (veja o código-fonte da aplicação, disponível aqui no site), é preciso incluir a propriedade "eclipselink.ddl-generation" com o valor "create-tables":
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
Estou assumindo que você está usando o GlassFish, que utiliza o EclipseLink como implementação JPA. Caso esteja usando outra implementação, precisa verificar qual é a propriedade correta.
Boa sorte,
- Vítor Souza
As instruções para criação do banco de dados encontram-se na parte 1 (seção "Implementando o domínio com POJOs e JPA") e são para o NetBeans.
No eclipse, você precisa ter o arquivo persistence.xml dentro da pasta META-INF, que por sua vez deve estar junto com o código-fonte (pasta ejbModule ou src) do módulo EJB da sua aplicação.
Neste arquivo, além da configuração normal da camada de persistência (veja o código-fonte da aplicação, disponível aqui no site), é preciso incluir a propriedade "eclipselink.ddl-generation" com o valor "create-tables":
<properties>
<property name="eclipselink.ddl-generation" value="create-tables" />
</properties>
Estou assumindo que você está usando o GlassFish, que utiliza o EclipseLink como implementação JPA. Caso esteja usando outra implementação, precisa verificar qual é a propriedade correta.
Boa sorte,
- Vítor Souza
[há +1 mês] -
Responder
Você está em:
canal Java
Vítor Estêvão Silva Souza
Space do autor
Graduação em Ciência da Computação e Mestrado em Informática com ênfase em Engenharia de Software na Universidade Federal do Espírito Santo (UFES), onde trabalhou também como professor substituto.
Space do autor



0
0
