blob: e1e566699b300d2cfcd93e02dbd3ce53fd0e04f3 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Criando uma Aplicação Corporativa com o EJB 3.1
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Criando uma Aplicação Corporativa com o EJB 3.1 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Corporativa com o EJB 3.1
Este tutorial apresenta os conceitos básicos de desenvolvimento de uma aplicação corporativa Java EE 6 e demonstra algumas das funcionalidades da tecnologia EJB 3.1 que foram introduzidos como parte da especificação Java EE 6. Neste tutorial, você criará uma aplicação corporativa que permite a um usuário publicar uma mensagem e recuperá-la de um banco de dados.
A aplicação contém um módulo EJB e um módulo web. O módulo EJB contém uma classe de entidade, uma fachada de sessão para a classe de entidade e um bean baseado em mensagens. O módulo web contém servlets para exibir e publicar mensagens, além de um bean de sessão simples que soma o número de usuários na sessão.
Antes de começar este tutorial, pode ser necessário se familiarizar com o seguinte documento.
* link:javaee-gettingstarted.html[+Conceitos Básicos sobre Aplicações do Java EE+]
*Exercícios do Tutorial*
* <<intro,Sobre a Aplicação Corporativa NewsApp>>
* <<Exercise_1,Criando o Projeto de Aplicação Corporativa>>
* <<Exercise_2,Codificando o Módulo EJB>>
* <<Exercise_2a,Criando a Classe de Entidade>>
* <<Exercise_2b,Criando o Bean Baseado em Mensagens>>
* <<Exercise_2c,Criando a Fachada da Sessão>>
* <<Exercise_3,Codificando o Módulo Web>>
* <<Exercise_3a,Criando o Bean de Sessão Simples>>
* <<Exercise_3b,Criando o Servlet ListNews>>
* <<Exercise_3c,Criando o Servlet PostMessage>>
* <<Exercise_4,Executando o Projeto>>
* <<Exercise_5,Fazendo Download do Projeto da Solução>>
* <<Exercise_6,Solução de Problemas>>
*Para seguir este tutorial, são necessários os recursos e o software a seguir.*
|===
|Software ou Recurso |Versão Necessária
|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Versão Java EE 7.2, 7.3, 7.4, 8.0
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8
|GlassFish Server Open Source Edition |3.x, 4.x
|===
*Pré-requisitos*
Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir, ou alguma experiência de programação com elas:
* Programação em Java
* NetBeans IDE
Você pode fazer download link:https://netbeans.org/projects/samples/downloads/download/Samples/JavaEE/NewsAppEE6.zip[+de um arquivo compactado zip do projeto finalizado+].
== Sobre a Aplicação Corporativa NewsApp
Neste tutorial, você criará um exemplo simples de uma aplicação corporativa Java EE 6 com várias camadas denominado NewsApp. A aplicação NewsApp usa algumas das funcionalidades apresentadas na especificação Java EE 6.
A estrutura da aplicação NewsApp corresponde, geralmente, às seguintes camadas.
* *Camada Web.* A Camada Web contém a lógica de apresentação da aplicação e é executada no servidor Java EE. Na aplicação NewsApp, a camada Web é representada pelo módulo web e contém servlets que acessam a lógica de negócios no módulo EJB.
* *Camada de Negócios.* Aplicações de Camadas de Negócios também são executadas em servidores Java EE e contêm a lógica de negócios da aplicação. Na aplicação NewsApp, a Camada de Negócios é representada pelo módulo EJB. O módulo EJB contém o código que trata as solicitações dos clientes da Camada Web, além de gerenciar transações e como os objetos serão persistidos no banco de dados.
* *Camada EIS.* A Camada EIS é a camada de armazenamento persistente da aplicação. Na Aplicação NewsApp, esta camada é representada pelo banco de dados no qual as mensagens estão armazenadas.
Quando você constrói uma aplicação corporativa no IDE, os módulos EJB e aplicação Web são encapsulados em um arquivo compactado EAR que é, em seguida, implantado no servidor. A aplicação será, em seguida, normalmente acessada da *Camada do Cliente.* A Camada do Cliente é o ambiente em que o cliente é executado e é normalmente um browser web no sistema local do usuário.
NOTE: No exemplo deste tutorial, você usará uma única máquina para hospedar o servidor Java EE, o banco de dados e visualizar as páginas web. Em aplicações do enterprise grandes, as diferentes camadas estão, em geral, distribuídas em várias máquinas. As aplicações de Camada Web e Camada de Negócios são geralmente implantadas nos servidores Java EE que estão hospedados em diferentes máquinas.
Para obter mais detalhes sobre a estrutura de aplicações do enterprise Java EE, consulte o capítulo sobre link:http://download.oracle.com/javaee/6/tutorial/doc/bnaay.html[+Aplicações Distribuídas em Várias camadas+] no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6, Parte I+].
== Criando o Projeto da Aplicação Corporativa
O objetivo deste exercício é criar o novo projeto da aplicação corporativa NewsApp. Você usará o assistente Novo Projeto para criar uma aplicação corporativa que contenha um módulo EJB e um módulo web.
1. Selecione Arquivo > Novo Projeto (Ctrl-Shift-N; ⌘-Shift-N no Mac) no menu principal.
2. Selecione Aplicação Corporativa na categoria Java EE e clique em Próximo.
3. Nomeie o projeto de *NewsApp* e defina a localização do projeto.
4. Desmarque a opção Usar Pasta Dedicada, se ela estiver selecionada.
(Para este tutorial, não há motivo para copiar as bibliotecas de projeto em uma pasta dedicada, pois você não precisará compartilhar bibliotecas com outros usuários ou projetos).
Clique em Próximo.
[start=5]
. Defina o servidor como GlassFish Server e defina a versão do Java EE para Java EE 6 ou Java EE 7.
[start=6]
. Selecione Criar Módulo EJB e Criar Módulo de Aplicação Web. Clique em Finalizar.
image::images/new-entapp-wizard.png[title="Assistente Novo Projeto"]
Quando você clica em Finalizar, o IDE cria três projetos: NewsApp, NewsApp-ejb e NewsApp-war. Se expandir o nó NewsApp na janela Projetos, você poderá ver que o projeto da aplicação corporativa não contém nenhum código-fonte. Todos os códigos-fonte estarão contidos nos dois módulos que o assistente criou e que estão listados no nó Módulos Java EE.
O projeto de aplicação corporativa só contém detalhes de configuração e encapsulamento sobre a aplicação. Quando você cria e executa uma aplicação corporativa, o IDE cria um archive EAR e implanta o EAR no servidor. Em alguns casos, o projeto de aplicação corporativa conterá os arquivos do descritor de implantação com informações adicionais, mas esses arquivos não serão necessários durante a criação de uma aplicação corporativa Java EE que seja implantado no GlassFish Server.
image::images/ejb-projectswindow.png[title="Janela Projetos mostrando a estrutura da aplicação"]
== Codificando o Módulo EJB
Neste exercício, você criará uma classe de entidade, um bean de sessão baseado em mensagens e uma fachada de sessão no módulo EJB. Você também criará uma unidade de persistência para fornecer ao contêiner informações sobre a fonte de dados e como as entidades são gerenciadas, bem como os recursos Java Message Service (JMS) que são usados pelo bean baseado em mensagens.
=== Criando a Classe de Entidade
Neste exercício, você criará a classe de entidade ``NewsEntity`` . Uma classe de entidade é uma classe Java simples que geralmente representa uma tabela em um banco de dados. Quando você cria a classe de entidade, o IDE adiciona a anotação ``@Entity`` para definir a classe como uma classe de entidade. Depois de criar a classe, você criará campos na classe para representar os dados que deseja incluir na tabela.
Cada classe de entidade deve ter uma chave primária. Quando você cria a classe de entidade, o IDE adiciona a anotação ``@Id`` para declarar o campo a ser usado como chave primária. O IDE também adiciona a anotação ``@GeneratedValue`` e especifica a estratégia de geração de chave para o Id primário.
Para criar a classe ``NewsEntity`` , execute as seguintes etapas.
1. Clique com o botão direito do mouse no módulo EJB na janela Projetos e selecione Novo > Outro para abrir o assistente Novo arquivo.
2. Na categoria Persistência, selecione Classe de Entidade e clique em Próximo.
3. Digite *NewsEntity* para Nome da Classe.
4. Digite *ejb* para o Pacote.
5. Deixe Tipo de Chave Primária como ``Longo`` no assistente Nova Classe de Entidade.
6. Selecione Criar Unidade de Persistência. Clique em Próximo.
7. Preserve o Nome default da Unidade de Persistência.
8. Para o Provedor de Persistência, selecione ``EclipseLink (JPA2.0)(default)`` .
9. Para Fonte de Dados, selecione uma fonte de dados (por exemplo, selecione ``jdbc/sample`` se quiser usar JavaDB).
10. Confirme que a unidade de persistência está utilizando a Java Transaction API e que Estratégia de Geração de Tabela está definida como Criar, de forma que as tabelas com base nas suas classes de entidade serão criadas quando a aplicação for implantada.
image::images/new-pu-wizard.png[title="Provedor e painel de Banco de Dados"]
[start=11]
. Clique em Finalizar.
Quando você clica em Finalizar, o IDE cria ``persistence.xml`` e a classe de entidade ``NewsEntity.java`` . O IDE abre ``NewsEntity.java`` no Editor de Código-Fonte.
No Editor de Código-Fonte, execute as etapas a seguir.
1. Adicione as seguintes declarações de campo à classe:
[source,java]
----
private String title;
private String body;
----
[start=2]
. Clique com o botão direito do mouse no Editor de Código-Fonte e selecione Inserir Código (Alt-Insert; Ctrl-I no Mac) e selecione Getter e Setter para abrir a caixa de diálogo Gerar Getters e Setters.
[start=3]
. Selecione os campos ``body`` e ``title`` na caixa de diálogo. Clique em Gerar.
image::images/ejb-gettersetter.png[title="Caixa de diálogo Gerar Getters e Setters"]
Quando você clica em Gerar, o IDE adiciona os métodos getter e setter nos campos.
[start=4]
. Salve as alterações em ``NewsEntity.java`` .
Você pode fechar ``NewsEntity.java`` .
Para saber mais sobre classes de entidade, consulte o capítulo link:http://java.sun.com/javaee/6/docs/tutorial/doc/bnbpz.html[+Introdução à Java Persistence API+] no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6 , Parte I+].
=== Criando o Bean Baseado em Mensagens
Neste exercício, você usará um assistente para criar o bean baseado em mensagens no módulo EJB. O assistente também o ajudará a criar os recursos JMS necessários. O bean baseado em mensagens recebe e processa mensagens enviadas para a fila por um servlet no módulo Web.
Para criar o bean baseado em mensagens, execute as seguintes etapas:
1. Clique com o botão direito do mouse no módulo EJB na janela Projetos e selecione Novo > Outro para abrir o assistente Novo arquivo.
2. Na categoria Enterprise JavaBens, selecione o tipo de arquivo Bean Baseado em Mensagens. Clique em Próximo.
3. Digite *NewMessage* para Nome EJB.
4. Selecione ``ejb`` na lista drop-down Pacote.
5. Clique no botão Adicionar ao lado do campo Destino do Projeto para abrir a caixa de diálogo Adicionar Destino da Mensagem.
6. Na caixa de diálogo Adicionar Destino da Mensagem, digite *jms/NewMessage* e selecione Fila como o tipo de destino. Clique em OK.
7. Confirme se o destino do projeto está correto. Clique em Finalizar.
image::images/ejb-newmessage.png[title="Assistente Novo Bean Baseado em Mensagens"]
Quando você clica em Finalizar, a classe ``NewMessage.java`` do bean será aberta no Editor de Código-Fonte. Você pode ver que o IDE adicionou a anotação ``@MessageDriven`` e as propriedades de configuração à classe.
[source,java]
----
@MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class NewMessage implements MessageListener {
----
A anotação ``@MessageDriven`` informa ao contêiner que o componente é um bean baseado em mensagens e especifica o recurso JMS usado pelo bean. Quando o IDE gera a classe, o Nome Mapeado do recurso ( ``jms/NewMessage`` ) é derivado do nome da classe ( ``NewMessage.java`` ). O recurso JMS é mapeado para o nome JNDI do destino do qual o bean recebe mensagens. O assistente Novo Bean Baseado em Mensagens também adiciona as informações dos recursos JMS ao ``glassfish-resources.xml`` . Não é necessário configurar os descritores de implantação para especificar os recursos JMS. Se usar a ação Executar no IDE para implantar a aplicação no GlassFish, os recursos JMS serão criados no servidor na implantação.
As especificações do EJB permitem que você use anotações para introduzir recursos diretamente em uma classe. Agora você usará anotações para introduzir o recurso ``MessageDrivenContext`` em sua classe e, em seguida, injetar o recurso ``PersistenceContext`` , que será usado pela EntityManager API para gerenciar as instâncias de entidade persistentes. Você adicionará as anotações à classe no Editor de Código-Fonte.
1. Injetamos o recurso ``MessageDrivenContext`` na classe adicionando o seguinte campo anotado (em negrito) à classe:
[source,java]
----
public class NewMessage implements MessageListener {
*@Resource
private MessageDrivenContext mdc;*
----
[start=2]
. Introduza o gerenciador de entidades na classe clicando com o botão direito do mouse no código e selecionando Inserir Código (Alt-Insert; Ctrl-I no Mac), e selecionando Usar Gerenciador de Entidades no menu pop-up. O IDE adiciona a seguinte anotação ``@PersistenceContext`` ao seu código-fonte.
[source,java]
----
@PersistenceContext(unitName = "NewsApp-ejbPU")
private EntityManager em;
----
O IDE também gera o seguinte método ``persist`` .
[source,java]
----
public void persist(Object object) {
em.persist(object);
}
----
[start=3]
. Modifique o método ``persist`` para alterar o nome para ``save`` . O método deve ter uma aparência semelhante a esta:
[source,java]
----
public void *save*(Object object) {
em.persist(object);
}
----
[start=4]
. Modifique o método ``onMessage`` adicionando o seguinte código (em negrito) ao corpo do método.
[source,java]
----
public void onMessage(Message message) {
*ObjectMessage msg = null;
try {
if (message instanceof ObjectMessage) {
msg = (ObjectMessage) message;
NewsEntity e = (NewsEntity) msg.getObject();
save(e);
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}*
}
----
[start=5]
. Clique com o botão direito do mouse no editor e escolha Corrigir Importações (Alt-Shift-I; ⌘-Shift-I no Mac) para gerar quaisquer instruções de importação necessárias. Salve as alterações.
NOTE: Quando geramos as instruções de importação, queremos *garantir a importação das bibliotecas ``javax.jms`` e ``javax.annotation.Resource`` *.
Para obter mais detalhes sobre beans baseados em mensagens, consulte o capítulo link:http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html[+O que é um Bean Baseado em Mensagem?+] no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6 , Parte I+].
=== Criando a Fachada da Sessão
Neste exercício, você criará uma fachada de sessão para a classe de entidade NewsEntity. A especificação EJB 3.0 simplificou a criação de beans de sessão reduzindo a quantidade de códigos necessários e permitindo o uso de anotações para declarar uma classe como um Bean de sessão. A especificação EJB 3.1 simplifica ainda mais os requisitos dos beans de sessão, ao tornar opcionais as interfaces de negócios. Os beans de sessão podem ser acessados por clientes locais por meio de uma interface local ou de uma view sem interface. Neste tutorial, você não criará uma interface para o bean. Os servlets da aplicação web acessarão o bean usando uma view sem interface.
Para criar a fachada de sessão, execute as seguintes etapas:
1. Clique com o botão direito do mouse no módulo EJB e escolha Novo > Outro.
2. Na categoria Persistência, selecione Beans de Sessão em Classes de Entidade. Clique em Próximo.
3. Selecione ``ejb.NewsEntity`` na lista de classes de entidades disponíveis e clique em Adicionar para mover a classe para o painel Classes de Entidades Selecionadas. Clique em Próximo.
4. Verifique se o Pacote está definido como ``ejb`` . Clique em Finalizar.
image::images/ejb-sessionforentity.png[title="Assistente Novo Bean Baseado em Mensagens"]
Quando você clica em Finalizar, o IDE gera a classe de fachada da sessão ``NewsEntityFacade.java`` e ``AbstractFacade.java`` , e abre os arquivos no editor. Como podemos ver no código gerado, a anotação ``@Stateless`` é usada para declarar a classe ``NewsEntityFacade.java`` como um componente de bean de sessão sem estado. O IDE também adiciona a anotação ``PersistenceContext`` para injetar o recurso diretamente no componente do bean de sessão. ``NewsEntityFacade.java`` estende ``AbstractFacade.java`` , que contém a lógica de negócio e gerencia a transação.
NOTE: Interfaces remotas ainda são necessárias, se os beans forem ser acessados por clientes remotos.
Para obter mais informações sobre beans de sessão, consulte o capítulo link:http://java.sun.com/javaee/6/docs/tutorial/doc/gipjg.html[+O que é um Bean de Sessão?+] no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6, Parte I+].
== Codificando o Módulo Web
Nesta seção, você criará dois servlets no módulo Web. O servlet ListNews recupera as mensagens do banco de dados usando a fachada de entidade no módulo EJB. O servlet PostMessage é usado para enviar mensagens JMS.
Nesta seção, você criará também um bean de sessão simples no módulo web que contará o número de usuários que estão atualmente na sessão. A especificação EJB 3.1 permite criar enterprise beans em aplicações Web. Antes do EJB 3.1, todos os enterprise beans tinham que estar em módulos EJB.
=== Criando o Bean de Sessão Único
A especificação EJB 3.1 introduz a anotação ``@Singleton`` que permite criar facilmente beans de sessão únicos. O EJB 3.1 também define anotações adicionais para a configuração de propriedades de beans de sessão únicos como quando o bean é instanciado.
Depois que o bean de sessão único é instanciado, ele existirá durante o ciclo de vida da aplicação. Como o seu próprio nome diz, pode haver somente uma única instância de um bean de sessão único na aplicação. Como os beans de sessão sem estado, os beans de sessão únicos podem ter vários clientes.
Para criar o bean da sessão único, execute as seguintes etapas.
1. Clique com o botão direito do mouse no módulo Web e selecione Novo > Outro para abrir o assistente Novo Arquivo.
2. Selecione o Bean de Sessão na categoria Enterprise JavaBeans. Clique em Próximo.
3. Digite *SessionManagerBean* para Nome EJB.
4. Digite *ejb* para o nome do Pacote.
5. Selecione Único. Clique em Finalizar.
image::images/ejb-newsingleton.png[title="Criando um bean de sessão único no assistente Novo Bean de Sessão"]
Quando você clica em Finalizar, o IDE gera a classe do bean de sessão único e abre a classe no Editor. Você pode ver que o IDE adicionou a anotação ``@Singleton`` à classe para declarar um bean de sessão único. O assistente também anotou a classe com ``@LocalBean`` .
[source,java]
----
@Singleton
@LocalBean
public class SessionManagerBean {
}
----
1. Anote a classe com ``@WebListener`` e implemente ``HttpSessionListener`` .
[source,java]
----
@Singleton
@LocalBean
*@WebListener*
public class SessionManagerBean *implements HttpSessionListener*{
}
----
A anotação ``@WebListener`` é parte da API do Servlet 3.0 e permite implementar um listener diretamente no seu código.
Quando você implementa ``HttpSessionListener`` , o IDE exibe uma advertência na margem.
[start=2]
. Clique no emblema de advertência na margem esquerda e selecione "Implementar todos os métodos abstratos".
image::images/ejb-implementabstract.png[title="Dica do editor para implementar métodos abstratos"]
O IDE adiciona os métodos ``sessionCreated`` e ``sessionDestroyed`` .
[start=3]
. Adicione o campo estático ``counter`` e defina o valor inicial como ``0`` .
[source,java]
----
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener{
*private static int counter = 0;*
----
[start=4]
. Modifique os corpos gerados dos métodos ``sessionCreated`` e ``sessionDestroyed`` para aumentar o valor de um campo quando uma nova sessão for iniciada e para diminuir o valor quando uma sessão for finalizada. O valor será armazenado no campo ``counter`` .
[source,java]
----
public void sessionCreated(HttpSessionEvent se) {
*counter++;*
}
public void sessionDestroyed(HttpSessionEvent se) {
*counter--;*
}
----
[start=5]
. Adicione o método a seguir, que retorna o valor atual de ``counter`` .
[source,java]
----
public int getActiveSessionsCount() {
return counter;
}
----
Você chamará este método de um servlet para exibir o número atual de usuários/sessões abertas.
[start=6]
. Salve as alterações.
O código para o bean de sessão deve ter agora a seguinte aparência.
[source,java]
----
@Singleton
@LocalBean
@WebListener
public class SessionManagerBean implements HttpSessionListener {
private static int counter = 0;
public void sessionCreated(HttpSessionEvent se) {
counter++;
}
public void sessionDestroyed(HttpSessionEvent se) {
counter--;
}
public int getActiveSessionsCount() {
return counter;
}
}
----
Para obter mais detalhes sobre beans de sessão únicos, consulte o capítulo link:http://java.sun.com/javaee/6/docs/tutorial/doc/gipjg.html[+O que é um Bean de Sessão?+] no link:http://download.oracle.com/javaee/6/tutorial/doc/[+Tutorial do Java EE 6 , Parte I+].
=== Criando o Servlet ``ListNews``
Neste exercício, você criará um servlet simples para exibir as mensagens armazenadas. Você usará anotações para chamar o Enterprise Bean NewsEntityFacade do servlet.
1. Clique com o botão direito do mouse em um projeto de módulo web e selecione Novo > Servlet.
2. Digite *ListNews* para o Nome da Classe.
3. Insira *web* como o nome do Pacote. Clique em Finalizar.
Quando você clicar em Finalizar, a classe ``ListNews.java`` irá se abrir no Editor de Código-Fonte. No editor de código-fonte, execute as etapas a seguir.
1. Clique com o botão direito do mouse no editor de código-fonte, selecione Inserir Código (Alt-Insert; Ctrl-I no Mac) e selecione Chamar Enterprise Bean.
2. Na caixa de diálogo Chamar Enterprise Bean, expanda o nó NewsApp-ejb e selecione NewEntityFacade. Clique em OK.
O IDE adiciona a anotação ``@EJB`` para injetar o enterprise bean.
[start=3]
. Use a caixa de diálogo Chamar Enterprise Bean novamente para injetar SessionManagerBean no nó NewsApp-war.
Você verá no seu código as seguintes anotações que injetam os dois enterprise beans.
[source,java]
----
@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
@EJB
private SessionManagerBean sessionManagerBean;
@EJB
private NewsEntityFacade newsEntityFacade;
----
Você também pode ver que a anotação ``@WebServlet`` é usada para declarar a classe um servlet e especificar o nome do servlet. A anotação ``@WebServlet`` faz parte da API do Servlet 3.0 introduzida na especificação Java EE 6. Você pode identificar os servlets usando a anotação, em vez de no descritor de implantação ``web.xml`` . A aplicação NewsApp não contém ``web.xml`` .
[start=4]
. No método ``processRequest`` , adicione o seguinte código (em negrito) para retornar a sessão atual ou criar uma nova sessão.
[source,java]
----
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
*request.getSession(true);*
response.setContentType("text/html;charset=UTF-8");
----
[start=5]
. Adicione o seguinte código (em negrito) ao método ``processRequest`` para imprimir as mensagens e adicionar um link ao servlet PostMessage. (Remova os comentários do código no método, se necessário.)
[source,xml]
----
out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
*List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(" <b>"+elem.getTitle()+" </b><br />");
out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");*
out.println("</body>");
----
[start=6]
. Adicione o código seguinte (em negrito) para recuperar e imprimir o número de usuários/sessões abertas.
[source,xml]
----
out.println("<a href='PostMessage'>Add new message</a>");
*out.println("<br><br>");
out.println(sessionManagerBean.getActiveSessionsCount() + " user(s) reading the news.");*
out.println("</body>");
----
[start=7]
. Pressione Ctrl-Shift-I para gerar as instruções de importação necessárias para a classe. Ao gerar as instruções de importação, você deseja *importar as bibliotecas ``java.util`` *.
[start=8]
. Salve as alterações feitas no arquivo.
=== Criando o Servlet ``PostMessage``
Neste exercício, você criará o servlet ``PostMessage`` que será usado para enviar mensagens. Você usará anotações para injetar os recursos JMS que criou diretamente no servlet, especificando o nome da variável e o nome para o qual é mapeado. Em seguida, você adicionará o código para enviar a mensagem JMS e o código para o form HTML para adicionar uma mensagem.
1. Clique com o botão direito do mouse em um projeto de módulo web e selecione Novo > Servlet.
2. Digite ``PostMessage`` para Nome da Classe.
3. Insira ``web`` para nome do Pacote e clique em Finalizar.
Quando você clica em Finalizar, a classe ``PostMessage.java`` se abrirá no editor de código-fonte. No editor de código-fonte, execute as etapas a seguir.
1. Use anotações para injetar os recursos ``ConnectionFactory`` e ``Queue`` adicionando as seguintes declarações de campo (em negrito):
[source,java]
----
@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
*@Resource(mappedName="jms/NewMessageFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName="jms/NewMessage")
private Queue queue;*
----
[start=2]
. Agora você insere o código para enviar as mensagens JMS adicionando o seguinte código em negrito ao método ``processRequest`` :
[source,java]
----
response.setContentType("text/html;charset=UTF-8");
// Add the following code to send the JMS message
*String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) &amp;&amp; (body!=null)) {
try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
ObjectMessage message = session.createObjectMessage();
// here we create NewsEntity, that will be sent in JMS message
NewsEntity e = new NewsEntity();
e.setTitle(title);
e.setBody(body);
message.setObject(e);
messageProducer.send(message);
messageProducer.close();
connection.close();
response.sendRedirect("ListNews");
} catch (JMSException ex) {
ex.printStackTrace();
}
}*
PrintWriter out = response.getWriter();
----
[start=3]
. Adicione as linhas a seguir (em negrito) ao método ``processRequest`` para adicionar o form web para adicionar uma mensagem. (Remova o comentário do código para imprimir o HTML, se necessário.)
[source,xml]
----
out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");
// The following code adds the form to the web page
*out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");*
out.println("</body>");
----
[start=4]
. Pressione Ctrl-Shift-I para gerar as instruções de importação necessárias para a classe.
NOTE: ao selecionar bibliotecas para importação para ``Connection`` , ``ConnectionFactory`` , ``Session`` e ``Queue`` , *certifique-se de importar as bibliotecas ``javax.jms`` *.
image::images/import-jms.png[title="Selecione as bibliotecas JMS na caixa de diálogo Corrigir Todas as Importações"]
[start=5]
. Salve as alterações feitas no arquivo.
== Executando o Projeto
Você agora pode executar o projeto. Quando executamos o projeto, queremos que o browser abra a página com o servlet ``ListNews. `` Para isso, especificamos o URL na caixa de diálogo Propriedades da aplicação corporativa. O URL é relativo ao caminho de contexto da aplicação. Após inserirmos o URL relativo, poderemos construir, implantar e executar a aplicação a partir da janela Projetos.
Para definir o URL relativo e executar a aplicação, faça o seguinte:
1. Na janela Projetos, clique com o botão direito do mouse no nó da aplicação corporativa NewsApp e selecione Propriedades no menu pop-up.
2. Selecione Executar no painel Categorias.
3. No campo de texto do URL relativo, digite */ListNews*.
4. Clique em OK.
5. Na janela Projetos, clique com o botão direito do mouse no nó da aplicação corporativa NewsApp e selecione Executar.
Quando você executa o projeto, o servlet ``ListNews`` é aberto no browser e exibe uma lista das mensagens no banco de dados. Quando você executa o projeto pela primeira vez, o banco de dados está vazio, mas você pode clicar em Adicionar Mensagem para adicionar uma mensagem.
image::images/ejb-browser1.png[title="A página do Servlet ListNews"]
Quando você adiciona uma mensagem com o servlet ``PostMessage`` , a mensagem é enviada para o bean baseado em mensagens para gravar em armazenamento persistente e o servlet ``ListNews`` é chamado para exibir as mensagens no banco de dados. A lista de mensagens no banco de dados recuperada por ``ListNews`` em geral ainda não contém a nova mensagem, porque o serviço de mensagens é assíncrono.
== Fazendo Download do Projeto da Solução
Você pode fazer o download da solução para este projeto como um projeto das seguintes formas.
* Faça download link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FNewsAppEE6.zip[+de um arquivo compactado zip do projeto finalizado+].
* Faça o check-out do código-fonte do projeto das Amostras do NetBeans ao executar as etapas a seguir:
1. Escolha Equipe > Subversion > Efetuar check-out no menu principal.
2. Na caixa de diálogo Efetuar Check-out, insira o Repositório URL a seguir:
``https://svn.netbeans.org/svn/samples~samples-source-code``
Clique em Próximo.
[start=3]
. Clique em Procurar para abrir a caixa de diálogo Procurar Pastas do Repositório.
[start=4]
. Expanda o nó raiz e selecione *samples/javaee/NewsAppEE6*. Clique em OK.
[start=5]
. Especifique a Pasta Local para o códigos-fonte (a pasta local precisa estar vazia).
[start=6]
. Clique em Finalizar.
Quando você clica em Finalizar, o IDE inicializa a pasta local como um repositório Subversion e verifica os códigos-fonte do projeto.
[start=7]
. Clique em Abrir Projeto na caixa de diálogo exibida quando o check-out for concluído.
*Observações.*
* É necessário um cliente Subversion para verificar os códigos-fonte. Para saber mais sobre a instalação do Subversion, consulte a seção link:../ide/subversion.html#settingUp[+Configurando o Subversion+] no link:../ide/subversion.html[+Guia do Subversion no NetBeans IDE+].
== Solução de Problemas
A seguir estão alguns dos problemas que você poderá encontrar ao criar o projeto.
=== Problema com os Recursos JMS
Ao usar o assistente para criar recursos JMS, você poderá receber a seguinte mensagem de erro na janela de saída:
[source,java]
----
[com.sun.enterprise.connectors.ConnectorRuntimeException:
JMS resource not created : jms/Queue]
----
Esta mensagem pode indicar que o recurso JMS não foi criado ou não foi registrado no servidor de aplicações. Você pode usar a Console de Admin do servidor de aplicações para verificar, criar e editar recursos JMS.
Para abrir a Console Admin, faça o seguinte:
1. Confirme se o servidor de aplicações está sendo executado, expandindo o nó Servidores na janela Serviços do IDE. Uma pequena seta verde ao lado do nó do servidor de aplicações indica que o servidor está sendo executado.
2. Clique com o botão direito do mouse no nó do servidor de aplicações e selecione Exibir Console Admin para abrir a janela de log-in no browser.
3. Faça log-in no servidor. O nome de usuário e a senha default são ``admin`` e ``adminadmin`` .
4. Na Console Admin no browser, expanda o nó Recursos e o nó Recursos JMS no quadro à esquerda.
5. Clique nos links Fábricas de Conexão e Recursos de Destino no quadro à esquerda para verificar se os recursos estão registrados no servidor e, se necessário, modifique os recursos. Se os recursos não existirem, crie-os na Console Admin.
Certifique-se de que o recurso de fábrica de conexões JMS no servlet PostMessage esteja mapeado para o nome JNDI correto do recurso de fábrica de conexões JMS registrado no Servidor de Aplicações Sun Java System.
Os seguintes recursos devem estar registrados no Servidor de Aplicações Sun Java System:
* um recurso de Destino com o nome JNDI ``jms/NewMessage`` e digite ``javax.jms.Queue``
* um recurso de Fábrica de Conexões com o nome JNDI ``jms/NewMessageFactory`` e digite ``javax.jms.QueueConnectionFactory``
link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20with%20EJB%203.1[+Enviar Feedback neste Tutorial+]
== Consulte Também
Para obter mais informações sobre o uso do NetBeans IDE para desenvolver aplicações Java EE, consulte os seguintes recursos:
* link:javaee-intro.html[+Introdução à Tecnologia Java EE+]
* link:javaee-gettingstarted.html[+Conceitos Básicos sobre Aplicações do Java EE+]
* link:../web/quickstart-webapps.html[+Introdução ao Desenvolvimento de Aplicações Web+]
* link:../../trails/java-ee.html[+Trilha de Aprendizado do Java EE e Java Web+]
Para obter mais informações sobre o uso de enterprise beans, consulte o link:http://docs.oracle.com/javaee/7/tutorial/doc/ejb-intro.htm[+Tutorial do Java EE 7+].
Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos das funcionalidades de desenvolvimento do Java EE do NetBeans IDE, link:../../../community/lists/top.html[+inscreva-se na lista de correspondência de nbj2ee+].