Executando sua aplicação Java na Oracle Application Container Cloud Service

cloudgs_appcontainer

Neste post veremos como  utilizar a plataforma de Cloud da Oracle executar nossas aplicações Java no serviço de Application Container .

Obtendo uma Conta Free

Antes de iniciarmos nossa aventura, você vai precisar criar uma conta na Oracle Cloud para poder utilizar os serviços.

Para isso basta acessar o site : http://cloud.oracle.com/ e criar uma conta trial que te dar $300(900 BRL) para testar a plataforma por 30 dias.

trial
http://cloud.oracle.com/

Bastando preencher os campos solicitado e informar o numero do cartão de credito para que o cadastro seja completado, porem não se preocupe que não sera cobrado nada apos o termino dos 30 dias, a menos que optar por fazer upgrade para uma conta paga para continuar a usar os serviços.

Feito o cadastro, basta aguardar um e-mail de boas vindas com as sua credenciais para acesse a plataforma Oracle Cloud , que leva mais ou menos uns 2 dias.

Oracle Application Container Cloud Service

O Oracle Application Container Cloud Service permite que você implemente aplicativos Java SE, Node.js, PHP, Python, Ruby, Go e .NET para Oracle Cloud. Você também pode implantar aplicações Java EE.

A inscrição no Oracle Application Container Cloud Service disponibiliza todos os tipos quando você faz o deploy. Seu aplicativo é executado em um recipiente Docker.

Com tudo esse serviço oferece os seguinte recursos :

  • Um ambiente pré-configurado para aplicativos Java SE, Java EE, Node.js, PHP, Python, Ruby, Go e .NET.
  • Java SE recursos avançados, como Java Flight Recorder, Java Mission Control, gerenciamento avançado de memória e atualizações de segurança.
  • Plataforma aberta que suporta todos os frameworks Java e contêineres, como Spring, Play, Tomcat e Jersey.
  • Suporte para linguagens baseadas em Java Virtual Machine (JVM), como JRuby. Você pode executar qualquer idioma que use o Java Virtual Machine neste serviço.
  • Suporte de nível empresarial da Oracle.
  • Interface de usuário baseada na Web e API REST.

Além disso, você pode optar por se integrar com outros serviços Oracle Cloud. Você pode desenvolver sua aplicação em seu sistema local ou pode usar o Oracle Developer Cloud Service.

Se você quiser armazenar e recuperar dados, você pode usar Oracle Cloud Infrastructure Object Storage Classic – uma assinatura está incluída. Você também pode se inscrever no Oracle Database Cloud Service ou no MySQL Cloud Service.

Para implantar um aplicativo e configurar um banco de dados em uma única etapa, você pode usar o Oracle Cloud Stack Manager.

Para comunicação, você pode se inscrever no Oracle Messaging Cloud Service. Sua aplicação se comunica com esse serviço através da sua API REST, portanto, nenhuma configuração de segurança especial é necessária.

Bem feita essa rápida introdução sobre o serviço, podemos da inicio ao processo de criação de um app e logo depois uma instancia na Oracle Cloud.

Criando o Projeto

Para esse post criaremos um simples app rest utilizando Payara-micro e Microprofile .

crie um projeto maven e configure o pom.xml da seguinte forma :

dep

dep2

feito isso crie duas classes com o seguinte conteúdo :


@ApplicationPath("app")
public class Boot extends Application { }

 

@Path("JUG")
@Produces(MediaType.APPLICATION_JSON)
public class JUGService {

@Inject
@ConfigProperty(name = "jug.nome")
private String jugNome;

@Inject
@ConfigProperty(name = "jug.leaders")
private String jugLeaders;

@Inject
@ConfigProperty(name = "jug.descricao")
private String descricao;

@GET
public Response getJUG() {
JsonObject json = Json.createObjectBuilder()
.add("Jug", jugNome)
.add("Lideres", jugLeaders)
.add("Descrição", descricao)
.build();

String resultado = json.toString();
return Response.ok().entity(resultado).build();
}
}

 

agora dentro da pasta “META-INF” crie um arquivo beans.xml e um “microprofile-config.properties” :

 

jug.nome = SouJava { Rio }
jug.leaders = Daniel Dias, Paulo Simões, Ulisses Telemaco
jug.descricao = SouJava - Fortalecendo a comunidade Java brasileira.
beans
beans.xml

 

agora podemos fazer o build do projeto e executa-lo localmente, para isso faça o seguinte comando :


mvn clean install

 

sera gerado o build do seu projeto alem de fazer o download do payara-micro conforme a seguinte imagem :

build

para executar seu projeto localmente faça o seguinte comando :


java -jar payara-micro.jar --deploy microprofile-sample.war

após executa-la você poderá acessar o serviço através da url apresentada no console :

payara

Como vimos o projeto funciona localmente, agora para correr o mesmo na Oracle Cloud iremos precisar criar um arquivo extra de configuração bem simples e logo depois zipa-lo para pode ser feito o upload para a Cloud .

Para isso vamos criar o arquivo manifest.json , esse arquivo é o que define como a nossa app vai iniciar, esse arquivo é o equivalente ao do Heroku que no caso é o “Procfile” , então configure o arquivo da seguinte maneira :


{
 "runtime":{"majorVersion":"8"},
 "command":"java -jar payara-micro.jar --deploy microprofile-sample.war --port $PORT"
}

mais detalhes sobre manisfest.json poderá acessar o seguinte link.

Com tudo feito, faça um arquivo zip contendo o war,payara-micro.jar e o arquivo manisfest.json . Apos isso podemos subir para a Oracle Cloud .

Acessando a Oracle Application Container Cloud

Logo apos ter feito o cadastro de uma conta trial e receber o e-mail de boas vindas juntamente com as credenciais para acessar os serviços podemos da inicio na criação de uma instancia do serviço de Contêiner .

Primeiramente acesse o link que você recebeu no e-mail e ao clicá-la sera levado a seguinte tela :

login

entre com seu usuário e senha recebido no e-mail, feito o login sera levado a tela de DashBoard contendo informações sobre seus serviços, valores, notificações, etc.

paineldeControle
Painel de Controle/DashBoard

A partir desta tela podemos criar novas instancias dos serviços disponíveis em nossa conta, com podem observar eu tenho dois serviços listados no meu painel, os mesmo estão sendo exposto aqui, eu especifiquei quais serviços eu quero mostrar em meu painel quando entro na minha conta, podemos adicionar mais serviço clicando no card “Personalizar Painel de Controle”.

Como entrar nessa tela pela primeira vez, temos somente o serviço de Identity Cloud apresentado, para criar uma nova instancia de algum serviço temos duas opções :

1 – Clicando no card “Criar Instancia” que ira da uma lista dos serviços disponíveis separados por categoria .

2 – Clicar no menu ao lado do nome “Oracle Cloud – Meus Serviços”, nisso ira lhe apresentar um menus com uma lista de opções e um outro menu chamado “serviços” que lista os serviços que temos disponíveis para usar.

Para esse post eu vou utilizar o serviço chamado “Application Container” para isso clique no Card criar instancia ou mesmo vai no menu e procurar por esse nome e você sera levado a tela do serviço , como pode ser visto na seguinte imagem :

appCloud

Agora para criarmos uma instancia desse serviço, vamos clicar no botão “Go to Console” e sera exibida a seguinte tela :

create

Clique no botão “Create Application” e sera aberto um popup conforme a imagem:

create2

Selecione o “Java SE” e ira abrir a seguinte tela :

deploy

Nesta tela preencha o que for necessário para você e aguarde a finalização do upload do projeto.

Logo depois você voltara para a tela de Applications com a sua instancia sendo criada conforme a imagem :

demo

clique no nome da sua application para ir para tela de detalhes :

detail

Nesta tela é mostrada os recursos, status de criação da instancia, bem como acesso a URL para podemos ter acesso as aplicações. Se necessário podemos aumentar a memoria e instancia, no meu caso eu tenho 1G memoria, então aumentei para 2 G para ficar no verde.

Para ver a sua app funcionando basta acessa a URL que é disponibilizada, que no meu caso é:

https://demo-danieldiasjava.uscom-east-1.oraclecloud.com/microprofile-sample/app/JUG

que resulta do seguinte resultado no navegador :

json

Agora iremos fazer a mesma coisa, porem com a opção Java EE, iremos fazer um upload de war com uma simples aplicação em Struts-1 :

Clique novamente em “Create Application” e logo depois em “Java EE ” abrindo a seguinte tela :

javaee

preencha o formulário e clique em “Create”, apos isso seu war sera processado e poderá utiliza-lo a a URL disponível  que no meu caso é :

https://struts-danieldiasjava.uscom-central-1.oraclecloud.com/

strutsCloud

 

strutsCloud2

 

Bem isso é tudo, espero que os leitores tenham gostado desse passo a passo na utilização de um dos serviços da Oracle Cloud.

Aproveite seus 30 dias e explore mais esse serviço e teste outros também.

Código-fonte: https://github.com/Daniel-Dos/DanielDiasjava-Blog/tree/master/Projeto-Cloud

REFERÊNCIAS

Anúncios

Conectando sua aplicação Java na Oracle DataBase Cloud

cgkjwwpx
Oracle DataBase Cloud

Neste post veremos como  utilizar a plataforma de Cloud da Oracle para conectar nossas aplicações Java no serviço de DataBase .

Obtendo uma Conta Free

Antes de iniciarmos nossa aventura, você vai precisar criar uma conta na Oracle Cloud para poder utilizar os serviços.

Para isso basta acessar o site : http://cloud.oracle.com/ e criar uma conta trial que te dar $300(900 BRL) para testar a plataforma por 30 dias.

trial
http://cloud.oracle.com/

Bastando preencher os campos solicitado e informar o numero do cartão de credito para que o cadastro seja completado, porem não se preocupe que não sera cobrado nada apos o termino dos 30 dias, a menos que optar por fazer upgrade para uma conta paga para continuar a usar os serviços.

Feito o cadastro, basta aguardar um e-mail de boas vindas com as sua credenciais para acesse a plataforma Oracle Cloud , que leva mais ou menos uns 2 dias.

Oracle DataBase Cloud Service

A Oracle Database Cloud Service fornece a capacidade de implantar bancos de dados Oracle na Cloud, com cada implantação de banco de dados contendo um único banco de dados Oracle.

Você tem acesso total aos recursos e operações disponíveis com o Oracle Database, mas com a Oracle fornecendo o poder de computação, armazenamento físico e ferramentas (opcionalmente) para simplificar a manutenção de banco de dados de rotina e as operações de gerenciamento.

Com tudo esse serviço oferece os seguinte recursos :

  • Versão do DataBase : Instâncias de banco de dados dedicadas com o Oracle Database 11g, 12.1 e 12.2, com sua escolha de Standard, Enterprise, High Performance ou Extreme Performance.
  • Service Packaging : Os pacotes Standard e Enterprise incluem seus respectivos recursos locais e adicionam Transparent Data Encryption. O Alto Desempenho adiciona todas as opções de banco de dados excluindo: RAC, Memória interna e Active Data Guard. Extreme Performance inclui todas as opções.
  • Containerização de banco de dados : O Oracle Database 12c inclui a opção Oracle Multitenant para gerenciar bancos de dados plugáveis.
  • DevOps : Criação de teste de mestre com máscara de dados sensível. Criação de clones e gerenciamento do ciclo de vida para o desenvolvimento ágil.
  • Acesso administrativo : Acesso administrativo via SSH, SQL Developer, Data Pump, SQL * Plus e outras ferramentas.
  • Acesso aos Dados : Use qualquer biblioteca de linguagem de cliente Oracle disponível, incluindo: Oracle Net (SQL * Net), JDBC, JSON e outros drivers para acessar suas instâncias dedicadas.
  • Ferramentas : Use Enterprise Manager, SQL Developer, Application Express ou outras ferramentas Oracle ou de terceiros .
  • Acesso seguro à rede : Opção IPsec VPN para acesso seguro.
  • Escalonamento :  Controle o armazenamento e o dimensionamento de computação através do console web (ou API REST). Explodir de assinatura para computação medida para efetivamente lidar com o pico de carga de trabalho.
  • Segurança : Use o console web do Compute Service (ou a API REST) para gerenciar as regras de segurança e as listas IPsec para uma segurança de rede flexível e de nível empresarial. Aproveite todos os recursos de segurança da Oracle Database em profundidade para obter a segurança completa de dados.
  • Patch e atualização : Use ferramentas de automação de patches incorporadas no console da Web (ou API REST) para fácil aplicação de patches trimestrais do banco de dados. Use processos de migração simples para validar atualizações.
  • Opções de backup : Programe a automação de backup para armazenamento local rápido, o Oracle Cloud Object Store ou ambos. Instanciar novos serviços a partir de cópias de backup para desenvolvimento e teste.
  • Elasticidade : Adicione ou remova recursos de computação, memória ou armazenamento conforme necessário

Bem feita essa rápida introdução sobre o serviço, podemos da inicio ao processo de criação da uma instancia na Oracle Cloud.

Acessando a Oracle DataBase Cloud

Logo apos ter feito o cadastro de uma conta trial e receber o e-mail de boas vindas juntamente com as credenciais para acessar os serviços podemos da inicio na criação de uma instancia do serviço de Contêiner .

Primeiramente acesse o link que você recebeu no e-mail e ao clicá-la sera levado a seguinte tela :

  login

entre com seu usuário e senha recebido no e-mail, feito o login sera levado a tela de DashBoard contendo informações sobre seus serviços, valores, notificações, etc.

paineldeControle
Painel de Controle/DashBoard

A partir desta tela podemos criar novas instancias dos serviços disponíveis em nossa conta, com podem observar eu tenho dois serviços listados no meu painel, os mesmo estão sendo exposto aqui, eu especifiquei quais serviços eu quero mostrar em meu painel quando entro na minha conta, podemos adicionar mais serviço clicando no card “Personalizar Painel de Controle”.

Como entrar nessa tela pela primeira vez, temos somente o serviço de Identity Cloud apresentado, para criar uma nova instancia de algum serviço temos duas opções :

1 – Clicando no card “Criar Instancia” que ira da uma lista dos serviços disponíveis separados por categoria .

2 – Clicar no menu ao lado do nome “Oracle Cloud – Meus Serviços”, nisso ira lhe apresentar um menus com uma lista de opções e um outro menu chamado “serviços” que lista os serviços que temos disponíveis para usar.

Para esse post eu vou utilizar o serviço chamado “DataBase” para isso clique no Card criar instancia ou mesmo vai no menu e procurar por esse nome e você sera levado a tela do serviço , como pode ser visto na seguinte imagem :

welcome

Agora para criarmos uma instancia desse serviço, vamos clicar na aba “Instances” e sera exibida a seguinte tela :

create

Clique no botão “Create Instance” e você sera levado a uma tela com um pequeno formulário para preencher para poder ser criado uma instancia :

form1

Preenche todos os dados e logo depois clique em Next para ir na tela de configuração do Banco. Nessa tela de instancia eu optei por utilizar o Oracle DataBase 12c R2 com essas configurações, mas os leitores podem utilizar outras opções.

form2

Nesta tela preencha o que for necessário para você, no meu caso não irei fazer o uso da configuração de backup. Agora anote o DB Name e PDB Name, pois vamos precisar uma delas para termos acesso a instancia remotamente.

Logo depois clique em Edit no campo “SSH Public Key” para termos acesso a instancia via terminal, nisso ira abrir um pop-pup oferecendo 3 opções para entrar com SSH :

ssh

Marque a opção “Create a New key”  , nisso será gerado uma chave publica e privada e a mesma dará opção fazer Download de um arquivo zip contendo a mesmo, feito isso a tela volta para o formulário com o campo preenchido com o valor da chave, logo em seguida clique em “Next” para ser levado a tela de confirmação das configurações, estando tudo certo clique em “Create” para ser levado novamente a tela de instancia aonde o seu serviço esta sendo criado :

criando

Nesta tela mostra todas as instancia criadas atualmente, bem como um pequeno sumario dos recursos utilizado por esse instancia.

Agora clique no nome do seu serviço para ser levado a tela onde ira conter mais detalhes sobre o serviço ainda em criação :

criando2

Nesta tela é mostrada os recursos, status de criação da instancia, bem como acesso ao ip publico para podemos conectar nossas aplicações com a instancia. Ira levar um tempinho para que o serviço esta ok.

Depois de tudo pronto podemos acessar o serviço, mas antes devemos configurar a regras de acesso para obtermos acesso remotamente, seguindo a imagem abaixo, vá no menu e clique em “Access Rules” :

acessRules

Apos clicar você sera levado a uma outra tela, aonde devemos habilitar duas regras de acesso a  no menu “Action” :

ora_p2_httpssl PUBLIC-INTERNET DB_1 443
ora_p2_dblistener PUBLIC-INTERNET DB_1 1521

feito isso estaremos pronto para acessar a instancia  remotamente via SSH, SQL Developer e através do JDBC e persistence.xml.

Conectando com  SQL Developer, SSH e JDBC/persistence.xml

Agora iremos fazer a conexão com a instancia através do Oracle SQL Developer. Caso não use essa ferramenta, poderá utilizar uma outra, bastando fazer as configurações necessárias .

SQL Developer

Com o SQL Developer clique no icome de “+” para criar uma nova conexão e entre com os dados da sua instancia conforma a imagem :

sqlDeveloper

feito isso basta clicar em conectar e começar a usar o Oracle DataBase Cloud .

SSH

A duas maneira des conectar via SSH, a primeira com o próprio SQL Developer ou via terminal, que no meu caso uso Linux , veremos da duas formas :

1 – Via SQL Developer :

Com o SQL Developer aberto vai no menu View -> SSH nisso ira abrir um aba de “SSH Hosts” , clique com o botão direito no nele e em new SSH Host e preencha da seguinte forma :

sshSQL

logo depois clique em conectar e em seguida alterar a conexão criada anteriormente conforme a imagem e conectar :

sshSQL2

2 – Via Terminal :

Abra o  seu terminal e digite o seguinte comando :

ssh -i local da chave privada oracle@ip-publico da instacia 

caso queria fazer um tunnel entre seu local e o remoto execute o seguinte comando :

ssh -i local da chave privada -L 1523:oracle@ip-publico da instacia 

JDBC / Persistence.xml

Agora para finalizar vamos utilizar com JDBC/persistence.xml para conectar nossas aplicações Java :

Com seu projeto Java aberto e com os jar’s necessário para adicionado no projeto, faça o seguinte :

 

try {
 Connection com = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1523:ORCL","System","Aka1suki6#");

 String insert = "INSERT INTO pessoa"
 + "(ID,IDADE, JOB, NOME) VALUES"
 + "(?,?,?,?)";
 PreparedStatement preparedStatement = com.prepareStatement(insert);

 preparedStatement.setInt(1, 1);
 preparedStatement.setInt(2, 26);
 preparedStatement.setString(3, "Java EE Developer");
 preparedStatement.setString(4, "Daniel");

 preparedStatement.executeUpdate();

 PreparedStatement stm = com.prepareStatement("SELECT * FROM pessoa");
 com.setAutoCommit(true);

 ResultSet resultado = stm.executeQuery();
 Pessoa pessoa = new Pessoa();

 while(resultado.next()) {
 List<Pessoa> pessoas = new ArrayList<>();
 pessoa.setId(resultado.getLong(1));
 pessoa.setIdade(resultado.getInt(2));
 pessoa.setJob(resultado.getString(3));
 pessoa.setNome(resultado.getString(4));

 pessoas.add(pessoa);
 pessoas.forEach(System.out::println);
}
 } catch (SQLException e) {
 e.printStackTrace();
 }

agora com persistence.xml com Java SE :

 
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="WeHaveSciencePU"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1523:ORCL" />
<property name="javax.persistence.jdbc.user" value="System" />
<property name="javax.persistence.jdbc.password" value="Aka1suki6#" />
<!-- <property name="hibernate.connection.provider_disables_autocommit" value="true"/> -->
<property name="javax.persistence.schema-generation.database.action" value="update"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.jdbc_metadata_extraction_strategy" value="individually"/>
</properties>
</persistence-unit>
</persistence>

Caso queira usar com DataSource, basta fazer uma pequena modificação e criar a conexão em algum servidor de aplicação, nesse exemplo vou utilizar o Wildfly-Swarm para configurar o DataSource de forma simples e rápida, dentro da pasta resource/META-INF criar o arquivo “project-default.yml” :

swarm:
 datasources:
 jdbc-drivers:
 oracle:
 driver-class-name: oracle.jdbc.OracleDriver
 driver-module-name: com.oracle

swarm:
 datasources:
 data-sources:
 OracleDS:
 driver-name: oracle
 connection-url: jdbc:oracle:thin:@localhost:1523:ORCL
 user-name: System
 password: suaSenha

e no persistence.xml :

</pre>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

<persistence-unit name="soujava-rio" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/OracleDS</jta-data-source
<class>br.org.soujava.rio.model.JUG</class>
<class>br.org.soujava.rio.model.Localidade</class>

<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>

</persistence-unit>
</persistence>

agora olhando no banco os registros :

jug

Bem isso é tudo, espero que os leitores tenham gostado desse passo a passo na utilização de um dos serviços da Oracle Cloud.

Aproveite seus 30 dias e explore mais esse serviço e teste outros também.

REFERÊNCIAS

 

Executando sua aplicação Java na Oracle Container Cloud

occs_logo1
Oracle Container Cloud

Neste post veremos como  utilizar a plataforma de Cloud da Oracle para executar nossas imagens de docker com uma aplicação Java no serviço de Container.

O objetivo do post não é ensinar como fazer build de uma imagem com o dockerfile e subi a mesma para o docker hub ou até mesmo demonstrar a utilização docker. Mas sim mostrar como executar,fazer pull da imagem para Oracle Container Cloud. Basicamente considere o post como uma tradução do video do Adam Bien .

Diferente do video não estarei utilizando o Glassfish, mas sim usando duas imagens, uma web-app com Wildfly-Swarm e uma api rest com SparkJava com CRUD sendo consumido no Angular 2/4 .

Obtendo uma Conta Free

Antes de iniciarmos nossa aventura, você vai precisar criar uma conta na Oracle Cloud para poder utilizar os serviços.

Para isso basta acessar o site : http://cloud.oracle.com/ e criar uma conta trial que te dar $300(900 BRL) para testar a plataforma por 30 dias.

trial
http://cloud.oracle.com/

Bastando preencher os campos solicitado e informar o numero do cartão de credito para que o cadastro seja completado, porem não se preocupe que não sera cobrado nada apos o termino dos 30 dias, a menos que optar por fazer upgrade para uma conta paga para continuar a usar os serviços.

Feito o cadastro, basta aguardar um e-mail de boas vindas com as sua credenciais para acesse a plataforma Oracle Cloud , que leva mais ou menos uns 2 dias.

Oracle Cloud Container

Os serviços Oracle Cloud ajudam os usuários a criar contêineres e  oferece a
capacidade de criar serviços de forma rápida e fácil, aumentando assim a produtividade de uma empresa.

Este serviço usa ambientes especiais de produção, teste e pré-produção. O objetivo principal do Oracle Container Cloud Service é gerenciar o Docker e melhorar o controle para que os sistemas funcionem corretamente.

Com a Oracle Container Cloud oferece às equipes de Desenvolvimento e Operações os benefícios de um contentor Docker fácil e segura ao criar e implantar aplicativos.

Com tudo esse serviço oferece os seguinte benefícios :

  • fornece uma interface fácil de usar para gerenciar o ambiente Docker .
  • fornece exemplos imediatos de serviços contatados e pilhas de aplicativos que podem ser implantados em um clique.
  • permite que os desenvolvedores se conectem facilmente aos seus registros Docker privados (para que eles possam “trazer seus próprios contêineres”).
  • permite que os desenvolvedores se concentrem em criar imagens de aplicativos em contêineres e pipelines de Integração Contínua / Entrega Contínua (CI / CD), não em aprender tecnologias de orquestração complexas.

Bem feita essa rápida introdução sobre o serviço, podemos da inicio ao processo de criação da uma instancia na Oracle Cloud.

Acessando a Oracle Cloud Container

Logo apos ter feito o cadastro de uma conta trial e receber o e-mail de boas vindas juntamente com as credenciais para acessar os serviços podemos da inicio na criação de uma instancia do serviço de Contêiner .

Primeiramente acesse o link que você recebeu no e-mail e ao clicá-la sera levado a seguinte tela :

  login

entre com seu usuário e senha recebido no e-mail, feito o login sera levado a tela de DashBoard contendo informações sobre seus serviços, valores, notificações, etc.

paineldeControle
Painel de Controle/DashBoard

A partir desta tela podemos criar novas instancias dos serviços disponíveis em nossa conta, com podem observar eu tenho dois serviços listados no meu painel, os mesmo estão sendo exposto aqui, eu especifiquei quais serviços eu quero mostrar em meu painel quando entro na minha conta, podemos adicionar mais serviço clicando no card “Personalizar Painel de Controle”.

Como entrar nessa tela pela primeira vez, temos somente o serviço de Identity Cloud apresentado, para criar uma nova instancia de algum serviço temos duas opções :

1 – Clicando no card “Criar Instancia” que ira da uma lista dos serviços disponíveis separados por categoria .

2 – Clicar no menu ao lado do nome “Oracle Cloud – Meus Serviços”, nisso ira lhe apresentar um menus com uma lista de opções e um outro menu chamado “serviços” que lista os serviços que temos disponíveis para usar.

Para esse post eu vou utilizar o serviço chamado “Container Versão Classic ” para isso clique no Card criar instancia ou mesmo vai no menu e procurar por esse nome e você sera levado a tela do serviço , como pode ser visto na seguinte imagem :

container
Oracle Container Console

Agora para criarmos uma instancia desse serviço, vamos clicar na aba “Instances” e sera exibida a seguinte tela :

create

Clique no botão “Create Instance” e você sera levado a uma tela com um pequeno formulário para preencher para poder ser criado uma instancia :

new

Preenche todos os dados e logo depois clique em Edit no campo “SSH Public Key” para termos acesso a instancia via terminal, nisso ira abrir um pop-pup oferecendo 3 opções para entrar com SSH :

ssh

Marque a opção “Create a New key”  , nisso será gerado uma chave publica e privada e a mesma dará opção fazer Download de um arquivo zip contendo a mesmo, feito isso a tela volta para o formulário com o campo preenchido com o valor da chave, logo em seguida clique em “Next” para ser levado a tela de confirmação das configurações, estando tudo certo clique em “Create” para ser levado novamente a tela de instancia aonde o seu serviço esta sendo criado :

service

Nesta tela mostra todas as instancia criadas atualmente, bem como um pequeno sumario dos recursos utilizado por esse instancia.

Agora clique no nome do seu serviço para ser levado a tela onde ira conter mais detalhes sobre o serviço ainda em criação :

overview

Nesta tela é mostrada os recursos, status de criação da instancia, bem como acesso a url para acessar o console para podemos utilizar o serviço,etc. Ira levar um tempinho para que o serviço esta ok.

Depois de tudo pronto podemos acessar o serviço, para isso bastamos ir no menu como na imagem a seguir e clicar em “Container Console” :

menu

Apos clicar você sera levado a uma outra tela de login, aonde deve ser inserido o login e senha criado no momento da criação da instancia :

log

feito isso você estará dentro do console do serviço, ou seja o painel de controle/dashboard conforme a imagem e nesse link contem as descrição de cada função desta tela :

console

agora bastamos clicar em “Services” e seremos levados a seguinte tela :

images

aqui é mostrado uma lista de serviços pré-configurados bastando usá-los e modificá-los da sua maneira.

Agora para a gente fazer um pull da nossa imagem que fica no docker hub, precisaremos criar um serviço, para isso basta clicar no botão “New Serviçe” e vai abrir um pop-pup com um pequeno formulário para criação do nosso serviço nesse link contem as descrição de cada função desta tela  :

newService

bastando preencher o mesmo da seguinte forma para esse post fiz da seguinte maneira :

conf

conf2

conf3

indo na aba YAML você poderá ver como ficou a configuração :

yaml

feito isso basta clicar em salvar, nisso você voltara para a tela de serviços, bastando procura pelo nome do serviço que no meu caso é “danieldiasjava” e clicar em “Deploy” para da inicial ao pull da imagem do docker :

deploy

feito isso, clique no “Container Name” para ir para tela de detalhe e pegar o ip publico para acessar o app :

deploya

nesta tela va na aba “Environment Variable” para ser mostrado um log aonde ira comter o ip_publico conforme a imagem :

ip_public

pegando o ip que no meu caso é public_ip : 129.150.112.30 e utilizando o mesmo no navegador. Então para acessar a os serviço da imagem danieldiasjava/sparkjava-crud temos os seguintes endereços :

GET: http://localhost:8080/api/consultar
POST: http://localhost:8080/api/cadastrar
GET: http://localhost:8080/api/consultar/{codigo}
PUT: http://localhost:8080/api/editar
DELETE: http://localhost:8080/api/deletar/{codigo}

então utilizando o PostMan para testar nosso serviço com o Post da seguinte maneira :

restPost

e fazendo um Get com http://129.150.112.30:8080/api/consultar , trazendo o resultado :

resultado

 

também podemos fazer uso de um frond-end para esta consumindo esse rest, para tal tenho esse simples app feito em angular 2/4 disponível no seguinte link, bastando alterar o arquivo config.service.ts com o endereço do serviço  :

crud

para ver os logs , você pode clicar em “View Logs” no mesmo local quando vimos para pegar o ip_public :

logs

Agora iremo fazer o mesmo para a imagem do Wildfly-Swarm seguindo o mesmo passos, bastando apenas mudar a porta para 8081:8080 ,passando o nome da imagem  : danieldiasjava/ozark-demo , depois do deploy basta acessar o endereço que no meu caso é : http://129.150.112.30:8081/app/ :

souJava

Depois disso bastamos paramos nosso serviço e remover os mesmo no menu “Deployments”, se necessário também pode remover suas imagem no menu “Services”:

remove

Para sair do console do Container basta fazer logout e vamos agora remover nosso serviço de container voltando novamente na tela aonde criamos nossa instancia e acessar um pequeno menu e clicar em “Delete” e marcar uma check-box para forçar o delete :

remo

Bem isso é tudo, espero que os leitores tenham gostado desse passo a passo na utilização de um dos serviços da Oracle Cloud.

Aproveite seus 30 dias e explore mais esse serviço e teste outros também.

O código-fonte para o projeto SparkJava-crud pode ser encontrado aqui.

REFERÊNCIAS

 

JSR-371 ( MVC 1.0 ) – Com TomCat & TomEE

Logo_MVC_twitter_cmyk
Barista Duke – [DOAG](https://www.doag.org/de/home/)

Neste post veremos como podemos utilizar o MVC 1.0 juntamente com TomCat e TomEE a partir do modulo Ozark-RestEasy que foi comentado no post anterior .

TOMCAT

Iniciaremos pelo Tomcat pois é o que da mais trabalho durante as configurações.

Crie um projeto maven com as seguinte dependências :


<!-- Get the API JARs for Java EE 7 -->
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
</dependency>

<!-- Weld  -->
<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet-core</artifactId>
    <version>2.4.3.Final</version>
</dependency>

<!-- RESTEasy -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-cdi</artifactId>
    <version>3.1.4.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version> 3.1.4.Final</version>
</dependency>

<!-- Bean Validation -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

<!-- MVC + Ozark for RESTEasy-->
<dependency>
    <groupId>javax.mvc</groupId>
    <artifactId>javax.mvc-api</artifactId>
    <version>1.0-pr</version>
</dependency>
<dependency>
    <groupId>org.mvc-spec.ozark</groupId>
    <artifactId>ozark-resteasy</artifactId>
    <version>1.0.0-m03</version>
</dependency>
 

feito isso, seguiremos para configuração dos arquivos beans.xml e context.xml :

dentro da pasta /src/main/webapp/WEB-INF crie um arquivo beans.xml com o seguinte conteudo :

 <?xml version="1.0"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd
"version="1.1" bean-discovery-mode="all">

</beans>
 

agora na pasta src/main/resources/META-INF crie um arquivo context.xml com o seguinte conteudo :

 <?xml version="1.0" encoding="UTF-8"?>
<Context>

   <Resource name="BeanManager" auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"/>

</Context>
 

Este arquivo é essencial para um correto funcionamento do CDI com o Tomcat, o mesmo é descrito aqui Weld Documentação .

Logo também devemos criar um aquivo web.xml na pasta src/main/webapp/WEB-INF com o seguinte conteúdo :

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

	<listener>
   	<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

  <resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
  </resource-env-ref>

  <!--http://docs.jboss.org/resteasy/docs/3.1.4.Final/userguide/html_single/index.html#d4e143 -->
  <context-param>
    <param-name>resteasy.injector.factory</param-name>
    <param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
  </context-param>

</web-app>
 

Com tudo pronto, podemos da inicio a um Hello Tomcat seguindo os post anteriores.

TOMEE

O TomEE utilizar a CXF como implementação do Jax-RS, porem a Ozark no momento não suporta por causa de bugs no CXF causando problemas com a utilização do Ozark.

Como alternativa, podemos utilizar o modulo Ozark-RestEasy para o seu funcionamento.

crie um projeto maven com o seguinte conteúdo :

<dependency>
    <groupId>javax.mvc</groupId>
    <artifactId>javax.mvc-api</artifactId>
    <version>1.0-pr</version>
</dependency>

<dependency>
    <groupId>org.mvc-spec.ozark</groupId>
    <artifactId>ozark-resteasy</artifactId>
    <version>1.0.0-m03</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-cdi</artifactId>
    <version>3.1.4.Final</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version>3.1.4.Final</version>
</dependency>

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>8.0</version>
    <scope>provided</scope>
</dependency>
 

Da mesma forma que vimos para o TomCat vamos precisar configurar nosso XML, mas ao invés de 3, serão apenas o beans.xml e o web.xml.

o conteúdo do web.xml na pasta src/main/webapp/WEB-INF com o seguinte conteúdo :

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>tomee</display-name>
  <context-param>
	<param-name>resteasy.injector.factory</param-name>
	<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
	</context-param>
</web-app>

Com tudo pronto, podemos da inicio a um Hello TomEE seguindo os post anteriores.

Bem isso é tudo, aqui aprendemos  como fazer a api MVC 1.0 funcionar no TomCat & TomEE, espero que gostem, o código pode se encontrado aqui .

Atualmente a SPEC esta em Public Review e também estão movendo para Fundação Eclipse sobre o Projeto EE4J.

Sinta-se livre para se juntar à nossa lista de discussão e nos informar o que você acha. Você pode publicar suas opiniões na lista ou registrar um problema no rastreador de problemas.

REFERÊNCIAS

 

Criando uma aplicação com JSR-371(MVC 1.0)

Neste artigo criaremos uma aplicação simples para demostrar o uso da API MVC 1.0 (JSR 371) do Java EE 8 juntamente com MongoDB.

Boa Leitura.

mvc1-0capa

Introdução ao MVC 1.0

MVC é um padrão comum em frameworks web, onde este é usado predominantemente para criar aplicativos HTML. Frameworks web podem ser categorizados como Action-Based ou Component-Based. Em Action-Based, as solicitações HTTP são encaminhadas para controladores onde elas são transformadas em ações pelo código da aplicação. Em Component-Based, as solicitações HTTP são agrupadas e normalmente tratadas por framework de Componente, com pouca ou nenhuma interação do código da aplicação. Em outras palavras, um framework baseado em componentes, a maioria da sua lógica do controle é fornecida pelo framework em vez da aplicação.

Esta API se enquadra na categoria Action-Based, ela não se destina a substituição de frameworks baseado em componentes como a JSF, mas simplesmente uma alternativa para a construção de aplicações web para a plataforma Java EE.

Os Objetivos da API:

De acordo com a sua especificação está api propõe os seguintes objetivos:

  • Aproveitar as tecnologias Java EE existentes.
  • Integrar com CDI e Bean Validation
  • Definir um núcleo solido para construir aplicações MVC sem a necessidade suportar todas as funcionalidade em sua primeira versão.
  • Explora as camada em cima do JAX-RS com a finalidade de reutilizar suas camadas de Matching e binding.
  • Fornece suporte interno para JSP e Facelets.

Não são Objetivos da API:

  • Definir uma nova linguagem de visualização(template) e processador.
  • Suporte a serviços REST não baseads em JAX-RS.
  • Suporte a implementação autônoma do MVC executado fora do Java EE.
  • Fornecer suporte interno para views que não fazem parte do Java EE.

Criando o Projeto

Antes de inciarmos a criação do projeto devemos fazer o download do servidor de Aplicação para que o mesmo funcione. Porém até o momento ela funciona com uma versão especifica do GlassFish que pode ser baixada no seguinte link : http://download.oracle.com/glassfish/4.1/nightly/glassfish-4.1-b17-09_15_2015.zip .   Feito isso, podemos da inicio.

Com o Eclipse aberto, vá File -> New – > Maven Project irá abrir a seguinte Janela :

maven

 clique em Next para ir para a seguinte tela :

maven2

    clique em Next, na próxima deixe preenchida da seguinte forma  e clique em Finish:

mvc1

com o projeto criado,vá em src/main/webapp, nela apague a pasta WEB-INF. Depois clique com o botão direito do mouse e vá em Properties, navegue até a opção Targeted Runtimes, marque a opção, que no caso vamos utilizar o GlassFish, depois clique em Uninstall Facets… :

mvc2

mvc3

ao chegar nesta tela desmaque Dynamic Web Module , altere Java 1.5 para 1.8,marque CDI,Glassfish Web Extensions e JAX-RS e clique em Finish. Abra novamente a mesma tela e maque Dynamic Web Module e mude de 2.3 para 3.1 e clique em Next para configura a proxima tela e a configure como abaixo :

mvc5

Clique em Finish e depois em OK.

Agora iremos configurar nosso pom.xml, com a seguinte configurações :

<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.danieldias</groupId>
  <artifactId>MVC1.0.Ozark</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>MVC1.0.Ozark Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>

	<!-- Mongo Driver -->
		<dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongodb-driver</artifactId>
			<version>3.4.1</version>
		</dependency>

		<dependency>
            <groupId>org.glassfish.ozark</groupId>
            <artifactId>ozark</artifactId>
            <version>1.0.0-m02</version>
            <scope>compile</scope>
        </dependency>

         <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-server</artifactId>
			<version>2.22</version>
		</dependency>
  </dependencies>
  <build>
    <finalName>MVC1.0.Ozark</finalName>
    		<plugins>
    		   <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
  </build>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
</project>

 Na pasta WEB-INF , configure o beans.xml do CDI da seguinte forma :

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://xmlns.jcp.org/xml/ns/javaee
 http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

Ainda dentro de WEB-INF também crie uma pasta chamada views.
Depois clique em cima do projeto e de “Alt +F5” para fazer update do maven :

mvc6

Clique em OK e finalizamos a parte de criação projeto, podemos da inicio a codificação de nossas classes .

Criando a Constantes.java

Está classe é bem simples, ela irá somente conter valores constantes, que não serão modificadas. Isso para evitar ter muitas hardCode espalhado por todo o código, assim esse classe irá centralizar tudo de maneira organizada.

Crie uma classe chamada Constantes no package br.com.danieldias.commons, com o seguinte conteúdo :

package br.com.danieldias.commons;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Constantes {

	/*Nome o Banco e da Collection*/
	public static final String BANCO_NOME = "danieldiasjava";
	public static final String COLLECTION_NOME = "pessoas";

	/*Nomes das Colunas para o MongoDB*/
	public static final String NOME = "nome";
	public static final String IDADE = "idade";
	public static final String ENDERECO = "endereco";
	public static final String ESTADO = "estado";
	public static final String JUGS = "jugs";
	public static final String DESCRICAO = "descricao";
	public static final String ID = "_id";
}

Criando as Entidades

Crie as classes Pessoa.java e Endereco.java no package br.com.danieldias.model , com o seguinte conteúdo :

package br.com.danieldias.model;

import javax.ws.rs.FormParam;

import org.bson.types.ObjectId;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Pessoa {

	@FormParam("_id")
	private ObjectId _id;

	@FormParam("nome")
	private String nome;

	@FormParam("idade")
	private int idade;

	@FormParam("endereco")
	private Endereco endereco;

	@FormParam("jugs")
	private String jugs;

	@FormParam("descricao")
	private String descricao;

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Pessoa() {
	}

	public Pessoa(String nome, Endereco endereco,
			String descricao,int idade,
			String jugs) {
		super();
		this.nome = nome;
		this.endereco = endereco;
		this.descricao = descricao;
		this.idade = idade;
		this.jugs = jugs;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public ObjectId get_id() {
		return _id;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public String getJugs() {
		return jugs;
	}

	public void setJugs(String jugs) {
		this.jugs = jugs;
	}
}

A anotação @FormParam, são utilizados para pegar os valores do form do html.

package br.com.danieldias.model;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Endereco {

	private String estado;

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Endereco() {
	}

	public Endereco(String estado) {
		super();
		this.estado = estado;
	}
}

Criando o Repositorio

Agora criaremos uma Inteface chamada MongoDAO ,uma classe chamada PessoaDAO e uma classe que ira criar a fabrica de conexão chamada MongoDBFactory no package br.com.danieldias.persistencia, com os seguintes conteúdos:

package br.com.danieldias.persistencia;

import com.mongodb.MongoClient;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class MongoDBFactory {

	public static MongoClient createConnection() {
		MongoClient conexao = null;
		if(conexao == null) {
			conexao = new MongoClient();
		}
		return conexao;
	}
}

A classe PessoaDAO é onde fica todas as operações de CRUD para o MongoDB, nada muito fora do comum, tudo muito simples e fácil compreensão. Repare que estamos usando a classe Constantes aqui no lugar de String para facilitar o entendimento e deixar o código mas limpo.

package br.com.danieldias.persistencia;

import static com.mongodb.client.model.Filters.eq;

import java.util.ArrayList;
import java.util.List;

import org.bson.Document;
import org.bson.types.ObjectId;

import com.mongodb.MongoClient;
import com.mongodb.MongoCursorNotFoundException;
import com.mongodb.MongoException;
import com.mongodb.MongoQueryException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;

import br.com.danieldias.commons.Constantes;
import br.com.danieldias.model.Pessoa;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class PessoaDao implements MongoDAO<Pessoa> {

	MongoClient conexao;
	MongoCollection<Document> collectionPessoas;

	public PessoaDao() {
		conexao = MongoDBFactory.createConnection();
		collectionPessoas =
				conexao.getDatabase(Constantes.BANCO_NOME)
				.getCollection(Constantes.COLLECTION_NOME);
	}

	@Override
	public void inserir(Pessoa entidade) throws MongoException {

		List<Document> jugs = new ArrayList<>();
		jugs.add(new Document(Constantes.NOME,entidade.getJugs())
				.append(Constantes.DESCRICAO, entidade.getDescricao()));

		collectionPessoas.insertOne(new Document(Constantes.NOME,entidade.getNome())
				 .append(Constantes.ENDERECO,
							new Document(Constantes.ESTADO,entidade.getEndereco().getEstado())
							)
				 .append(Constantes.IDADE,entidade.getIdade())
				 .append(Constantes.JUGS, jugs)
				 );
	}

	@Override
	public void alterar(Pessoa entidade) throws MongoException {

		collectionPessoas.updateOne(porId(entidade.get_id()),
				new Document("$set",
						new Document(Constantes.IDADE,entidade.getIdade())
						.append(Constantes.NOME, entidade.getNome())
						.append(Constantes.ENDERECO,
								new Document(Constantes.ESTADO,entidade.getEndereco().getEstado()))
						)
				);
	}

	@Override
	public void deletar(ObjectId _id) throws MongoQueryException {
		collectionPessoas.findOneAndDelete(porId(_id));
	}

	@Override
	public MongoCursor<Document> listarTodos() throws MongoCursorNotFoundException, MongoQueryException {
		return collectionPessoas.find().iterator();
	}

	@Override
	public Document porId(ObjectId _id) throws MongoQueryException {
		return collectionPessoas.find(eq(Constantes.ID,_id)).first();
	}
}

Agora nossa interface generica:

package br.com.danieldias.persistencia;

import org.bson.Document;
import org.bson.types.ObjectId;

import com.mongodb.MongoCursorNotFoundException;
import com.mongodb.MongoException;
import com.mongodb.MongoQueryException;
import com.mongodb.client.MongoCursor;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public interface MongoDAO<T> {

	void inserir(T entidade) throws MongoException;
	void alterar(T entidade) throws MongoException;
	void deletar(ObjectId _id) throws MongoQueryException;
	MongoCursor<Document> listarTodos() throws MongoCursorNotFoundException,MongoQueryException;
	Document porId(ObjectId _id) throws MongoQueryException;
}

Criando os Controles

Entramos na parte principal, aqui veremos com a api funciona.

Crie uma nova classe chamada PessoaController no package br.com.danieldias.controller, com o seguinte conteúdo :

package br.com.danieldias.controller;

import javax.inject.Inject;
import javax.mvc.Models;
import javax.mvc.Viewable;
import javax.mvc.annotation.Controller;
import javax.mvc.annotation.View;
import javax.ws.rs.BeanParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

import org.bson.types.ObjectId;

import br.com.danieldias.model.Pessoa;
import br.com.danieldias.persistencia.MongoDAO;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
@Controller
@Path("mvc")
public class PessoaController {

	@Inject
	Models models;

	@Inject
	MongoDAO<Pessoa> pessoaDao;

	@GET
	@Path("novo")
	public Viewable novo() {
		return new Viewable("inserir.jsp");
	}

	@GET
	@Path("mostrar")
	@View("mostrar.jsp")
	public void listar() {
	  this.models.put("listar", pessoaDao.listarTodos());
	}

	@POST
	@Path("add")
	public String adicionar(@BeanParam Pessoa pessoa) {
		pessoaDao.inserir(pessoa);

		return "redirect:mvc/mostrar";
	}

	@POST
	@Path("update")
	public String atualizar(@BeanParam Pessoa pessoa) {
		pessoaDao.alterar(pessoa);
		return "redirect:mvc/mostrar";
	}

	@GET
	@Path("atualizar/{_id}")
	public Viewable update(@PathParam("_id") ObjectId _id) {
		this.models.put("update",pessoaDao.porId(_id));
		return new Viewable("alterar.jsp",models);
	}

	@GET
	@Path("remover/{_id}")
	public String deletar(@PathParam("_id") ObjectId _id) {
		pessoaDao.deletar(_id);
		return "redirect:mvc/mostrar";
	}
}

O código é semelhante ao que usamos no Spring. Então nessa parte fica bem tranquila de aprender quando a API for lançada oficialmente, é até la vai haver muitas mudanças e melhoramentos.

O @Controller, quando aplicada a uma classe, todos os métodos nele são considerados como controladores. Ao usar a anotação @Controller em um subconjunto de métodos define uma classe hibrida em que certos métodos são controladores e outros são métodos tradicionais do JAX-RS.

O @Path é o endereço que iremos acessar determinada ação para o controlador e acessar outros métodos por outras endereços também, isso é semelhante ao @RequestMapping() do spring.

A class Viewable encapsula informações sobre uma visualização, bem como, opcionalmente, informações sobre como ele deve ser processado. Mais precisamente, uma instância Viewable pode incluir referências a Modelos e Objetos ViewEngine. Comparada ao Spring ela seria como ModelAndView.

Models é a interface que define um mapa entre nomes e objetos. O suporte para a interface Models é obrigatória para todos os view engines, porém podemos usar OPCIONALMENTE o @Named  do CDI que é fortemente recomendado para aproveitar a integração CDI e EL existente na plataforma.

Os métodos do controlador que retornam um tipo não-vazio(void) também podem ser decorados com @View como uma forma de especificar um padrão para o controlador. A visualização padrão deve ser usada somente quando tal controlador não vazio retorna um valor nulo.

A anotação @BeanParam é algo novo adicionado na especificação JAX-RS 2.0. Ele permite que você injete uma classe específica de aplicativo cujos métodos de propriedade ou campos são anotados com qualquer um dos parâmetros de injeção, como foi utilizada o @FormParam.

@PathParam permite que você injete o valor de parâmetros de caminho URI nomeados que foram definidos em expressões @Path.

Criando as Views

Agora daremos inicio a criação de 4 páginas para nossa aplicação que são : alterar.jsp, inserir.jsp ,mostrar.jsp  que devem ser criada na pasta views que fica dentro de WEB-INF, já a index.jsp deve ser criada em na pasta  webapp.

Iniciaremos pela a página mostrar.jsp, onde a mesma terá uma tabela onde os dados serão apresentados, 3 links um para chamar a paǵina alterar.jsp passando um parâmetro que é seu id e um que irá chamar no controle o deletar com parâmetro id e um para estarmos adicionando os dados no formulario inserir.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Mostrar</title>
</head>
<body>
<h1 align="center">Listagem dos Dados</h1>
<a href="novo">Adicionar</a>
<table align="center" border="4">
<tr bgcolor="gray">
<th>ID</th>
<th>Nome</th>
<th>Idade</th>
<th>Estado</th>
<th>JUGS</th>
<th>Descrição</th>
<th>Editar</th>
<th>Deletar</th>
</tr>
<c:forEach items="${listar}" var="pessoas">
<tr>
<td>${pessoas._id}</td>
<td>${pessoas.nome}</td>
<td>${pessoas.idade}</td>
<td>${pessoas.endereco.estado}</td>
<td>${pessoas.jugs.get(0).nome}</td>
<td>
				<textarea rows="10" cols="60" name="descricao" disabled="disabled"> ${pessoas.jugs.get(0).descricao} </textarea></td>
<td><a href="atualizar/${pessoas._id }">Alterar</a></td>
<td><a href="remover/${pessoas._id}">Excluir</a></td>
</tr>
</c:forEach></table>
</body>
</html>

Algo importante nesta tela. Aqui os atributos passado devem SER o mesmo que estão no mongoDB, ou seja as colunas tem que ter os mesmo nome. A mesma coisa nesse techo : ${pessoas.jugs.get(0).nome}, aqui estou retornado o primeiro posição no array, se quisermos chamar outra posição fazemos assim : ${pessoas.jugs.get(1).lideres}.
A proxima tela é um formulario bem simples com o seguinte conteudo :

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Inserir</title>
</head>
<body>
<div align="center">
<form action="add" method="post">
<fieldset style="width: 400px">
<legend>Dados</legend>

	 Nome: <input type="text" name="nome" />

    Idade: <input type="number" name="idade"/>

   Estado: <input type="text" name="endereco"/>

   JUGS:<input type="radio" name="jugs" value="SouJava"/>SouJava
   <input type="radio" name="jugs" value="RioJug"/>RioJug
   <input type="radio" name="jugs" value="SouJava Campinas"/>SouJava Campinas

   <textarea rows="10" cols="30" name="descricao">Descrição</textarea>

   <input type="submit" value="Cadastrar Dados."/></fieldset>
</form></div>
</body>
</html>

e última tela que contem um formulário já preenchido com os valores do banco que podem ser alterados :

<%@page contentType="text/html" language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Atualizar Dados</title>
</head>
<body>
<div align="center">
<form action="../update" method="post">
<fieldset style="width: 400px">
<legend>Alteração de Dados</legend>

		<input type="text" name="_id" value="${update._id }" hidden="true">

      Nome:<input type="text" name="nome" value="${update.nome }">

      Idade: <input type="number" name="idade" value="${update.idade }"/>

      Cidade<input type="text" name="endereco"  value="${update.endereco.estado}">

      <textarea rows="10" cols="30" name="descricao" disabled="disabled">${update.jugs.get(0).descricao}</textarea>

      <input type="submit" value="Atualizar"></fieldset>
</form></div>
</body>
</html>

agora nossa pagina index.jsp contendo a url para chamar a tela mostrar.jsp e iniciar a aplicação.

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index MVC</title>
</head>
<body>
<h1 align="center">Demo JSR 371 - MVC 1.0</h1>
<div align="center">
<ul type="none">
	<li ><a href="app/mvc/mostrar">Listar Dados</a></li>
</ul>
</div>
</body>
</html>

por fim iniciar a aplicação devemos criar uma classe que extenda a javax.ws.rs.core.Application e anota-la com @ApplicationPath, essa classe deve ser criada no package br.com.danieldias.application com o seguinte conteúdo :

package br.com.danieldias.application;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
@ApplicationPath("app")
public class MVCApplication extends Application {
}

Rodando a Aplicação

Com tudo pronto, podemos testar a nossa aplicação:
Primeiramente inicie o MongoDB através do prompt/terminal com o seguinte comando : mongod, como na imagem:

mongod

Depois rode a aplicação no glassfish , com o botão direito do mouse clique no seu projeto e vá em Run As -> Run on Server, ao inicia a aplicação a página principal será carregada com abaixo :

indexmvc

Clique no link  para ser levado a pagina que lista todos os dados, como na imagem :

telamvc

Clique no link Adicionar, irá ser levado para a tela de formulário:

telamvc2

Ao clicar em Cadastrar Dados, voltará para a tela de listagem dos dados :

listagem

Agora clicando em Excluir irá deletar a informação através do ID que foi passado por parâmetro. Em Alterar será levado a tela de alteração de dados e retornara para tela de listagem :

alterar

Bem isso é tudo, aqui aprendemos a como fazer uma aplicação utilizado a api MVC1.0 do JEE 8 com MongoDB . O projeto pode ser baixado no meu GitHub.

Outros exemplos da API pode ser encontrados aqui : https://github.com/spericas/ozark/tree/master/test
Para saber mais sobre a API visite os seguintes sites :

mvc-spec

Ozark- RIOzark- RI

mvc-1-0-jsr-para-um-framework-mvc-action-based-na-java-ee-8

primeiros-passos-do-mvc-1-0

REFERÊNCIAS

https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/index.html

https://jcp.org/en/jsr/detail?id=371

http://download.oracle.com/otn-pub/jcp/mvc-1-edr2-spec/JSR_371-EDR-Spec-MVC-1_0-10_2_15.pdf

Aplicação Spring MVC com MongoDB

Neste artigo criaremos um aplicação simples utilizando Spring MVC juntamente com MongoDB.

Boa Leitura.

capa

Antes de começarmos a criar nosso projeto, primeiramente tem que conhecer um pouco sobre  o banco de dados mongodb e Mongo Shell. Sua instalação pode ser vista aqui Obtendo e Configurando o MongoDB em seu Ambiente.

Spring MVC  é um framework  Action Based que tem ganhado bastante espaço ultimamente no universo Java para criação de projeto Web, antes dele era Struts 1 que também é um framework Action Based.

O projeto vai ser bem simples, um crud utilizando mongodb com um relacionamento entre dois documentos.

Criando o Projeto

Com o Eclipse aberto, vá File -> New – > Maven Project irá abrir a seguinte Janela :

maven

clique em Next para ir para a seguinte tela :

maven2

clique em Next, na próxima deixe preenchida da seguinte forma  e clique em Finish:

blog2

com o projeto criado,vá em src/main/webapp, nela apague a pasta WEB-INF. Depois clique com o botão direito do mouse e vá em Properties, navegue até a opção Targeted Runtimes, marque a opção, que no caso vamos utilizar o Tomcat, depois clique em Uninstall Facets… :

target-maven

facets

ao chegar nesta tela desmaque Dynamic Web Module , altere Java 1.5 para 1.8 e clique em Finish. Abra novamente a mesma tela e maque Dynamic Web Module e mude de 2.3 para 3.1 e clique em Next para configura a proxima tela e a configure como abaixo :

web

Clique em Finish e depois em OK.

Agora iremos configurar nosso pom.xml, com a seguinte configurações :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>br.com.danieldias</groupId>
	<artifactId>SpringMongo</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>SpringMongo Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<!-- Mongo Driver -->
		<dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongodb-driver</artifactId>
			<version>3.2.2</version>
		</dependency>

		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.0.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.0.RELEASE</version>
		</dependency>

		<!-- JSTL -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>SpringMongo</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
</project>

Na pasta WEB-INF , configure o web.xml na seguinte forma :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>SpringMongo</display-name>

  <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
<servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

Ainda dentro de WEB-INF crie um xml com o nome spring-context.xml, com o seguinte conteúdo e também crie uma pasta chamada views:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

<!-- scaneia todos os pacotes a procura de componentes do Spring-->
  <context:component-scan base-package="br.com.danieldias"/> 

      <context:annotation-config />
	<mvc:annotation-driven />

<!-- configura css,js,etc -->
<mvc:resources location="/recursos/" mapping="/recursos/**"/>

	<!-- Configurando a localização das Views. -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/WEB-INF/views/"/>
			<property name="suffix" value=".jsp"/>
	</bean>

</beans>

Agora na pasta webapp crie uma pasta chamada recursos com as seguinte subpastas : css, js e imagens, dentro de cada uma delas  seguinte arquivos :

  • jquery-ui-1.9.2.custom.min.css
  • calendar.gif
  • datepicker-pt-BR.js
  • jquery-3.1.0.min.js
  • jquery-ui-1.9.2.custom.min.js

Depois clique em cima do projeto e de “Alt +F5” para fazer update do maven :

f5

Clique em OK e finalizamos a parte de criação projeto, podemos da inicio a codificação de nossas classes .

Criando a Constantes.java

Está classe é bem simples, ela irá somente conter valores constantes, que não serão modificadas. Isso para evitar ter muitas hardCode espalhado por todo o código, assim esse classe irá centralizar tudo de maneira organizada.

Crie uma classe chamada Constantes no package br.com.danieldias.commons, com o seguinte conteúdo :

package br.com.danieldias.commons;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Constantes {

	/*Nome o Banco e da Collection*/
	public static final String BANCO_NOME = "danieldiasjava";
	public static final String COLLECTION_NOME = "pessoas";

	/*Nomes das Colunas para o MongoDB*/
	public static final String NOME = "nome";
	public static final String IDADE = "idade";
	public static final String PROFISSAO = "profissao";
	public static final String ENDERECO = "endereco";
	public static final String CIDADE = "cidade";
	public static final String BAIRRO = "bairro";
	public static final String ESTADO = "estado";
	public static final String NASCIMENTO = "nascimento";
	public static final String JUGS = "jugs";
}

Criando as Entidades

Crie as classes Pessoa.java e Endereco.java no package br.com.danieldias.model , com o seguinte conteúdo :

package br.com.danieldias.model;

import java.util.Calendar;

import org.springframework.format.annotation.DateTimeFormat;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Pessoa {

	private String nome;
	private String profissao;
	private String jugs;
	private int idade;
	private Endereco endereco;

	@DateTimeFormat(pattern="dd/MM/yyyy")
	private Calendar dataNascimento;

	public Pessoa() {
		this("","","",0,null,null);
	}

	public Pessoa(String nome, String profissao,
		      String jugs, int idade,
		      Endereco endereco,Calendar dataNascimento) {
		this.nome = nome;
		this.profissao = profissao;
		this.jugs = jugs;
		this.idade = idade;
		this.endereco = endereco;
		this.dataNascimento = dataNascimento;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getProfissao() {
		return profissao;
	}

	public void setProfissao(String profissao) {
		this.profissao = profissao;
	}

	public String getJugs() {
		return jugs;
	}

	public void setJugs(String jugs) {
		this.jugs = jugs;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Calendar getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
}

A classe pessoa bem simples, apenas com uma anotação na dataNascimento para o Spring lidar com esse tipo.

package br.com.danieldias.model;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public class Endereco {

	private String cidade;
	private String bairro;
	private String estado;

	public Endereco() {
		this("","","");
	}

	public Endereco(String cidade, String bairro, String estado) {
		this.setCidade(cidade);
		this.setBairro(bairro);
		this.setEstado(estado);
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}
}

Criando o Repositorio

Agora criaremos uma Inteface chamada MongoDAO e uma classe chamada PessoaDAO no package br.com.danieldias.persistencia, com os seguintes conteúdos:

package br.com.danieldias.persistencia;

import org.bson.Document;

import com.mongodb.client.MongoCursor;

import br.com.danieldias.model.Pessoa;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
public interface MongoDAO {

	void inserir(Pessoa pessoa);
	void atualizar(Pessoa pessoa);
	void excluir(Object _id);
	Document porId(Object _id);
	MongoCursor<Document>mostraTodos();
}

A classe PessoaDAO é onde fica todas as operações de CRUD para o MongoDB, nada muito fora do comum, tudo muito simples e fácil compreensão. Repare que estamos usando a classe Constantes aqui  no lugar de String para facilitar o entendimento e deixar o código mas limpo.

package br.com.danieldias.persistencia;

import static com.mongodb.client.model.Filters.eq;
import java.util.ArrayList;
import java.util.List;

import org.bson.Document;
import org.springframework.stereotype.Repository;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

import br.com.danieldias.commons.Constantes;
import br.com.danieldias.model.Pessoa;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
@Repository
public class PessoaDAO implements MongoDAO {

	MongoClient conexao;
	MongoDatabase dataBase;
	MongoCollection<Document> collectionPessoas;

	public PessoaDAO() {
		conexao = new MongoClient();
		dataBase = conexao.getDatabase(Constantes.BANCO_NOME);
		collectionPessoas = dataBase.getCollection(Constantes.COLLECTION_NOME);
	}

	@Override
	public void inserir(Pessoa pessoa) {

		List<Document> jugs = new ArrayList<>();
		jugs.add(new Document(Constantes.NOME,pessoa.getJugs()));

		collectionPessoas.insertOne(
				new Document(Constantes.NOME,pessoa.getNome())
				.append(Constantes.IDADE, pessoa.getIdade())
				.append(Constantes.PROFISSAO, pessoa.getProfissao())
				.append(Constantes.ENDERECO,
						new Document(Constantes.CIDADE,pessoa.getEndereco().getCidade())
						.append(Constantes.BAIRRO, pessoa.getEndereco().getBairro())
						.append(Constantes.ESTADO, pessoa.getEndereco().getEstado())
						)
				.append(Constantes.NASCIMENTO, pessoa.getDataNascimento().getTime())
				.append(Constantes.JUGS,jugs)
				);
	}

	@Override
	public void atualizar(Pessoa pessoa) {

		collectionPessoas.updateOne(eq(Constantes.NOME,pessoa.getNome()),
				new Document("$set",
						new Document(Constantes.IDADE,pessoa.getIdade())
						.append(Constantes.PROFISSAO, pessoa.getProfissao())
						.append(Constantes.ENDERECO,
								new Document(Constantes.CIDADE,pessoa.getEndereco().getCidade())
								.append(Constantes.BAIRRO, pessoa.getEndereco().getBairro())
								.append(Constantes.ESTADO, pessoa.getEndereco().getEstado())
								)
						)
				);
	}

	@Override
	public void excluir(Object _id) {

		collectionPessoas.deleteOne(porId(_id));
	}

	@Override
	public Document porId(Object _id) {

		return collectionPessoas.find(eq("_id",_id)).first();
	}

	@Override
	public MongoCursor<Document> mostraTodos() {

		return collectionPessoas.find().iterator();
	}
}

Criando os Controles

O primeiro controle que iremos criar ,será o que chama a pagina principal listando todos os dados do banco quando iniciar a aplicação.

Crie uma nova classe chamada IndexController no package br.com.danieldias.controller, com o seguinte conteúdo :

package br.com.danieldias.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
@Controller
@RequestMapping("*")
public class IndexController {

	@RequestMapping("*")
	public String index() {
		return "redirect:/pessoas/listaPessoa";
	}
}

Ainda no mesmo package cria a classe PessoasControler com o seguinte conteúdo :

package br.com.danieldias.controller;

import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.danieldias.model.Pessoa;
import br.com.danieldias.persistencia.MongoDAO;

/**
 * @author daniel
 * github:Daniel-Dos
 * daniel.dias.analistati@gmail.com
 * twitter:@danieldiasjava
 */
@Controller
@RequestMapping("/pessoas")
public class PessoasControler {

	@Autowired
	MongoDAO dao;

	@GetMapping("/inserirPessoa.html")
	public ModelAndView cadastrar() {
		return new ModelAndView("inserirPessoa");
	}

	@GetMapping("/alterarPessoa.html/{_id}")
	public ModelAndView alterar(@PathVariable("_id") ObjectId _id) {
		return new ModelAndView("alterarPessoa","atualizar",dao.porId(_id));
	}

	@PostMapping("inserirPessoa")
	public String adicionar(Pessoa pessoa) {
		dao.inserir(pessoa);
		return "redirect:/pessoas/listaPessoa";
	}

	@GetMapping("listaPessoa")
	public String listar(Model model) {
		model.addAttribute("listas", dao.mostraTodos());
		return "lista";
	}

	@PostMapping("alterar")
	public String update(Pessoa pessoa) {
		dao.atualizar(pessoa);
		return "redirect:/pessoas/listaPessoa";
	}

	@GetMapping("remover/{_id}")
	public String deletar(@PathVariable("_id") ObjectId _id) {
		dao.excluir(_id);
		return "redirect:/pessoas/listaPessoa";
	}
}

Está classe também tem um conteúdo bem simples, a única diferença são as novas anotações para Mapping que a partir do Spring 4.3.0 , podemos está utilizando essas anotações : @GetMapping, @PostMapping, que são a mesma coisa quando fazemos desta maneira : @RequestMapping(value = “alterar”, method = “RequestMethod.POST”)

Criando as Views

Agora daremos inicio a criação de 3 páginas para nossa aplicação que são : alterarPessoa.jsp, inserirPessoa.jsp e lista.jsp, que devem ser criada na pasta views que fica dentro de WEB-INF .

Iniciaremos pela a página lista.jsp, onde a mesma terá uma tabela onde os dados serão apresentados, 3 links um para chamar a paǵina alterarPessoa.jsp passando um parâmetro que é seu id e um que irá chamar no controle o deletar com parâmetro id e um para estarmos adicionando os dados no formulario inserirPessoa.jsp

A página fica da seguinte forma :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista de Pessoas</title>
</head>
<body>
		<h1 align="center">Listagem dos Dados</h1>
<a href="inserirPessoa.html">Adicionar</a>
		<table align="center" border="4">
		<tr bgcolor="gray">
		    <th>ID</th>
			<th>Nome</th>
			<th>Idade</th>
			<th>Profissão</th>
			<th>Cidade</th>
			<th>Bairro</th>
			<th>Estado</th>
			<th>Jugs</th>
			<th>Data</th>
			<th>Editar</th>
			<th>Deletar</th>
		</tr>
		<c:forEach items="${listas}" var="pessoas">
			<tr>
				<td>${pessoas._id}</td>
				<td>${pessoas.nome}</td>
				<td>${pessoas.idade}</td>
				<td>${pessoas.profissao}</td>
				<td>${pessoas.endereco.cidade}</td>
				<td>${pessoas.endereco.bairro}</td>
				<td>${pessoas.endereco.estado}</td>
				<td>${pessoas.jugs.get(0).nome}</td>
				<td>
				<fmt:formatDate value="${pessoas.nascimento}" pattern="dd/MM/yyyy"/>
				</td>
				<td><a href="alterarPessoa.html/${pessoas._id }">Alterar</a></td>
				<td><a href="remover/${pessoas._id}">Excluir</a></td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

Algo importante nesta tela. Aqui os atributos passado devem SER o mesmo que estão no mongoDB, ou seja as colunas tem que ter os mesmo nome. A mesma coisa nesse techo : ${pessoas.jugs.get(0).nome}, aqui estou retornado o primeiro posição no array, se quisermos chamar outra posição fazemos assim : ${pessoas.jugs.get(1).lideres}.

A proxima tela é um formulario bem simples com o seguinte conteudo :

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Inserir Pessoas</title>
	<link rel="stylesheet" href="../recursos/css/jquery-ui-1.9.2.custom.min.css">
<script src="../recursos/js/jquery-3.1.0.min.js"></script>
<script src="../recursos/js/jquery-ui-1.9.2.custom.min.js"></script>
<script src="../recursos/js/datepicker-pt-BR.js"></script>
<script type="text/javascript">
		$(function(){
		  $("#date").datepicker({
		      showOn:"button",
			  buttonImage:"../recursos/imagem/calendar.gif",
			  buttonImageOnly:true
		   });
		});
		</script>

</head>
<body>
<form  action="inserirPessoa" method="post">
<fieldset>
<legend>Dados</legend>

   Nome: <input type="text" name="nome" />

   Idade: <input type="number" name="idade"/>

   Profissão: <input type="text" name="profissao"/>

   Cidade: <input type="text" name="endereco.cidade"/>

   Bairro: <input type="text" name="endereco.bairro"/>

   Estado: <input type="text" name="endereco.estado"/>

   Data de Nascimento: <input id="date" type="text" name="dataNascimento" placeholder="dd/mm/yyyy"/>

   JUGS:
   <input type="checkbox" name="jugs" value="SouJava"/>SouJava
   <input type="checkbox" name="jugs" value="RioJug"/>RioJug
   <input type="checkbox" name="jugs" value="SouJava Campinas"/>SouJava Campinas

   <input type="submit" value="Cadastrar Dados."/></fieldset>
</form>

</body>
</html>

e última tela que contem um formulário já preenchido com os valores do banco que podem ser alterados :

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Alterar Pessoas</title>
</head>
<body>
<form  action="../alterar" method="post">
<fieldset>
<legend>Alteração de Dados</legend>

	Nome: <input type="text" name="nome" value="${atualizar.nome}" disabled="disabled"/>

    Idade: <input type="number" name="idade" value="${atualizar.idade}"/>

    Profissão: <input type="text" name="profissao" value="${atualizar.profissao}"/>

    Cidade: <input type="text" name="endereco.cidade" value="${atualizar.endereco.cidade}"/>

    Bairro: <input type="text" name="endereco.bairro" value="${atualizar.endereco.bairro}"/>

    Estado: <input type="text" name="endereco.estado" value="${atualizar.endereco.estado}"/>

              <input type="submit" value="Alterar Dados."/></fieldset>
</form>

</body>
</html>

Rodando a Aplicação

Com tudo pronto, podemos testar a nossa aplicação:

Primeiramente inicie o MongoDB  através do prompt/terminal com o seguinte comando : mongod, como na imagem

mongod

Depois rode a aplicação no tomcat , com o botão direito do mouse clique no seu projeto e vá em Run As -> Run on Server, ao inicia a aplicação a página principal será carregada com abaixo :

lista

Ao clicar em Adicionar irá para a tela de cadastro :

cadatrar

Ao clicar em adicionar, a pagina irá redirecionar para a tela principal novamente com os dados carregados :

retorno

Ao clicar no link Alterar, vai carregar a pagina de alteração de dados e se clicar em Excluir vai apagar o dado e vai voltar para a pagina principal :

alterar

RoboMongo

Com os nossos dados Gravados, podemos ver como fica a sua estrutura no banco, ao invés de utilizar o mongo Shell para visualizar os dados , irei usar uma ferramente de administraçao para está lidando com varias operações referente ao MongoDB, essa ferramente se chama RoboMongo , instalação facil basta descompactar e executar .

Ao executar o RoboMongo irá aparecer a seguinte tela :

robomongo

clique em Create , de um nome para a conexao e clique em OK :

teste

depois de salvo, clique em Connect, que irar leva-lo a seguinte pagina,basta clicar na collection pessoas e ira carregar os dados armazenados :

mostar

Bem isso é tudo, aqui aprendemos a como fazer uma aplicação Spring MVC com MongoDB e de quebra conhecemos uma nova ferramenta para o mesmo. O projeto pode ser baixado no meu GitHub.

REFERÊNCIAS

 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/

PERSISTINDO DADOS COM HIBERNATE OGM

A última parte prática da  minha monografia de especialização em Desenvolvimento Java. Neste capitulo irá aprender a usar o Framework de Persistência Hibernate OGM para bancos NoSQL .

Boa Leitura.

Assim como existe o Hibernate ORM (object-relational mapping), que é utilizado para mapeamentos entre os bancos relacionais, existe também o Hibernate OGM (Object/Grid Mapper) para estar trabalhando com bancos NoSQL.

Segundo Leonard (2013), o Hibernate OGM utiliza módulos do Hibernate ORM tanto quanto possível, a arquitetura OGM essencialmente estende a arquitetura ORM, ligando diferentes componentes dentro e fora. De acordo com ele, o Hibernate ORM converte e persiste dado entre os bancos relacionais e as linguagens de programação orientada a objetos, utilizando um conjunto de interfaces e classes. Este inclui uma camada JDBC para esta ligando as bases de dados e envio de consultas e as interfaces persistentes e carregadores, que são responsáveis pela persistência e entidades de carga e coleções.

Leonard (2013) explica que o Hibernate OGM é destinado a realizar os mesmos objetivos que o ORM, porem usando NoSQL. A diferença entre eles, é que no ORM precisamos da camada JDBC, mas no OGM essa camada não é necessária, em vez disso ela oferece dois novos elementos que são: um provedor de armazenamento de dados e um dialeto de armazenamento de dados.

Marchioni (2015) explica que uma aplicação ira interagir com a JPA ou com a API nativa do Hibernate. Uma vez que ela utiliza os recursos do ORM como explicado anteriormente, onde estão contidos no núcleo do Hibernate. Por sua vez, são delegados do núcleo hibernate a execução de consultas e operações CRUD para o Hibernate OGM.

De acordo Marchioni (2015) o mecanismo de consulta ira conduzir a execução de instruções JP-QL para o armazenamento subjacente. Outras operações de CRUD vai ser executada para ser diretamente armazenada, com a mediação do provedor de armazenamento de dados, que seria o uso do controlador MongoDB para o nosso caso.

A figura 65 descreve a arquitetura do Hibernate OGM, mostrando sua relação com o Hibernate ORM, como foi explicado por Marchioni.

ogm
Figura 65 – Arquitetura Hibernate OGM Fonte: MARCHIONI, 2015. p. 118

CRIANDO UM PROJETO JAVA WEB UTILIZANDO HIBERNATE OGM

Iremos reaproveitar o projeto web criado na sessão anterior, para esta atualizando o mesmo para esta funcionando com o Hibernate OGM.

Primeiramente vamos adicionar a dependência do Hibernate OGM no arquivo pom.xml do projeto anterior. O arquivo deve contém os seguintes trechos:

      <depencendyManagement>
            <dependencies>
                  <dependency>
                         <groupId>org.hibernate.ogm</groupId>
                         <artifactId>hibernate-ogm-bom</artifactId>
                         <version>5.0.0.Final</version>
                         <type>pom</type>
                         <scope>import</scope>
                    </dependency>
              </dependencies>
      </dependencyManagement>

     <dependencies>
           <dependency>
                <groupId>org.hibernate.ogm</groupId>
                <artifactId>hibernate-ogm-mongodb</artifactId>
           </dependency>
    </dependencies>

Figura 66 – Dependência Hibernate OGM Fonte: Autoria Própria

A Figura 66, adicionamos duas dependências para o projeto. A primeira ira ser feita o download de toda a biblioteca para o Hibernate OGM. O segundo irá fazer o download do mongo drive.

MAPEANDO AS COLEÇÕES DE BANCO DE DADOS

Vamos agora adicionar classes Java, para fazer o mapeamento. Aqui utilizaremos a mesma classe da figura 56, mas com elementos para funcionar com framework. A figura 67, adicionamos anotações na classe para que seja reconhecida no hibernate OGM.

Assim como no Hibernate ORM, estas anotações têm o mesmo efeito no Hibernate OGM, onde:

  • @Entity: Uma classe anotada com ela se torna uma classe entidade, ou seja,
    se torna um documento e os seus atributos se tornam os campos do
    documento.
  • @Id: Diz que o atributo é chave primaria da tabela.
@Entity
public class Pessoa {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String id;

     private String nome;
     private int idade;
     private String email;
     private String telefone;

     public Pessoa(String id,String nome, int idade, String email, String telefone) {
          this.id = id;
          this.nome = nome;
          this.idade = idade;
          this.email = email;
          this.telefone = telefone;
       }

     public Pessoa() {
       this.("","",0,"","");
   }

    // Getter e Setter foram emitido para abreviar.
 

Figura 67 – Classe entidade Fonte: Autoria Própria

CONFIGURANDO O PERSISTENCE.XML

Para podemos está acessando banco de dados, teremos que configura um arquivo de configuração do JPA chamado persistence.xml a sua configuração é bem semelhante quando se uso o Hibernate ORM.

Esse arquivo deve ser criado na seguinte pasta do projeto src/main/resources/META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

	<persistence-unit name="TCC" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
		<class>br.com.danieldias.tcc.modelo.Pessoa</class>

		<properties>
			<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
			<property name="hibernate.ogm.datastore.database" value="TCC" />
			<property name="hibernate.ogm.datastore.host" value="127.0.0.1" />
			<property name="hibernate.ogm.datastore.provider" value="MONGODB" />
			<property name="hibernate.ogm.datastore.port" value="27017" />
			<property name="hibernate.ogm.datastore.create_database" value="true" />
		</properties>
	</persistence-unit>
</persistence>

Figura 68 – persistence.xml Fonte: Autoria Própria

INSERINDO COM HIBERNATE OGM

Modificaremos a classe InserirControle, para esta utilizando o JPA para persistir. O código sofrera poucas mudanças, pois iremos apenas mudar a parte de conexão.

Na Figura 69, trocamos a conexão que foi feita na Figura 57. Como podemos notar, o código diminuiu bastante se comparado com a outra.

@WebServlet("/InserirControler")
public class InserirControle extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // criando uma instancia de Pessoa
        Pessoa pessoa = new Pessoa();

        //Recuperando dados do JSP
        pessoa.setNome(request.getParameter("nome"));
        pessoa.setIdade(Integer.parseInt(request.getParameter("idade")));
        pessoa.setTelefone(request.getParameter("telefone"));
        pessoa.setEmail(request.getParameter("email"));

        // Criando o EntityManager
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TCC");
        EntityManager em = emf.createEntityManager();

        // Criando a transação
        em.getTransaction.begin();

       // Persistindo Dados
       em.persist(pessoa);

      // Enviando o commit para o banco
      em.getTransaction.commit();
      em.close(); // Fechando a conexão
    }
}

Figura 69 – InserirControle Fonte: Autoria Própria.

LISTANDO COM HIBERNATE OGM

Modificaremos a classe ConsultarTodosControler, para trazer os dados a partir do JPA. A figura 70, demonstra como podemos trazer todos os dados da nossa coleção utilizando o JP-QL.

@WebServlet("/ConsultarTodosControler")
public class ConsultarTodosControler extends HttpServlet {
      private static final long serialVersionUID = 1L;

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispacher visao = null;

        // Criando o EntityManager
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TCC");
        EntityManager em = emf.createEntityManager();

       // Criando a transação
       em.getTransaction().begin();

      // Criando uma lista de pessoa / JP-QL
      List<Pessoa> pessoas = em.createQuery("FROM Pessoa",Pessoa.class).getResultList();
      em.getTransaction().commit();
      em.close();

     // Configurando um atributo para JSP listar os dados
     request.setAttribute("listas",pessoas);

    // Retorna para a pagina listar.jsp
    visao = request.getRequestDispacher("listar.jsp");
    visao.forward(request,response);
  }
}

Figura 70 – ConsultarTodosControle Fonte: Autoria Própria.

ATUALIZANDO COM HIBERNATE OGM

A classe AlterarControler, irá atualizar 3 campos da collection a partir de uma consulta pelo nome passando o parâmetro utilizando JP-QL, como demonstrada na figura 71.

@WebServlet("/AlterarControler")
public class AlterarControler extends HttpServlet {
     private static final long serialVersionUID = 1L;

     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      Pessoa pessoa = new Pessoa();

     // Recuperando dados do JSP
     pessoa.setNome(request.getParameter("nome"));
     pessoa.setIdade(Integer.parseInt(request.getParameter("idade")));
     pessoa.setTelefone(request.getParameter("telefone"));
     pessoa.setEmail(request.getParameter("email"));

      // Criando a EntityManager
      EntityManagerFactory emf = Persistence.createEntityManagerFactroy("TCC");
      EntityManager em = emf.createEntityManager();

     // Criando a transação
     em.getTransaction().begin();

     //Criando uma consulta
     Query query = em.createQuery("FROM Pessoa where nome=:nome",Pessoa.class);
     query.setParameter("nome",pessoa.getNome());

     Pessoa id (Pessoa) query.getSingleResult();
     pessoa.setId(id.getId());
     pessoa.setNome(id.getNome());

     em.merge(pessoa);
     em.getTransaction().commit();
     em.close();
    }
}

Figura 71 – AlterarControle Fonte: Autoria Própria.

Após a fazer a consulta, irá trazer um único registro que coincide com o argumento passado. Logo após os métodos setId e setNome, recebe o valor da variável id, para que a mesma são sejam alteradas e que não criem um novo registro no banco.

DELETANDO COM HIBERNATE OGM

Por último, será modificada a classe DeletarControler. Onde utilizamos consulta nativa do MongoDB para estarmos deletando os dados. Onde foi criada uma variável String contendo a operação nativa do MongoDB, que no caso iremos deletar todos os documentos que contém o nome especificado ao passarmos o parâmetro no formato Json do MongoDB, conforme demonstrado na figura 72 .

@WebServlet("/DeletarControle")
public class DeletarControler extends HttpServlet {
     private static final long serialVersionUID = 1L;

     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      Pessoa pessoa = new Pessoa();

     // Recuperando dados do JSP
     pessoa.setNome(request.getParameter("nome"));

      // Criando a EntityManager
      EntityManagerFactory emf = Persistence.createEntityManagerFactroy("TCC");
      EntityManager em = emf.createEntityManager();

     // Criando a transação
     em.getTransaction().begin();

    // Criando uma consulta nativa
    String query1 = "db.Pessoa.remove({'nome': '" + pessoa.getNome() + "'})";

    Query query = (Query) em.createNativeQuery(query1, Pessoa.class);
    query.executeUpdate();

    em.getTransaction().commit();
    em.close();
    }
}

Figura 72 – DeletarControle Fonte: Autoria Própria.

Contudo, finalizamos este capitulo demonstrando como podemos está construindo sistemas em Java sendo desktop ou web, utilizando MongoDB para armazenamento.

Visto que a implementação para fazer operações no banco via Driver Java é bem simples, já que os métodos contidos no driver são praticamente o mesmo apresentado no Mongo Shell, o que facilita muito no desenvolvimento.

Foi apresentado o Hibernate OGM, um framework para manipulação dos dados no MongoDB, que utilizar módulos do Hibernate ORM.

O framework facilitou ainda mais interação com o MongoDB utilizando JPA ou a API nativa do Hibernate e ainda permite a utilização de operações nativa do MongoDB, que é uma boa escolha se caso sentirmos limitado ao utilizar o Hibernate OGM.

REFERÊNCIAS

Leonard, Anghel. Pro Hibernate and MongoDB. Apress,2013.

Marchioni, Francesco. MongoDB for Java Developers. Birmingham: Packt Publishing Ltd,2015.