Posts da Tag: Java - Blog da TreinaWeb

Java

Thymeleaf – Estruturas de condição e repetição

Vimos no último artigo dessa série como enviar e exibir variáveis Java em templates com o Thymeleaf. Continuando a série, agora veremos como utilizar estruturas de condição e repetição no Thymeleaf.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

Estruturas de condição

Para utilizar estruturas de condição no Thymeleaf é bem simples. Imagine que temos, em uma variável, a representação de um usuário com seu ID, nome e tipo do usuário (cliente ou funcionário) e queremos exibir em um template a frase “Bem-vindo cliente” ou “Bem-vindo funcionário” a depender do seu tipo.

Este é um exemplo claro do uso de estruturas condicionais no Thymeleaf:

package br.com.treinaweb.estruturasrepeticaocondicaothymeleaf.controllers;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(ModelMap model) {
        Map<String, String> usuario = new HashMap<>();
        usuario.put("id", "1");
        usuario.put("nome", "João da Silva");
        usuario.put("tipo", "funcionario");

        model.addAttribute("usuario", usuario);

        return "home";
    }
}

Ao enviar a variável usuario para o template home.html, agora só é preciso verificar o valor na chave tipo:

<!DOCTYPE html>
<html lang="pt-br">
<head>
  <title>Thymeleaf - Estruturas de Condição</title>
</head>
<body>
  <h1 th:if="${usuario.tipo == 'cliente'}">Bem-vindo cliente</h1>
  <h1 th:if="${usuario.tipo == 'funcionario'}">Bem-vindo funcionário</h1>
</body>
</html>

Agora, ao acessar o template home.html no navegador, teremos o seguinte resultado:

Página com o resultado da estrutura de condição do Thymeleaf

A sintaxe das estruturas de condição no Thymeleaf é bem simples, basta colocar o atributo th:if na tag em que deseja condicionar a exibição.

Estrutura de repetição

O uso de estruturas de repetição também é algo muito simples no Thymeleaf. Imagine que temos uma lista de nomes de usuários e queremos percorrê-la para exibir em nossa página.

Para isso, basta utilizar um forEach e percorrer toda a lista exibindo os nomes como podemos ver abaixo:

package br.com.treinaweb.estruturasrepeticaocondicaothymeleaf.controllers;

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

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(ModelMap model) {
        List<String> usuarios = new ArrayList<>();
        usuarios.add("Isabela Rosa Eliane Carvalho");
        usuarios.add("Luna Stella Freitas");
        usuarios.add("Edson Luís Gael Caldeira");
        usuarios.add("Aline Mariana Nicole Lima");
        usuarios.add("Kauê Kaique Brito");

        model.addAttribute("usuarios", usuarios);

        return "home";
    }
}

Agora, para exibir o conteúdo da variável usuarios no template, utilizamos a seguinte sintaxe:

<!DOCTYPE html>
<html lang="pt-br">
<head>
  <title>Thymeleaf - Estruturas de Condição</title>
</head>
<body>
  <h1 th:each="usuario : ${usuarios}" th:text="${usuario}"></h1>
</body>
</html>

Agora, ao acessar o template home.html no navegador, teremos o seguinte resultado:

Página com o resultado da estrutura de repetição do Thymeleaf

As estruturas de repetição facilitam (e muito) quando precisamos exibir diversos dados e não queremos duplicidade de código, já que uma lista será percorrida e, para cada elemento, será impresso seu valor.

Spring Framework - Fundamentos
Curso de Spring Framework - Fundamentos
CONHEÇA O CURSO

Conclusão

Como vimos neste artigo, o uso de estruturas de condição e repetição no Thymeleaf é bem simples e facilita (e muito) a criação dos templates em uma aplicação Spring Boot. No próximo artigo dessa série, veremos como utilizar o Thymeleaf Fragments, um ótimo recurso para reaproveitamento de código em nossos templates.


Java

Thymeleaf, veja como enviar e exibir dados em seus templates

No último artigo vimos o que é e quais as funcionalidades da template engine Thymeleaf. Vimos que ela facilita o nosso trabalho quando precisamos criar templates para aplicações Java.

Dando continuidade à nossa série de artigos sobre o Thymeleaf, agora veremos como enviar e exibir dados com o Thymeleaf em aplicações Spring Boot.

Aplicação base

Primeiramente vamos criar uma nova aplicação Spring Boot com a ajuda do Spring initializr, para isso acesse o site do Spring Initializr e preencha as metainformações.

Página do Spring Initializr com os meta dados da aplicação

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.4.3
  • Group: br.com.treinaweb
  • Artifact: spring-thymelead-exemplo
  • Name: spring-thymelead-exemplo
  • Description: Exemplo Thymeleaf com Spring Boot
  • Package name: br.com.treinaweb.springthymeleafexemplo
  • Packaging: Jar
  • Java: 11

Agora que já definimos as metainformações do projeto, devemos informar quais as dependências que serão utilizadas no mesmo, iremos utilizar as dependências Spring Web e Thymeleaf.

Página com as dependências do projeto

Agora, com todas as informações preenchidas basta então clicar no botão “GENERATE” para que seja feito o download do projeto base, descompactar o arquivo baixado e então importa-lo para a IDE ou Editor de Código Fonte de sua preferência.

Enviando dados

Para que possamos enviar dados de uma aplicação Spring Boot para o Thymeleaf, antes é necessário criarmos um controller que será executado quando uma determinada rota for chamada pelo navegador, dessa maneira esse controller será responsável por enviar esses dados e definir qual o template do Thymeleaf deve ser exibido para o usuário.

Para criarmos o nosso controller, criaremos uma pasta que conterá os nossos arquivos Java da camada de controle. Dito isso crie uma pasta chamada controller dentro da pasta src/main/java/br/com/treinaweb/springthymeleafexample e por fim dentro da pasta recém criada crie um arquivo Java chamado HomeController.java com o seguinte código:

package br.com.treinaweb.springthymeleafexemplo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(ModelMap model) {
        model.addAttribute("nomeDoAtributo", "Treinaweb");

        return "home";
    }
}

Com o código acima nós estamos criando uma classe que faz parte da camada de controle com uma action que responde na rota / através do método HTTP GET.

Dentro da action home estamos adicionando um atributo que será recebido pelo template do Thymeleaf e por fim retornando o nome do template que queremos exibir quando tal rota for acessada pelo usuário.

Exibindo dados

Agora precisamos do nosso template a ser exibido, em aplicações Spring Boot os arquivos de template ficam contidos na pasta src/main/resources/templates, então dentro desta pasta criaremos um arquivo HTML chamado home.html com o seguinte código:

<!DOCTYPE html>
<html lang="pt-br">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Exemplo Spring Boot com Thymeleaf</title>
</head>
<body>
  <h1>Olá <span th:text="${nomeDoAtributo}"></span></h1>
</body>
</html>

Para exibirmos algum valor vindo do código Java que está executando o template, devemos utilizar uma propriedade especial do Thymeleaf chamada th:text e então como valor de tal propriedade colocar o nome do atributo que queremos exibir entre ${}.

Resultado

Para vermos o resultado, primeiro é necessário executar a aplicação, sendo assim, utilizaremos o comando mvn spring-boot:run e então acessamos a rota / de nossa aplicação que está sendo executada em http://localhost:8080.

Página que será exibida quando o projeto for executado

Conclusão

Em suma, neste artigo vimos como enviar e exibir dados com o Thymeleaf, recurso que facilita (e muito) o desenvolvimento dos nossos templates. No próximo artigo dessa série, veremos como utilizar estruturas de repetição e condição.


Java

O que é o Thymeleaf?

O Thymeleaf é uma template engine para projetos Java que facilita a criação de páginas HTML. Sendo assim, ele serve para gerar páginas HTML no lado servidor de forma dinâmica, permitindo a troca de informações entre o código Java e as página HTML, de tal maneira ele garante que o desenvolvedor consiga criar templates de forma mais fácil para suas aplicações.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

Características do Thymeleaf

Antes de mais nada a principal funcionalidade de um template engine é permitir que linguagens de programação possam ser incorporadas em páginas HTML. de tal forma, uma template engine permite que os programadores possam utilizar estruturas de condição, estruturas de repetição, herança e diversos outros recursos presentes apenas nas linguagens de programação em páginas HTML.

Analogamente o Thymeleaf não é diferente, ele permite que desenvolvedores incorporem código Java em páginas HTML e também utilizem as principais características da linguagem em seus templates.

Dentre diversas características, podemos citar as principais:

  • Permite o uso de estruturas de condição e repetição em páginas HTML;
  • Com o Thymeleaf é possível utilizar herança de layouts, garantindo uma estrutura com um maior reaproveitamento de código;
  • Permite exibir o conteúdo de variáveis Java em páginas HTML;
  • Sistema de fragmentos de templates, dentre outros.

Como o Thymeleaf funciona?

Basicamente, quando criamos um template com Thymeleaf e incorporamos código Java nas páginas HTML, a própria ferramenta traduz o código Java e incorpora à página HTML, já que o Browser não consegue exibir código diferente do HTML.

Abaixo temos um exemplo de código escrito com o Thymeleaf:

<ul>
  <li th:each="user : ${users}" >
    <a 
      th:href="/user/{username} (username=${user.username})"
      th:text="${user.firstname} + ' ' + ${user.lastname}"
    ></a>
  </li>
</ul>

Após o processamento do template realizado pelo Thymeleaf será gerado um código HTML como o do exemplo abaixo:

<ul>
  <li>
    <a href="/user/joao_silva">João da Silva</a>
  </li>
  <li>
    <a href="/user/maria_luiza">Maria Luiza</a>
  </li>
  <li>
    <a href="/user/jose_ramos">José Ramos</a>
  </li>
  <li>
    <a href="/user/neuza_cristina">Neuza Cristina</a>
  </li>
  <li>
    <a href="/user/geraldo_santos">Geraldo Santos</a>
  </li>
</ul>

Certamente podemos notar o quão poderosa é essa ferramenta. Com ela podemos utilizar os principais recursos da linguagem de programação para a criação de páginas HTML.

Quem utiliza o Thymeleaf?

O Thymeleaf é muito utilizado em todo ecossistema Java, sendo principalmente utilizado em aplicações Spring Web MVC, um dos frameworks mais famosos do ecossistema Java para desenvolvimento de aplicações Web, além disso o Thymeleaf possui um starter oficial para o Spring Boot.

Java - Criação de aplicações web com Spring Boot
Curso de Java - Criação de aplicações web com Spring Boot
CONHEÇA O CURSO

Conclusão

Por fim, como vimos neste artigo, o Thymeleaf é uma ótima template engine que permite a criação de páginas HTML utilizando os recursos do Java.

Agora que vimos o que é e os principais recursos do Thymeleaf, no próximo artigo exploraremos alguns destes recursos para incrementar o front-end da aplicação.


Guias Java

Guia da linguagem Java

O Java é uma poderosa linguagem de programação em constante crescimento, sendo uma das mais populares entre os desenvolvedores. Com um forte desenvolvimento orientado a objetos, ela favorece o desenvolvimento de sistemas flexíveis e extensíveis.

É uma linguagem gratuita, tendo isso como um dos principais fatores que ajudou a popularizá-la entre os programadores e empresas no geral. O objetivo dessa linguagem é ser simples, orientada a objetos e de fácil aprendizagem.

Aprender Java é importante para qualquer profissional da área de desenvolvimento, pois essa é uma das linguagens que mais oferecem oportunidades no mercado de trabalho.

Você pode encontrar Java em diferentes dispositivos, como no acesso a serviços bancários online e até mesmo em aplicativos da Receita Federal, como por exemplo, o programa de declaração de imposto de renda. Empresas como IBM, a rede social LinkedIn e a Netflix também utilizam Java em seus produtos.

O Java é uma das linguagens mais populares e existem várias oportunidades de emprego. Já temos um artigo aqui que apresenta cinco fortes motivos para que você estude a plataforma de desenvolvimento da Oracle. Recomendamos a leitura!

Principais IDEs para desenvolvimento Java

Uma IDE (Ambiente de Desenvolvimento Integrado) é um software que auxilia no desenvolvimento de aplicações. Para o desenvolvedor, é uma forma de criar aplicações de maneira mais rápida, uma vez que estas IDEs auxiliam em todo o processo de desenvolvimento de uma aplicação.

As IDEs provem diversos benefícios, como a análise de todo o código a ser escrito para identificar bugs causados por um erro de digitação, autocompletam trechos de códigos, e etc.

Algumas das principais utilizadas no desenvolvimento em Java, são o Eclipse, NetBeans, VSCode e IntelliJ. Você pode conferir mais sobre elas no artigo “Principais IDEs para desenvolvimento Java”.

Como instalar o Java e nosso primeiro exemplo

Como o Java é multiplataforma, você pode instalar em qualquer sistema: Windows, Linux e MacOS. Já temos um artigo que aborda todo o passo a passo de instalação, em todos esses sistemas, para que você já deixe sua máquina pronta para começar.

Como qualquer outra linguagem, o Java tem as suas próprias regras de sintaxe e estrutura.

Vamos imprimir o tradicional “Hello World” e você verá como é fácil!

public class TreinaWeb {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

No mesmo artigo onde ensinamos você a instalar o Java em sua máquina, também abordamos com mais profundidade sua sintaxe e estrutura.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

Conhecendo variáveis e constantes

O Java é uma linguagem de tipagem estática, ou seja, existe um sistema de tipos bem definido e que é validado durante o tempo de compilação do código. Para isso, é necessário definir tipos explícitos para as variáveis que são criadas.

Por padrão, o Java possui em sua biblioteca padrão alguns tipos de dados:

• Byte: um inteiro com valor 8 bits, onde seu intervalo de valores vai do -128 até o 127. É um dado leve, que ocupa pouco espaço em memória;
• Char: trata-se de um único caractere unicode de 16 bits. Seu intervalo de valores vai do ‘\u0000’ ou 0 até o valor máximo ‘\uffff’ ou 65535. É utilizado para armazenar caracteres de maneira isolada;
• Short: trata-se de um valor inteiro de 16 bits. Seu intervalo de valores vai do -32.768 até o 32.767;
• Int: trata-se de um valor inteiro de 32 bits. Suporta valores de -2.147.483.648 a 2.147.483.647;
• Long: define um valor inteiro de 64 bits. Suporta valores de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807;
• Boolean: é um dos tipos de dados mais simples, pois ele pode armazenar apenas dois valores: true (verdadeiro) ou false (falso). É empregado para realizar testes lógicos, dentro de estruturas de decisão e repetição, por exemplo.
• Float: trata-se de um tipo de dado de ponto flutuante de 32 bits. Isso quer dizer que ele permite armazenar valores decimais entre 6 e 7 casas. Porém, o armazenamento em memória pode não representar necessariamente o valor repassado. Por exemplo, um float definido com “0,001” pode acabar sendo armazenado como “0,00100001”, e isso não somente no Java, já que isso é decorrência dos pontos flutuantes em geral. Por isso, o tipo float não deve ser usado para operações que precisam passar por várias operações aritméticas, como no caso de sistemas financeiros. Isso porque, a primeira vista, essa imprecisão pode não impactar, mas na sequência de operações realizadas, estas imprecisões podem começar a aparecer nos resultados;
• Double: representa um ponto flutuante de 64 bits. Por isso, ele permite armazenar números de até cerca de 15 casas decimais. A observação para o tipo float também é válida para o tipo double: por ser um tipo de dado que é armazenado por aproximação de valores, ele não deve ser utilizado em operações que demandam precisão absoluta.

Depois de vermos os tipos de dados, podemos criar nossas variáveis. Elas têm algumas regras, como por exemplo, devem ser claras e auto-explicativas.

String nomeDoAluno = “”;
int idade = 0;

Também temos as constantes, que sob um ponto de vista prático são como variáveis, só que com o ponto de que seu valor não pode ser modificado. Isso quer dizer que, se você declara uma constante chamada MAIORIDADE_PENAL com o valor 18, esse valor não poderá ser jamais modificado durante a execução da aplicação.

O Java não possui formalmente o conceito de constantes, assim como acontece em outras linguagens como C# e C++. Embora a palavra-chave “const” seja uma palavra reservada na especificação do Java (ou seja, você não pode nomear nenhuma estrutura como “const”), ela não tem nenhum significado para o compilador.

No artigo sobre variáveis e constantes no Java, podemos nos aprofundar no uso de constantes e ver mais exemplos e explicações sobre o uso de variáveis.

Estruturas condicionais e estruturas de repetição

As estruturas condicionais e de repetição são fundamentais e vem para nos ajudar no reaproveitamento de código.

As estruturas condicionais possibilitam ao programa tomar decisões e alterar o seu fluxo de execução. Isso possibilita ao desenvolvedor o poder de controlar quais são as tarefas e trechos de código executados de acordo com diferentes situações, como os valores de variáveis. Algumas estruturas condicionais no Java são o if…else e o switch/case.

Abaixo temos um exemplo simples da utilização do if…else. Nele verificamos se a pessoa é maior ou menor de idade, dependendo do valor que contiver na variável idade.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        int idade = 10;
        if (idade >= 18) { 
            System.out.println(“Maior de idade!”);
        } else {
            System.out.println(“Menor de idade!”);
        }
    }

}

As estruturas de repetição, também conhecidas como loops (laços), são utilizadas para executar repetidamente uma instrução ou bloco de instrução enquanto determinada condição estiver sendo satisfeita. As principais estruturas de repetição são o for e o while.

Veremos um exemplo abaixo utilizando o for. Aqui teremos uma variável começando em zero, onde, a cada rodada, ela irá somar +1. Isso irá se repetir até que a variável chegue até 10, encerrando assim esse bloco.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            System.out.println(“A variável i agora vale “ + i);
        }
    }
}

Confira a execução desse código acima e outros exemplos com muitos mais detalhes em nosso artigo sobre estruturas de decisão e repetição.

Orientação a objetos

Como vimos na introdução deste artigo, o Java é orientado a objetos. O paradigma orientado a objetos traz boas vantagens, como a reutilização de código, a legibilidade e manutenibilidade do código, a natural modularização e a produção de código mais acessível, já que as estruturas criadas geralmente representam aspectos também existentes no mundo real.

Quando lidamos com o paradigma orientado a objetos, acabamos criando diversas unidades de software através de estruturas chamadas classes. A partir destas classes, podemos criar estruturas chamadas objetos, estruturas estas que interagem entre si. Esse é o motivo pelo qual o paradigma é chamado de orientação a objetos: todas as interações necessárias para que o software funcione ocorrem através de mensagens e comandos trocados entre estes objetos.

Uma classe nada mais é que um “molde” para definição de outras estruturas. Um exemplo seria uma classe chamada Pessoa. Todas as pessoas possuem características em comum, como nome, idade, sexo, etc, por isso elas podem fazer parte de uma mesma classe.

package br.com.treinaweb;

public class Pessoa {

    // Atributos ou Características de uma pessoa
    public String nome;
    public int idade;
    public char sexo;
}

Como o nome diz, na orientação a objetos temos os objetos. Os objetos são estruturas que são criadas a partir das classes. Por exemplo, os objetos criados a partir da classe Pessoa, podem usufruir dos mesmos atributos e métodos definidos pela Classe.

package br.com.treinaweb;

public class Cadastro {

    public static void main(String args[]) {
      Pessoa maria = new Pessoa();
      maria.nome = "Maria";
      maria.idade = 20;
      maria.sexo = ‘F’;
    }
}

Também vimos que ela tem acesso aos métodos, que são comportamentos e ações que os objetos podem ter. Nesse nosso exemplo, poderíamos colocar que toda Pessoa pode falar, andar, comer, etc.

      maria.falar();
      maria.andar();
      maria.comer();

Para ver mais exemplos e conceitos bem mais aprofundados, acesse o artigo “Orientação a objetos em Java”.

Maven: o que é, o que podemos fazer com ele e como encontrar dependências

É um problema comum durante o desenvolvimento de projetos com a linguagem Java termos que baixar arquivos .jar para serem incluídos dentro de nossos projetos e assim podermos utilizar alguma biblioteca que vai nos auxiliar ao longo do desenvolvimento do mesmo.

A boa notícia é que existem diversas ferramentas para nos ajudar a gerenciar as bibliotecas e automatizar certas tarefas dentro de projetos Java. Uma delas é o Maven.

O Maven é uma ferramenta de código aberto mantida pela Apache. Trata-se de uma ferramenta de gestão de dependências e um task runner. Em outras palavras, o Maven automatiza os processos de obtenção de dependências e de compilação de projetos Java. Quando criamos um projeto Maven, este projeto fica atrelado a um arquivo principal: o pom.xml. Neste arquivo POM (Project Object Model), nós descrevemos as dependências de nosso projeto e a maneira como este deve ser compilado.

Para gerenciar as dependências do nosso projeto utilizamos o arquivo pom.xml nele colocamos as informações das bibliotecas que o nosso projeto necessita para funcionar e o Maven se encarrega do download dessas bibliotecas e de adicioná-las no Build Path/Classpath.

O Maven irá buscar por essas dependências em locais chamados de repositórios, existem basicamente dois repositórios, o repositório local que está localizado na pasta .m2/repository e o repositório remoto que está localizado no repositório público do Maven.

Ao adicionar uma nova dependência em nosso projeto, o Maven primeiro realiza a busca em nosso repositório local, caso não encontre irá buscar no repositório remoto e então fazer o download da biblioteca e disponibilizá-la no repositório local, dessa maneira caso você necessite utilizar a mesma biblioteca em outro projeto não será necessário realizar o download novamente.

Quando falamos das dependências do repositório padrão do Maven, elas podem ser buscadas através de interfaces mais amigáveis. Nesse caso, entram em cena as ferramentas de gestão de repositórios. A mais comum é o Nexus Sonatype, que é utilizado inclusive pelo repositório padrão do Maven.

Indicamos a leitura do nosso artigo “Introdução ao Maven, aprenda como criar e gerenciar projetos Java”. Lá você irá aprender mais a fundo como instalar o Maven, como funciona o pom.xml e ainda fazer seu primeiro exemplo. Já no artigo “Como instalar uma dependência com Maven e usar em seu projeto” vemos mais a fundo como funciona o Sonatype.


Java

Como instalar uma dependência com Maven e usar em seu projeto

No último artigo, conhecemos mais sobre o Maven e o que podemos realizar com ele. Agora, é hora de verificarmos como podemos encontrar e instalar dependências a serem utilizadas em nossos projetos.

Apenas relembrando: o Maven é uma ferramenta automatizada de gestão de build, compilação e dependências. Uma das principais estruturas do Maven é o Project Object Model, ou POM. O POM descreve a estrutura do projeto, as dependências do mesmo e a maneira como o mesmo deve passar pelo processo de compilação e build.

Com o Maven, tarefas que poderiam ser repetitivas como as definições de configuração do processo de build e o gerenciamento de versões de dependências a serem utilizadas pelo projeto passam a ser mais automatizadas e simplificadas.

Quando falamos especificamente sobre o aspecto de gestão de dependências do Maven, é importante notar que cada dependência também pode ter suas próprias dependências, dependências estas que são chamadas de dependências transitivas. Até no caso dessas dependências transitivas, o Maven consegue realizar a automação para obtenção destas, pois ele é capaz de resolver essa árvore de dependências e configurar o classpath corretamente.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

Onde encontrar dependências?

Anteriormente, vimos que o Maven busca pelas dependências em repositórios, que são estruturas na internet que hospedam frameworks e bibliotecas que podem ser obtidos pelo Maven. Por padrão, é utilizado o repositório oficial do Maven mas é possível adicionar mais repositórios ao alterarmos as configurações centrais da instalação do Maven (geralmente, estas configurações ficam no arquivo settings.xml, que fica na pasta central do Maven .m2).

Quando falamos das dependências do repositório padrão do Maven, elas podem ser buscadas através de interfaces mais amigáveis. Nesse caso, entram em cena as ferramentas de gestão de repositórios.

A mais comum é o Nexus Sonatype, que é utilizado inclusive pelo repositório padrão do Maven.

Como usar a dependência em um projeto

Vamos imaginar que queremos utilizar o Apache Commons Email em nosso projeto. Essa biblioteca contém uma série de utilitários para facilitar o envio de emails através de aplicações Java.

O primeiro passo é acessar o https://search.maven.org/. Uma interface similar à abaixo deve ser exibida.

Tela inicial Sonatype

No campo de busca, podemos digitar parte do nome ou o nome completo da estrutura que queremos adicionar em nosso projeto. Em nosso exemplo, poderíamos digitar “apache commons email” ou somente “apache email”, por exemplo.

Enquanto você digita, a própria busca já sugere artefatos que correspondem ao nome que você está buscando. Você pode já os selecionar da lista sugerida ou apertar Enter para iniciar a busca.

Campo de busca Sonatype

Se você apertar o Enter, uma lista de artefatos que correspondem ao critério de busca será exibida. Basta clicar na opção desejada.

Pesquisa Sonatype

Caso você tenha selecionado o artefato diretamente da lista de sugestões, você será direcionado à página do artefato em questão. Se você apertou Enter no passo anterior e selecionou o artefato, também será direcionado à página do artefato. Esta página deverá ter a seguinte aparência.

Página de um artefato

Veja que, na página, você verá informações gerais sobre o artefato, como o site oficial, onde pode estar o código-fonte e os principais desenvolvedores com seus respectivos e-mails. Além disso, na lateral direita, você já verá a configuração necessária para importar o artefato para o projeto através do Maven. Inclusive, você verá até mesmo a configuração para outras ferramentas de gestão de dependências, como o Gradle.

Agora, você pode copiar a configuração de dependência do Maven. Você pode selecionar a configuração no canto superior direito ou utilizar o botão para copiar.

Configuração de uma dependência no Maven

Logo após, basta adicionar a configuração ao pom.xml do projeto. Dessa maneira, a dependência já estará configurada e pronta para utilização no projeto.

Em IDEs modernas, geralmente, só pelo fato de adicionar uma nova dependência ao pom.xml já fará com que a IDE automaticamente inicie o processo de reconhecimento da dependência, invocando o download da mesma e configurando a ferramenta de autocomplete para reconhecer as classes disponibilizadas.

Caso isso não aconteça, pode ser necessário “forçar” este processo, procedimento este que pode variar de acordo com cada IDE. Caso você esteja utilizando o Eclipse por exemplo, pode ser necessário clicar com o botão direito em cima do projeto, ir até o menu Maven e logo após selecionar a ação Update Project.

Caso esteja utilizando o IntelliJ, você precisará clicar com o botão direito em cima do projeto, selecionar o menu Maven e em seguida, selecionar a ação Reimport.

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Desenvolvimento Back-end Java

O que é o Spring Boot?

Todo desenvolvedor Java sabe o quão trabalhoso é configurar uma aplicação. Uma vez que é necessário a criação de várias pastas e arquivos XML extensos e o menor dos erros pode impedir o funcionamento correto da aplicação, o que resulta em uma tremenda dor de cabeça até a identificação e correção do problema.

Certamente todo esse trabalho de configuração é por vezes frustrante. Pois o que o desenvolvedor deseja é escrever o código das regras de negócio, acompanhando os resultados na tela sem perda de tempo.

Entretanto, dentro do ecossistema do projeto Spring temos o Spring Boot que facilita todo esse trabalho de configuração.

Neste artigo você entenderá um pouco mais sobre como ele torna o desenvolvimento de aplicações Spring mais prazeroso.

Formação:
CONHEÇA A FORMAÇÃO

O que é o Spring Boot?

O Spring Boot é um framework que torna fácil a criação de aplicações Spring autossuficientes e robustas, possibilitando a execução imediata. Contudo isso só é possível por conta da abordagem opinativa sobre a plataforma Spring e bibliotecas de terceiros, que permite ao desenvolvedor gastar o mínimo de tempo possível configurando o projeto, e sim codificando suas regras de negócio.

Dentre as principais funcionalidades do Spring Boot podemos citar:

  • A criação de aplicações Spring autossuficientes;
  • Servidores web como o Tomcat, Jetty e Undertow embutidos;
  • Prover starter’s opinativos para gerenciamento de dependências e build;
  • Configuração automática de bibliotecas Spring e de terceiros sempre que possível;
  • Funcionalidades para ambiente de produção como métricas, health checks e configurações externalizadas.
  • Dispensar a necessidade de configuração XML e geração de código.
Java - Criação de aplicações web com Spring Boot
Curso de Java - Criação de aplicações web com Spring Boot
CONHEÇA O CURSO

Como o Spring Boot funciona?

A princípio, para que tudo isso funcione, o Spring Boot utiliza o conceito de convenção sobre configuração, ou seja, o Spring Boot já possui uma série de configurações padrões para as bibliotecas Spring ou de terceiros que você deseja utilizar.

Entretanto, isso não impede que você personalize essas configurações. É bastante interessante que só é necessário alterar as configurações que deseja, as demais configurações do projeto seguem inalteradas.

Todo esse processo de autoconfiguração e gerenciamento de dependências providos pelo Spring Boot é feito através dos Starters – uma dependência que inicializa algum módulo dentro do nosso projeto.

Só para exemplificar, imagine o desenvolvimento de uma aplicação web com o Spring Web MVC, seria necessário adicionar no nosso projeto as dependências do Spring Core, Spring Web e Spring Web MVC. Além disso haveria a necessidade de configuração dos arquivos XML para que essas dependências funcionem corretamente. Com o Spring Boot, adicionando-se o spring-boot-starter-web o projeto já estará configurado corretamente para utilizar o Spring Web MVC.

Ainda assim existe outra vantagem sobre o uso dos starters do Spring Boot, é que ao utilizá-los, o nosso arquivo de dependências fica menor e mais organizado.

O Spring Initializr

Além disso, para facilitar ainda mais o desenvolvimento de aplicações com o Spring Boot, o Spring possui uma página chama spring initializr, nesta página você repassa as informações do seu projeto como a versão do Spring Boot, GroupID, ArtifactID e os starters. Assim, o spring initializr gera um projeto base para que você já comece o desenvolvimento das regras de negócio da sua aplicação.

Criando uma aplicação Spring Boot na prática

Para ilustrar o funcionamento do Spring Boot, vamos criar uma aplicação web simples com o auxílio do spring initializr.

Primeiramente, acesse o site do spring initializr e preencha as informações:

  • Project: Selecione a opção Maven
  • Language: Selecione a opção Java
  • Spring Boot: Selecione a opção 2.4.2
  • Group: br.com.treinaweb
  • Artifcat: spring-boot-teste
  • Packaging: Jar
  • Java: 11

Como esse será um projeto web, será necessária a adição dos starters do Spring Web e do Thymeleaf para servir como Template Engine.

Print da página do spring initializr com as informações necessárias para criar o projeto Spring

Então, preenchidas todas as informações, clique no botão “GENERATE” para baixar o arquivo .zip contendo o projeto.

Em seguida descompacte o arquivo .zip e o importe para a IDE ou Editor de Código Fonte que você usa.

Agora crie uma nova pasta chamada controller dentro da pasta src/main/java/br/com/treinaweb/springboottest.

Logo após a criação da pasta, crie um novo arquivo Java chamado HomeController.java com o seguinte código.

package br.com.treinaweb.springbootteste.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class HomeController {

    @GetMapping("/saudacao/{nome}")
    public String saudacao(@PathVariable String nome, ModelMap model) {
        model.addAttribute("nome", nome);

        return "saudacao";
    }

}

Agora que já temos a nossa Action e nosso Controller criados, o que precisamos fazer é criar a página HTML que será exibida para o cliente.

Dentro da pasta resources/templates crie um arquivo HTML chamado saudacao.html com o seguinte código.

<!DOCTYPE html>
<html lang="pt-br" xmlns:th="<http://www.thymeleaf.org>">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Spring Boot - Index</title>
</head>
<body>
  <h1 th:text="'Olá, ' + ${nome}"></h1>
</body>
</html>
Java - Criação de aplicações web com Spring MVC
Curso de Java - Criação de aplicações web com Spring MVC
CONHEÇA O CURSO

Executando nossa aplicação Spring Boot

Por fim, agora que já temos a nossa aplicação criada, temos que executá-la para vermos o resultado no navegador.

A fim de executar a aplicação, abra o seu terminal e use o comando abaixo:

mvn spring-boot:run

Esse comando executa a aplicação que estará acessível a partir do localhost na porta 8080, acesse a url: http://localhost:8080/saudacao/TreinaWeb e uma página com o texto “Olá, TreinaWeb” aparecerá na tela.

Conclusão

Nesse artigo você viu como o Spring Boot nos ajuda durante o desenvolvimento de aplicações Spring, a criação de um projeto Spring Boot usando o Spring Initializr e o desenvolvimento de uma simples página usando o Spring Web MVC.

Embora esta seja uma aplicação bastante simples, perceba que em nenhum momento houve a necessidade de criar nenhum arquivo XML para a configuração dos módulos do Spring Web MVC e do Thymeleaf. Além disso, nem tivemos o trabalho de configurar um servidor Apache para servir a nossa aplicação, o que nos poupa tempo que é melhor empregado na codificação das regras de negócio.

Recomendo também a leitura do artigo Criando uma API REST com Spring Boot para um melhor contato com os frameworks do projeto Spring.


Ferramentas Java

Introdução ao Maven, aprenda como criar e gerenciar projetos Java

É um problema comum durante o desenvolvimento de projetos com a linguagem Java termos que baixar arquivos .jar para serem incluídos dentro de nossos projetos e assim podermos utilizar alguma biblioteca que vai nos auxiliar ao longo do desenvolvimento do mesmo.

Porém esse tipo de comportamento é bastante problemático, pois é comum termos que atualizar as versões dessas bibliotecas em nossas aplicações e realizar essa atualização não é algo trivial, é necessário baixar a nova versão do .jar dessa biblioteca e então coloca-la no nosso projeto, isso se torna ainda mais problemático quando estamos desenvolvendo em equipe, pois todos os membros da equipe precisam saber quais .jar e em quais versões são necessários para que o projeto funcione corretamente na máquina de cada um dos desenvolvedores.

Entretanto, atualmente existem diversas ferramentas que nos auxiliam a gerenciar as bibliotecas e automatizar certas tarefas dentro de projetos do ecossistema Java, uma delas é o Maven que vamos explorar um pouco nesse artigo.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

O que é o Maven?

O Maven é uma ferramenta de código aberto mantida pela Apache. Trata-se de uma ferramenta de gestão de dependências e um task runner. Em outras palavras, o Maven automatiza os processos de obtenção de dependências e de compilação de projetos Java.

Quando criamos um projeto Maven, este projeto fica atrelado a um arquivo principal: o pom.xml. Neste arquivo POM (Project Object Model), nós descrevemos as dependências de nosso projeto e a maneira como este deve ser compilado. Com o Maven, é possível, por exemplo, automatizar a execução de testes unitários durante a fase de build, entre outras automatizações.

Com o Maven, não temos mais a necessidade de baixarmos as dependências de nosso projeto e as configurar dentro do Build Path/Classpath de nossas aplicações. Se nós precisamos do driver do MySQL, por exemplo, simplesmente registramos essa dependência no pom.xml. As ferramentas de automação do Maven irão detectar esta dependência, baixa-la e configura-la no Build Path/Classpath de nosso projeto.

Instalação do Maven no Windows

Acesse a página oficial do Maven e faça o download dos arquivos binários.

Página de download dos arquivos binários do Maven

Após realizar o download dos arquivos binários do Maven você deve descompactá-los em um local de sua preferência, importante frisar que o local onde você descompactar os arquivos será o local onde o Maven ficará instalado.

Eu irei descompactar o Maven em C:\Program Files\Maven\apache-maven-3.6.3

Arquivos dos Maven descompactados

Agora vem a parte mais complicada do processo de instalação, é necessário colocar o local onde se encontra o script de execução do Maven nas variáveis de ambiente do seu sistema operacional.

Para fazer isso você pode pesquisar por “Editar as variáveis de ambiente do sistema” no menu iniciar e então irá aparecer a seguinte janela:

Print da janela Propriedades do Sistema

Clique no botão “Variáveis de ambiente…” e uma janela semelhante à da imagem abaixo irá ser exibida:

Print da janela Variáveis de Ambiente

Em seguida clique no botão “Novo..” localizado na parte mais inferior da janela, no campo “Nome da variável” coloque “M2_HOME” e no campo “Valor da variável” coloque o caminho para a pasta de instalação do Maven e por fim clique em “OK”:

Print da janela Nova Variável de Sistema

Em seguida clique na variável “Path” localizada na lista de Varáveis do sistema e depois clique no botão “Editar…”, em seguida clique no botão “Novo” que está localizado na nova janela que abriu e adicione o caminho da pasta bin do Maven:

Print da janela Editar Variável de Ambiente

Clique no botão “OK” para fechar a janela “Editar variável de ambiente” e depois clique no “OK” para fechar a janela “Variáveis de Ambiente” e por fim clique no “OK” para fechar a janela “Propriedades do Sistema”.

Para verificar se o Maven foi instalado com sucesso abra um terminal (PowerShell ou Prompt) e execute o comando abaixo:

mvn --version

Caso não ocorra nenhum erro após a execução do comando acima significa que o processo de instalação do Maven foi realizada com sucesso.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Instalação do Maven no Linux e MacOS

Para realizar a instalação do Maven em sistemas Linux e no MacOS nós vamos utilizar uma ferramenta de gerenciamento de versões chamada SDKMAN!.

Primeiro precisamos instalar o SDKMAN!, para isso execute o comando abaixo:

curl -s "https://get.sdkman.io" | bash

Em seguida execute o comando a seguir:

source "$HOME/.sdkman/bin/sdkman-init.sh"

Para confirmar que a instalação do SDKMAN! foi executada com sucesso execute seguinte comando:

sdk version

Caso não seja apresentado nenhum erro significa que a instalação do SDKMAN! foi um sucesso!

Por fim para realizar a instalação do Maven com o auxílio do SDKMAN! basta executar o seguinte comando:

sdk install maven 3.6.3

E é apenas isso, com o SDKMAN! podemos realizar a instalação de uma nova versão do Maven com apenas um comando. Para confirmar que a instalação do Maven realmente foi efetuada com sucesso basta executar o comando abaixo:

mvn --version

Caso não ocorra nenhum erro após a execução do comando acima significa que o processo de instalação do Maven foi realizada com sucesso.

Linux - Fundamentos para desenvolvedores
Curso de Linux - Fundamentos para desenvolvedores
CONHEÇA O CURSO
macOS - Fundamentos para desenvolvedores
Curso de macOS - Fundamentos para desenvolvedores
CONHEÇA O CURSO

O que são os Maven Archetypes?

Podemos criar nossos projetos Java usando o Maven, esses projetos são criados a partir de templates base que são chamados de archetypes (arquétipos), isso torna o processo mais fácil, pois quando queremos criar um projeto Java EE, por exemplo, é necessário criar uma estrutura de pastas especifica e configurar arquivos XML para que só depois possamos começar a programar a nossa aplicação, com o Maven é possível automatizar essa etapa ao utilizar um arquétipo de um projeto Java EE.

Criando nosso primeiro projeto com o Maven

Com o terminal aberto na pasta onde deseja criar o projeto vamos executar o comando mvn archetype:generate, após a execução desse comando será exibido no terminal a lista de arquétipos disponíveis para a criação do projeto, como vamos criar um projeto Java simples apenas para entender o funcionamento do Maven iremos utilizar o maven-archetype-quickstart, que cria um projeto básico.

Para isso você deve escolher o número correspondente ao arquétipo que deseja utilizar, no meu caso é o número 1733, lembrando que essa ordem pode mudar como tempo, mas não precisa se preocupar procurando qual o número correto, pois caso não coloque nenhuma opção de arquétipo o maven irá utilizar por padrão o maven-archetype-quickstart.

Em seguida é necessário escolher qual a versão do arquétipo, irei utilizar a versão mais recente, que é a versão 1.4, representada pela opção 8.

Após a escolha da versão o Maven irá perguntar quais os valores para a propriedades groupId, artifactId, version e package.

  • groupId: O nome da organização ao qual pertence esse projeto, possui o mesmo padrão de nomenclatura de pacotes, irei colocar como br.com.treinaweb
  • artifcatId: O nome do projeto, irei colocar treinaweb-maven
  • version: A versão do nosso projeto, caso não seja colocado nenhum valor o Maven irá utilizar o valor padrão que é 1.0-SNAPSHOT
  • package: O nome do pacote principal do nosso projeto, é boa pratica colocar a junção do groupId com o artifactId, no meu caso ficará br.com.treinaweb.treinawebmaven, caso não seja passado nenhum valor, o Maven irá assumir o mesmo valor colocado no groupId

Após colocar todos os valores basta confirma-los com o “Y”.

Estrutura de pastas do nosso projeto

Após a execução do comando para a criação do projeto foi criada uma pasta com o mesmo nome informado para o artifactId e dentro desta pasta foi criada uma estrutura de pastas para a organização do nosso projeto, dependendo de qual arquétipo você escolheu essa estrutura de pastas pode ser diferente.

treinaweb-maven
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── br
    │           └── com
    │               └── treinaweb
    │                   └── treinawebmaven
    │                       └── App.java
    └── test
        └── java
            └── br
                └── com
                    └── treinaweb
                        └── treinawebmaven
                            └── AppTest.java

Dentro da pasta do nosso projeto temos o arquivo pom.xml que contém as informações sobre o projeto e quais as suas dependências, também temos as pastas src que contém a pasta main que irá guardar o código fonte de nosso projeto e a pasta test que irá conter os códigos fontes para os testes automatizados. Dentro de cada uma destas pastas terá uma estrutura de pastas de acordo com o nome definido no package.

Além das pastas já criadas pelo Maven existe uma outra pasta que será criada sempre que executar o comando para que nosso projeto seja compilado, para demonstrar a criação dessa pasta execute o comando mvn compile dentro da pasta do projeto.

Após a execução do comando mvn compile uma nova pasta será criada, a pasta target, essa pasta irá conter os arquivos .class do nosso projeto.

treinaweb-maven
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── br
│   │           └── com
│   │               └── treinaweb
│   │                   └── treinawebmaven
│   │                       └── App.java
│   └── test
│       └── java
│           └── br
│               └── com
│                   └── treinaweb
│                       └── treinawebmaven
│                           └── AppTest.java
└── target
    └── classes
        └── br
            └── com
                └── treinaweb
                    └── treinawebmaven
                        └── App.class

Gerenciamento de dependências com Maven

Para gerenciar as dependências do nosso projeto utilizamos o arquivo pom.xml nele colocamos as informações das bibliotecas que o nosso projeto necessita para funcionar e o Maven se encarrega do download dessas bibliotecas e de adiciona-las no Build Path/Classpath.

O Maven irá buscar por essas dependências em locais chamados de repositórios, existem basicamente dois repositórios, o repositório local que está localizado na pasta .m2/repository e o repositório remoto que está localizado no repositório público do Maven.

Ao adicionar uma nova dependência em nosso projeto, o Maven primeiro realiza a busca em nosso repositório local, caso não encontre irá buscar no repositório remoto e então fazer o download da biblioteca e disponibiliza-la no repositório local, dessa maneira caso você necessite utilizar a mesma biblioteca em outro projeto não será necessário realizar o download novamente.

Entendendo o pom.xml

No momento nosso pom.xml está como descrito abaixo:

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

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>br.com.treinaweb</groupId>
  <artifactId>treinaweb-maven</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>treinaweb-maven</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Não se assuste com o tamanho do arquivo, ele pode parecer complexo à primeira vista, mas ao observar com mais calma verá que ele não é tão difícil de entender.

Podemos dividir o arquivo pom.xml em quatro partes, a primeira possui as coordenadas do projeto, ou seja, os dados que identificam o projeto, como groupid, artifactId e version.

<groupId>br.com.treinaweb</groupId>
<artifactId>treinaweb-maven</artifactId>
<version>1.0-SNAPSHOT</version>

A segunda parte são as propriedades do projeto, essa parte contém informações de encondig e também a versão do Java que estamos utilizando.

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.7</maven.compiler.source>
  <maven.compiler.target>1.7</maven.compiler.target>
</properties>

A terceira parte é onde definimos as dependencias de nosso projeto.

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

No momento temos apenas uma dependência listada que é o Junit na versão 4.11 que o Maven utiliza por padrão para executar os testes automatizados.

E por último temos as informações de build que dizem como o projeto deve ser compilado pelo Maven, nessa parte também estão descritas quais plugins do Maven o nosso projeto necessita para ser compilado.

<build>
  <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    <plugins>
      <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>3.1.0</version>
      </plugin>
      <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.2</version>
      </plugin>
      <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.7.1</version>
      </plugin>
      <plugin>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>3.0.0</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

Executando nosso Hello World

Quando criamos um projeto com o Maven já é criado um arquivo chamado App.java dentro do nosso pacote principal, esse arquivo possui um simples Hello World e podemos executar esse código de diversas formas, uma delas é através do comando mvn exec:java -Dexec.mainClass="br.com.treinaweb.treinawebmaven.App"

Caso não queira ter que passar o parâmetro -Dexec.mainClass toda vez que quiser executar o seu projeto é necessário configurar o plugin de execução do Maven, essa configuração é feita no arquivo pom.xml , para isso vá na parte de plugins do arquivo pom.xml e adicione o código abaixo:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>br.com.treinaweb.treinawebmaven.App</mainClass>
  </configuration>
</plugin>

Com o código acima estamos adicionando uma configuração para o plugin de execução do Maven, nessa configuração estamos dizendo qual a classe principal do nosso projeto, assim para podermos executar nosso código não será mais necessário passar o parâmetro -Dexec.mainClass no comando mvn exec:java.

Adicionando dependências em nosso projeto

Para adicionarmos uma nova dependência em nosso projeto basta que no arquivo pom.xmldentro da tag dependencies adicionemos uma nova tag dependency com as informações de groupId, artifactId e version da biblioteca que queremos adicionar como dependência.

Digamos que vamos desenvolver uma aplicação que realiza requisições HTTP para algum serviço na web, então precisamos de alguma forma realizar essas requisições através do nosso código Java, uma ótima forma de fazer isso é através da biblioteca Apache HttpClient, então para adicionarmos essa biblioteca como dependência em nosso projeto temos que adicionar suas informações no nosso arquivo pom.xml

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>

  <!-- Informações da biblioteca Apache HttpClient -->
  <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.13</version>
  </dependency>
</dependencies>

Com isso o Maven irá realizar o download da biblioteca Apache HttpClient e adiciona-la em nosso Build Path/Classpath e então já poderemos utiliza-la em nosso projeto sem mais nenhum trabalho adicional.

Atualizando nosso projeto para usar o Apache HttpClient

Para proposito de exemplificação, vamos alterar o código do arquivo App.java para que ele utilize a biblioteca Apache HttpClint e realize uma requisição HTTP para a API Viacep e então exiba no terminal os dados do CEP que for passado como parâmetro na execução do nosso projeto.

Altere o código do arquivo App.java para ficar de acordo com o exemplo abaixo:

package br.com.treinaweb.treinawebmaven;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

public class App {
    public static void main( String[] args ) {
        String url = "https://viacep.com.br/ws/" + args[0] + "/json/";

        try {
            CloseableHttpClient client = HttpClientBuilder.create().build();
            CloseableHttpResponse response = client.execute(new HttpGet(url));
            String json = EntityUtils.toString(response.getEntity());

            System.out.println(json);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Agora precisamos executar o projeto com o Maven para que possamos ver o código funcionando na prática, como precisamos passar um parâmetro na execução do código utilize o seguinte comando mvn exec:java -Dexec.args="01311200" , mas antes de executar nosso projeto é necessário realizar o processo de compilação com o comando mvn compile, dessa maneira estamos utilizando o Maven para executar o projeto e passando como parâmetro a String 01311200.

Conclusão

Nesse artigo tivemos uma introdução a ferramenta Maven, vimos o que é, como realizar a sua instalação, como podemos utiliza-la para criar, compilar e executar os nossos projetos e também como é possível gerenciar as dependências de nossos projetos.

O Maven ainda possui outras funcionalidades como a de empacotar e gerar o build de nosso projeto e ele também pode ser estendido através de diversos plugins que adicionam novas funcionalidades.

Além disso o Maven pode ser integrado com diversas IDE’s como o Intellij IDEA e Eclipse e também com editores de código fonte como o VS Code.

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Java

Orientação a objetos em Java

O Java atualmente pode ser considerada uma linguagem multiparadigma, mas é perceptível a sua vocação para estruturas orientadas a objetos. O paradigma orientado a objetos traz boas vantagens, como a reutilização de código, a legibilidade e manutenibilidade do código, a natural modularização e a produção de código mais acessível, já que as estruturas criadas geralmente representam aspectos também existentes no mundo real.

Quando lidamos com o paradigma orientado a objetos, acabamos criando diversas unidades de software através de estruturas chamadas classes. A partir destas classes, podemos criar estruturas chamadas objetos, estruturas estas que interagem entre si. Esse é o motivo pelo qual o paradigma é chamado de orientação a objetos: todas as interações necessárias para que o software funcione ocorrem através de mensagens e comandos trocados entre estes objetos.

Caso você esteja iniciando e não conheça muita coisa sobre orientação a objetos, indico primeiramente a leitura do artigo “Os pilares da orientação a objetos”.

Classe

Quando falamos sobre orientação a objetos, as classes são uma das estruturas essenciais.

Uma classe funciona como um “molde” para definição de outras estruturas. Classes geralmente são compostas pelo agrupamento de atributos ou características, e métodos ou ações. Uma classe define agrupamentos de atributos e métodos que são correlacionados e podem ser reaproveitados.

Por exemplo, imagine que você precisa criar uma aplicação para fazer a gestão de uma frota de veículos. Nessa aplicação, com certeza será necessário manipular informações de carros. E todos os carros geralmente possuem um “molde” padrão com características e ações que são comuns a todos os carros.

Todos os carros, por exemplo, possuem características como:

• Modelo;
• Marca;
• Fabricante;
• Chassi.

E possuem ações em comum, como:

• Ligar;
• Acelerar;
• Frear;
• Desligar.

Dessa maneira, poderíamos criar uma estrutura de código que representasse esse formato padrão para todos os veículos, agrupando justamente estas características e ações. E é exatamente essa estrutura que é uma classe. Nesse caso, poderíamos ter uma classe Carro, que define as características e ações que são comuns para todos os carros.

Declarando classes

No Java, podemos declarar uma classe da seguinte maneira:

package br.com.treinaweb;

public class Carro {

    // Atributos ou Características de um carro
    public String modelo;
    public String marca;
    public String chassi;
    public String fabricante;

    // Métodos ou ações de um carro
    public void ligar() {
        System.out.println("Carro ligado!");
    }

    public void desligar() {
        System.out.println("Carro desligado!");
    }

    public void acelerar() {
        System.out.println("Carro acelerando...");
    }

    public void frear() {
        System.out.println("Carro freando...");
    }

}

Neste momento, caso você tenha visto possíveis palavras desconhecidas ou que você não entenda o funcionamento, como public, por exemplo, seu funcionamento é abordado no artigo “Os pilares da orientação a objetos” que citamos no começo deste artigo.

Como no exemplo acima, classes geralmente possuem duas sessões distintas: uma primeira parte, onde são declaradas as características (que tecnicamente são chamadas de atributos); e uma segunda parte onde são declaradas as ações previstas por aquela classe (que tecnicamente são chamadas de métodos).

Uma classe não é obrigada a ter as duas sessões: podemos ter classes que possuem somente atributos, podemos ter classes que possuem somente métodos e podemos ter classes que possuem ambas as sessões. Tudo vai depender da necessidade.

Objetos

Classes existem para definirmos os nossos moldes, ou seja, para definirmos o formato de estruturas que nosso código irá manipular. Mas, elas servem somente para ser moldes. Se quisermos as utilizar, precisamos colocar algo e criar uma estrutura que seja semelhante a esse molde. E é nesse momento que entram em cena os objetos.

Os objetos são estruturas que são criadas a partir das classes. Um objeto, quando criado a partir de uma determinada classe, assume que irá possuir os mesmos atributos e os mesmos métodos definidos pela classe. Uma classe pode dar origem a vários objetos distintos entre si que compartilham o mesmo molde.

Declarando objetos

No Java, objetos podem ser declarados da seguinte forma:

package br.com.treinaweb;

public class Aplicacao {

    public static void main(String args[]) {
      Carro corsa = new Carro();
      corsa.modelo = "Corsa";
      corsa.marca = "Chevrolet";
      corsa.chassi = "ABC123";
      corsa.fabricante = "Chevrolet";
      corsa.ligar();
      corsa.acelerar();
      corsa.frear();
      corsa.desligar();
      System.out.println("Nome do carro: " + corsa.modelo);

      Carro gol = new Carro();
      gol.modelo = "Gol";
      gol.marca = "Volkswagen";
      gol.chassi = "DEF456";
      gol.fabricante = "Volkswagen";
      gol.ligar();
      gol.acelerar();
      gol.frear();
      gol.desligar();
      System.out.println("Nome do carro: " + gol.modelo);
    }
}

Neste exemplo, usamos a nossa classe Carro para criar dois objetos a partir dela: os objetos gol e corsa.

No exemplo acima, ainda podemos afirmar que temos duas variáveis do tipo Carro: gol e corsa; embora, em termos técnicos, o correto é dizer que temos duas instâncias da classe Carro: gol e corsa, objetos também são chamados de instâncias de uma classe. Porém, em termos práticos, não há problema em dizer que temos uma variável do tipo de uma classe.

Objetos são importantes por algumas razões, logo aqui, podemos ver algumas características importantes:

• Objetos definem instâncias de classes, o que nos permite usufruir do molde de atributos e métodos definidos por uma classe;
• Objetos guardam estado de maneira segregada: veja que o objeto corsa tem suas características definidas de maneira própria, como modelo, marca, chassi e fabricante. O objeto gol também tem exatamente as mesmas características, mas definidas de acordo com o objeto gol. Embora ambos os objetos venham da mesma classe, eles têm seus próprios valores de atributos, valores estes atrelados a cada instância (no caso, as instâncias gol e corsa).

Métodos

Partindo do mesmo código acima, temos os métodos. Os métodos são comportamentos e ações que os objetos podem ter.

No código acima, os objetos gol e corsa, por virem do “molde” Carro, adquirem os atributos e métodos definidos pela classe Carro e, por isso, passam a ter as características com modelo, marca e chassi; e ganham as ações definidas pela classe Carro, como ligar, desligar e acelerar.

    public void ligar() {
        System.out.println("Carro ligado!");
    }

Quando temos objetos, seus atributos (ou características) e métodos (ou ações) são acessados através do “.”. Por exemplo: se eu tenho um Carro chamado corsa e quero acessar seu atributo modelo, devo escrever um código como corsa.modelo. A mesma coisa vale para métodos: se eu quiser acessar o método ligar do objeto corsa, devo escrever o código corsa.ligar().

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Java

Estruturas condicionais e estruturas de repetição em Java

Depois de conhecermos mais sobre variáveis e constantes no Java, veremos neste artigo as estruturas condicionais e estruturas de repetição. Essas estruturas são fundamentais e vem para nos ajudar no reaproveitamento de código.

Cada sistema pode fazer uso de quantas combinações de estruturas de repetição e/ou estruturas de decisão forem necessárias.

Estruturas condicionais

As estruturas condicionais possibilitam ao programa tomar decisões e alterar o seu fluxo de execução. Isso possibilita ao desenvolvedor o poder de controlar quais são as tarefas e trechos de código executados de acordo com diferentes situações, como os valores de variáveis.

As estruturas condicionais geralmente analisam expressões booleanas e, caso estas expressões sejam verdadeiras, um trecho do código é executado. No caso contrário, outro trecho do código é executado.

If/else

O if/else é uma estrutura de condição em que uma expressão booleana é analisada. Quando a condição que estiver dentro do if for verdadeira, ela é executada. Já o else é utilizado para definir o que é executado quando a condição analisada pelo if for falsa. Caso o if seja verdadeiro e, consequentemente executado, o else não é executado.

O if pode ser utilizado em conjunto com o else ou até mesmo sozinho, caso necessário.

Abaixo, temos um exemplo onde o if é utilizado em conjunto com o else.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        int resposta = 10;
        if (resposta == 10) {
            // Se a variável for igual a 10, a frase abaixo será escrita
            System.out.println(“Você acertou!”);
        } else {
            // Caso contrário, a frase abaixo será escrita
            System.out.println(“Você errou!”);
        }
    }

}
Java - Fundamentos
Curso de Java - Fundamentos
CONHEÇA O CURSO

Também podemos utilizar somente o if, não definindo um fluxo alternativo.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        int resposta = 10;
        if (resposta == 10) { 
            // Se a variável for igual a 10, a frase abaixo será escrita
            System.out.println(“Você acertou!”);
        }
        // Se a variável não for igual a 10, nenhuma frase será exibida
    }

}

Ainda é possível encadear múltiplas estruturas if/else caso necessário.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        int resposta = 10;
        if (resposta == 10) { 
            System.out.println(“A resposta é exatamente 10!”);
        } else if (resposta > 10) {
            System.out.println(“A resposta é maior que 10!”);
        } else {
            System.out.println(“A resposta é menor que 10!”);
        }
    }

}

Switch/case

A estrutura condicional switch/case vem como alternativa em momentos em que temos que utilizar múltiplos ifs no código. Múltiplos if/else encadeados tendem a tornar o código muito extenso, pouco legível e com baixo índice de manutenção.

O switch/case testa o valor contido em uma variável, realizando uma comparação com cada uma das opções. Cada uma dessas possíveis opções é delimitada pela instrução case.

Podemos ter quantos casos de análise forem necessários e, quando um dos valores corresponder ao da variável, o código do case correspondente será executado. Caso a variável não corresponda a nenhum dos casos testados, o último bloco será executado, chamado de default (padrão).

A análise de cada caso também precisa ter seu final delimitado. Essa delimitação é feita através da palavra break.

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        int mes = 2;
        switch (mes) {
            case 1:
                System.out.println(“O mês é janeiro”);
                break;
            case 2:
                System.out.println(“O mês é fevereiro”);
                break;
            case 3:
                System.out.println(“O mês é março”);
                break;
            case 4:
                System.out.println(“O mês é abril”);
                break;
            case 5:
                System.out.println(“O mês é maio”);
                break;
            case 6:
                System.out.println(“O mês é junho”);
                break;
            case 7:
                System.out.println(“O mês é julho”);
                break;
            case 8:
                System.out.println(“O mês é agosto”);
                break;
            case 9:
                System.out.println(“O mês é setembro”);
                break;
            case 10:
                System.out.println(“O mês é outubro”);
                break;
            case 11:
                System.out.println(“O mês é novembro”);
                break;
            case 12:
                System.out.println(“O mês é dezembro”);
                break;
            default:
                System.out.println(“Mês inválido”);
                break;
        }
    }

}

Estruturas de repetição

Estruturas de repetição, também conhecidas como loops (laços), são utilizadas para executar repetidamente uma instrução ou bloco de instrução enquanto determinada condição estiver sendo satisfeita.

As principais estruturas de repetição na maioria das linguagens são o for e o while.

For

O for é uma estrutura de repetição na qual seu ciclo será executado por um tempo ou condição pré-determinados e em uma quantidade de vezes que determinamos.

O for possui a seguinte estrutura:

for (<variável de controle>, <análise da variável de controle>, <incremento da variável de controle>) {
    // Código a ser executado
}

Quando utilizamos o for, precisamos de uma variável para auxiliar a controlar a quantidade de repetições a serem executadas. Essa variável é chamada de variável de controle e é declarada no primeiro argumento do for.

O segundo argumento do for é utilizado para definir até quando o for será executado. Geralmente, trata-se de uma condição booleana em cima da variável de controle.

O terceiro argumento indica o quanto a variável de controle será modificada no final de cada execução dentro do for.

Veja o exemplo abaixo:

package br.com.treinaweb;

public class Exemplo {

    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            System.out.println(“A variável i agora vale “ + i);
        }
    }

}

A execução desse código causaria a seguinte saída:

A variável i agora vale 0
A variável i agora vale 1
A variável i agora vale 2
A variável i agora vale 3
A variável i agora vale 4
A variável i agora vale 5
A variável i agora vale 6
A variável i agora vale 7
A variável i agora vale 8
A variável i agora vale 9
A variável i agora vale 10

Isso acontece porque:

• A variável de controle, que chamamos de “i”, tem seu valor inicial como 0;

• No segundo bloco, onde escrevemos “i <= 10”, estamos dizendo que o conteúdo do for será executado enquanto o valor de i for menor ou igual a 10;

• Com o terceiro bloco definido como “i++”, estamos dizendo que, no fim de cada execução do for, o conteúdo de “i” será incrementado em 1 unidade. Isso quer dizer que, no fim da primeira execução, i irá de 0 para 1; na segunda execução, irá de 1 para 2, e assim por diante;

• Com isso, o conteúdo do for será executado por 11 vezes, já que o i é iniciado em 0. A saída do código acima mostra que a mensagem foi escrita por 11 vezes, onde o “i” variou de 0 até 10.

Um ponto importante sobre o for é que, por causa da utilização da variável de controle, geralmente ele é utilizado quando sabemos exatamente quantas vezes queremos repetir a execução do trecho de código.

While

O while também é uma estrutura de repetição, assim como o for. A diferença entre ambas é que, enquanto usamos o for quando geralmente conhecemos a quantidade de vezes que o trecho de código deverá ser repetido, nós utilizamos o while quando não sabemos exatamente quantas vezes o código será repetido.

O while possui a seguinte estrutura:

while (<condição>) {
    // Trecho de código a ser repetido
}

Perceba que a condição para interrupção da repetição do trecho dentro do while se dá através de uma condição booleana.

Abaixo, temos um exemplo do while. Neste exemplo, é pedido ao usuário que tente adivinhar o número. Enquanto o usuário não acerta o número, é pedido para que o usuário digite o valor que ele acha que é o correto. Perceba que nós temos um trecho de código que é sempre repetido, que é o pedido do número para o usuário. Mas, não sabemos exatamente quando o usuário vai acertar este número, ou seja, não sabemos exatamente quantas vezes o trecho de código será repetido. Nessa situação, o while é a estrutura de repetição mais adequada.

package br.com.treinaweb;

import java.util.Scanner;

public class Exemplo {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int numero = -1;
        while (numero != 10) { 
// enquanto a variável não for 10, o trecho de código será repetido
            System.out.println(“Digite um número: “);
            numero = in.nextInt();
            if (numero == 10) {
                System.out.println(“Você acertou!“);
            } else {
                System.out.println(“Você errou :(“);
            }
        }
    }

}

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Java

Conhecendo variáveis e constantes no Java

O Java é uma linguagem criada na década de 90 por uma equipe de desenvolvedores sob supervisão de James Gosling dentro da Sun Microsystems (que foi adquirida pela Oracle posteriormente). A intenção inicial do Java era prover uma linguagem completamente multiplataforma, já que a equipe acreditava que haveria uma convergência muito forte entre computadores e outros dispositivos, como geladeiras e TVs por exemplo.

A linguagem teve e tem uma adoção muito forte no mercado, estando entre as três linguagens mais utilizadas no mundo. A força da linguagem e da plataforma se justificam pelo seu aspecto multiplataforma, o tamanho e a força da comunidade envolvida e seu ambiente de execução de alta performance através das múltiplas implementações da JVM existentes.

Características de tipagem

O Java é uma linguagem de tipagem estática, ou seja, existe um sistema de tipos bem definido e que é validado durante o tempo de compilação do código. Para isso, é necessário definir tipos explícitos para as variáveis que são criadas.

Existem algumas vantagens atreladas à utilização de sistemas de tipos estáticos como: equívocos de tipagem geralmente são percebidos com mais facilidade, além de que os processos de refatoração tendem a ser mais a prova de equívocos. Se acaba sendo necessário trocar o tipo de um parâmetro de uma função, por exemplo, o código não irá compilar até que todos os locais que referenciam o método passem a especificar o tipo correto.

Mas também existem algumas desvantagens: linguagens com tipagem estática têm tendência a serem mais verbosas, já que você precisa sempre estar declarando os tipos das variáveis. Além disso, a tipagem estática pode passar uma falsa sensação de segurança em alguns cenários, ainda mais no caso de versões mais novas das linguagens, que geralmente trabalham com inferência de tipagem, que é o caso do Java.

Java - Fundamentos
Curso de Java - Fundamentos
CONHEÇA O CURSO

Tipos de dados padrões no Java

Por padrão, o Java possui em sua biblioteca padrão alguns tipos:

Byte: um inteiro com valor 8 bits, onde seu intervalo de valores vai do -128 até o 127. É um dado leve, que ocupa pouco espaço em memória;

Char: trata-se de um único caractere unicode de 16 bits. Seu intervalo de valores vai do ‘\u0000’ ou 0 até o valor máximo ‘\uffff’ ou 65535. É utilizado para armazenar caracteres de maneira isolada;

Short: trata-se de um valor inteiro de 16 bits. Seu intervalo de valores vai do -32.768 até o 32.767;

Int: trata-se de um valor inteiro de 32 bits. Suporta valores de -2.147.483.648 a 2.147.483.647;

Long: define um valor inteiro de 64 bits. Suporta valores de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807;

Boolean: é um dos tipos de dados mais simples, pois ele pode armazenar apenas dois valores: true (verdadeiro) ou false (falso). É empregado para realizar testes lógicos, dentro de estruturas de decisão e repetição, por exemplo.

Float: trata-se de um tipo de dado de ponto flutuante de 32 bits. Isso quer dizer que ele permite armazenar valores decimais entre 6 e 7 casas. Porém, o armazenamento em memória pode não representar necessariamente o valor repassado. Por exemplo, um float definido com “0,001” pode acabar sendo armazenado como “0,00100001”, e isso não somente no Java, já que isso é decorrência dos pontos flutuantes em geral. Por isso, o tipo float não deve ser usado para operações que precisam passar por várias operações aritméticas, como no caso de sistemas financeiros. Isso porque, a primeira vista, essa imprecisão pode não impactar, mas na sequência de operações realizadas, estas imprecisões podem começar a aparecer nos resultados;

Double: representa um ponto flutuante de 64 bits. Por isso, ele permite armazenar números de até cerca de 15 casas decimais. A observação para o tipo float também é válida para o tipo double: por ser um tipo de dado que é armazenado por aproximação de valores, ele não deve ser utilizado em operações que demandam precisão absoluta.

Regras de nomeação de variáveis

A fim de manter uma mínima padronização do código-fonte, o Java estabelece alguns padrões para a definição de nomes para as variáveis:

• Variáveis têm seu nome definido com a primeira letra minúscula. Caso se trate de um nome composto, a primeira letra deve ser minúscula, enquanto as outras devem ser maiúsculas. Espaços não podem ser utilizados no meio dos nomes das variáveis;

• As variáveis não devem contar com caracteres especiais em seu nome. As únicas exceções são o underline (_) e o cifrão ($) em algumas situações, como na definição de estruturas estáticas;

• Os nomes devem ser declarativos e auto-explicativos;

• As variáveis são case-sensitive. Isso quer dizer que “nomeDoAutor” é diferente de “nomeDoautor”, de “NomeDoAutor” e de “nomedoautor”, por exemplo.

As variáveis abaixo seguem as convenções de nomenclatura:

static int MAIORIDADE_PENAL = 18; // trata-se de um atributo estático

String nomeDoAluno = “”;
int idade = 0;

As variáveis abaixo ferem algumas das convenções:

int a = 0; // nome não muito claro
String NomeDaPessoa = “”; // variável começando com letra maiúscula
int _tamanhoDaPessoa = 0; // nome de variável começando com caractere especial.

Java e as constantes

Constantes, sob um ponto de vista prático são como variáveis, só que com o ponto de que seu valor não pode ser modificado. Isso quer dizer que, se você declara uma constante chamada MAIORIDADE_PENAL com o valor 18, esse valor não poderá ser jamais modificado durante a execução da aplicação.

O Java não possui formalmente o conceito de constantes, assim como acontece em outras linguagens como C# e C++. Embora a palavra-chave “const” seja uma palavra reservada na especificação do Java (ou seja, você não pode nomear nenhuma estrutura como “const”), ela não tem nenhum significado para o compilador. Isso foi uma decisão de design durante a criação do Java. Isso tem relação com a maneira como o Java lida com a referência com as variáveis, as definindo entre value-types e reference-types.

A maneira mais comum para “simular” constantes no Java é através da combinação das palavras-chave static e final.

public static final int MAIORIDADE_PENAL = 18;

Neste exemplo:

• O static faz com que a variável em questão, de maneira prática, não esteja “amarrada” a um objeto. É como se ela, apesar de estar dentro de uma classe por convenções da linguagem, na verdade não pertencesse somente ao escopo daquela classe. Em termos mais profundos, isso implica até mesmo na localização na memória onde a variável é armazenada (nas versões mais novas da JVM, atributos estáticos ficam em uma área de memória chamada metaspace);

• O final indica basicamente que o conteúdo da variável não pode ser modificado (aqui, o aspecto de constante é definido), porém, isso obriga a inicialização da variável junto com sua definição.

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Desenvolvimento Java

Como instalar o Java e nosso primeiro exemplo

Neste artigo veremos como instalar o Java nos sistemas Windows, Linux e MacOS, além disso vamos ver como escrever e executar nosso primeiro programa com a linguagem Java.

O que é o Java?

Java é uma linguagem de programação Orientada a Objetos desenvolvida na década de 90 pela Sun Microsystems, mas que atualmente é mantida pela Oracle.

É uma linguagem multiplataforma, permitindo assim que os programas escritos em Java possam ser executados em diferentes sistemas operacionais. Diferente de outras linguagens que tem o seu código compilado e transformado em código nativo, o Java é compilado para bytecode que por sua vez é interpretado por uma máquina virtual, a JVM (Java Virtual Machine), sendo assim os programas feitos em Java podem ser executados em qualquer plataforma que possua a JVM instalada.

Desenvolvedor Java
Formação: Desenvolvedor Java
A formação Desenvolvedor Java da TreinaWeb tem como objetivo apresentar o desenvolvimento através do Java e todo o ecossistema para desenvolvimento da Oracle. Nesta formação, são desde tópicos básicos como o paradigma orientado a objetos, a preparação do ambiente de desenvolvimento para o Java através do Eclipse e o controle de versão de código através do Git e do GitHub. Até aspectos mais avançados como acesso a bancos de dados relacionais e o desenvolvimento de aplicações web com o Java.
CONHEÇA A FORMAÇÃO

O que é o JDK?

Para que possamos desenvolver nossos projetos utilizando a linguagem de programação Java, primeiro é necessário realizar a instalação do Java Development Kit (JDK), que é um conjunto de ferramentas que permite compilar, executar e depurar nossos códigos em Java. Esse kit de desenvolvimento é gratuito e pode ser obtido a partir de diferentes fornecedores, como a Oracle, o AdoptOpenJDK e entre outros.

Para essa instalação vamos utilizar a versão 11 do JDK fornecido pela AdoptOpenJDK.

Instalação do Java no Windows

  1. Acesse o site do AdoptOpenJDK
  2. Nas opções de versões marque a opção “OpenJDK 11 (LTS)”
  3. Nas opções da JVM marque a opção “HotSpot”
  4. Clique no botão de download para baixar o assistente de instalação

Página de download do OpenJDK

Após realizar o download do assistente de instalação basta executa-lo e seguir o processo padrão de instalação de softwares no Windows (next, next, next, finish), com uma única ressalva, tenha certeza que a opção “Set JAVA_HOME variable” esteja habilitada.

Tela de configuração da variável de ambiente JAVA_HOME

Após finalizar o processo de instalação precisamos verificar se a instalação foi realizada com sucesso, para isso abra um terminal (PowerShell ou Prompt) e execute os comandos abaixo:

java --version

e

javac --version

Caso não ocorra nenhum erro após a execução de ambos os comandos acima significa que o processo de instalação do JDK foi realizado com sucesso.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Instalação do Java no Linux e MacOS

Para realizar a instalação do JDK em sistemas Linux e no MacOS nós vamos utilizar uma ferramenta de gerenciamento de versões chamada SDKMAN!.

Primeiro precisamos instalar o SDKMAN!, para isso execute o comando abaixo:

curl -s "https://get.sdkman.io" | bash

Em seguida execute o comando a seguir:

source "$HOME/.sdkman/bin/sdkman-init.sh"

Para confirmar que a instalação do SDKMAN! foi executada com sucesso execute seguinte comando:

sdk version

Caso não seja apresentado nenhum erro significa que a instalação do SDKMAN! foi um sucesso!

Um vez que o SDKMAN! foi instalado nós podemos utilizar essa ferramenta para realizar a instalação do JDK.

Para realizar a instalação da JDK na versão 11 fornecida pela AdoptOpenJDK execute o comando a seguir:

sdk install java 11.0.9.hs-adpt

E é apenas isso, com o SDKMAN! podemos realizar a instalação de uma nova versão do JDK com apenas um comando. Para confirmar que a instalação do JDK realmente foi efetuada com sucesso basta executar os comandos abaixo:

java --version

e

javac --version

Caso não ocorra nenhum erro após a execução dos comandos acima significa que o processo de instalação do JDK foi realizado com sucesso.

Linux - Fundamentos para desenvolvedores
Curso de Linux - Fundamentos para desenvolvedores
CONHEÇA O CURSO
macOS - Fundamentos para desenvolvedores
Curso de macOS - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Criando nosso primeiro exemplo em Java

Agora que já temos o JDK instalado em nossa máquina vamos escrever nosso primeiro código em Java que será um simples Olá Mundo. Esse simples código que vai exibir a mensagem “Olá Mundo” tem como objetivo principal verificar se nosso ambiente de desenvolvimento está configurado de maneira adequada.

Para escrevermos nosso código vamos precisar de algum editor de código fonte ou uma IDE, eu irei utilizar o editor de código Visual Studio Code, caso queira saber como instalar esse editor na sua máquina veja o artigo Instalação do VS Code no Windows, Linux e MacOS.

Para desenvolver um código em Java é necessário criar um arquivo com a extensão .java, para escrever o nosso código irei criar um arquivo chamado OlaMundo.java e abri-lo no VS Code, é possível realizar ambas as ações com um único comando:

code OlaMundo.java

Após executar o comando acima o VS Code irá abrir já com o arquivo criado e aberto para que possamos escrever nosso código.

Animação demonstrado a execução do comando para abrir o arquivo OlaMundo.java pelo VS Code

Caso você tenha o VS Code instalado e mesmo assim o comando code não esteja habilitado, basta abrir o VS Code normalmente e criar o arquivo OlaMundo.java da maneira convencional.

  1. Abra o VS Code
  2. Clique na opção de menu File > New File ou use o atalho CTRL + n
  3. Clique na opção de menu File > Save File ou use o atalho CTRL + s
  4. Escolha o local onde o arquivo irá ser salvo
  5. Coloque o nome do arquivo como OlaMundo.java
  6. Clique no botão Salvar

Animação demonstrado a criação do arquivo OlaMundo.java de maneira convencional pelo VS Code

Vamos escrever o nosso Olá Mundo

Na linguagem Java é necessário seguir o paradigma Orientado a Objetos, sendo assim, precisamos criar uma classe publica que tenha o mesmo nome do nosso arquivo, por isso a primeira coisa a fazer no nosso código é escrever uma classe chamada OlaMundo.

public class OlaMundo {

}

Agora que temos a nossa classe criada, precisamos indicar para JVM qual a classe principal do nosso programa, a maneira que a JVM sabe que uma classe é a classe principal é através de um método chamado main, além disso esse método precisa seguir algumas regras, ele precisa ser um método público, estático, ter void como retorno e receber como parâmetro um array de strings.

public class OlaMundo {
    public static void main(String[] args) {

    }
}

Agora chegamos na parte final do nosso código, uma vez que temos a nossa classe OlaMundo e nosso método main definidos o que precisamos fazer é escrever a instrução que irá exibir o texto “Olá Mundo”.

Na linguagem Java quando queremos exibir alguma mensagem na tela durante a execução do nosso código utilizamos a instrução System.out.println e passamos como parâmetro dessa função uma String contendo a mensagem a ser exibida.

public class OlaMundo {
    public static void main(String[] args) {
        System.out.println("Olá Mundo");
    }
}

E com isso finalizamos o nosso código que irá exibir o texto “Olá Mundo”.

Hora de executar o nosso Olá Mundo

Agora que nosso código já está pronto é hora de executa-lo, para isso precisamos primeiro compilar esse código para Bytecode através do compilador do Java que foi instalado na nossa máquina a partir do JDK.

Para isso execute o comando abaixo no seu terminal.

javac OlaMundo.java

O comando javac quer dizer Java Compiler (Compilador Java) e ele é o responsável por compilar o nosso código para Bytecode, depois da execução do comando acima o compilador do Java irá criar um novo arquivo chamado OlaMundo.class esse arquivo é o nosso Bytecode que deverá ser executado pela JVM.

Para executar o nosso arquivo Bytecode nós utilizaremos o comando java

java OlaMundo

Veja que agora não é necessário especificar a versão do arquivo que será executado pela JVM.

Animação demonstrando a execução do arquivo OlaMundo.java pela JVM

Lembrando que os comandos acima devem ser executados no mesmo local onde se encontra o seu arquivo OlaMundo.java

Conclusão

Neste artigo vimos o que é o Java, o que é e como realizar a instalação do JDK nos sistemas Windows, Linux e MacOS e além disso escrevemos e executamos o nosso primeiro Olá Mundo para assim garantirmos que todo o nosso ambiente de desenvolvimento foi configurado corretamente.

Se você quer conhecer mais sobre essa linguagem, não se esqueça de acessar nosso Guia da linguagem Java. Te esperamos lá 🙂


Java

Lendo dados do Excel via DDE no Java

Todos os nossos cursos possuem suporte e os instrutores sempre procuram auxiliar os alunos, mesmo quando a dúvida não é relacionada ao conteúdo do curso (claro que isso é feito na medida do possível). Esses dias um aluno perguntou como poderia trabalhar com DDE no Java. O DDE é uma tecnologia de comunicação entre programas considerada legada, mas que ainda é muito utilizada em certos ambientes.

Por ser algo legado, este tópico não se encaixa em nenhum dos cursos, mas para auxiliar o aluno, estudei sobre a tecnologia e vou abordá-la nesta artigo para que possa auxiliar outros que também necessitam fazer uso da mesma.

Java - Fundamentos
Curso de Java - Fundamentos
CONHEÇA O CURSO

O que é DDE?

Dynamic Data Exchange, também conhecido como DDE, é uma tecnologia de comunicação de aplicações criada pela Microsoft em 1987. O objetivo desta tecnologia é permitir que aplicações do Windows compartilhem dados dinâmicos.

Por exemplo, o valor de uma célula do Excel pode ser vinculado a um valor de outra aplicação. Quando a aplicação alterar este valor, a célula da planilha também é modificada.

O inverso também é possível, vincular uma aplicação à uma célula do Excel. Quando a célula for modificada, a aplicação será notificada e poderá ler o novo dado dela.

Apesar de ainda ser funcional, atualmente o DDE é considerado um recurso legado, geralmente sendo substituído por tecnologias mais atuais, como OLE (Object Linking and Embedding) e COM (Component Object Model). Mas devido a sua simplicidade e facilidade, ainda é muito utilizado para criar planilhas dinâmicas do Excel.

Criando um cliente DDE em Java

Para compreender a simplicidade do DDE, vamos ver um exemplo simples de leitura de dados de uma planilha do Excel. Para isso, será necessário fazer uso da biblioteca JDDE da Pretty Tools.

Antes de criar um projeto é importante ressaltar que esta biblioteca não é disponibilizada via Maven. Para utilizá-la é necessário adicionar manualmente o arquivo jar no classpath ou adicioná-la em um repositório local. Também é importante que seja adicionado ao PATH, as dlls fornecidas pela biblioteca.

Ao fazer este processo, será possível ler os dados de uma planilha com o código abaixo:

import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.client.DDEClientConversation;

public class App 
{
    public static void main( String[] args )
    {
        try
        {
            final DDEClientConversation conversation = new DDEClientConversation();

            conversation.connect("Excel", "Planilha1");
            try
            {
                System.out.println("A1: " + conversation.request("R1C1"));
                conversation.execute("[close()]");
            }
            finally
            {
                conversation.disconnect();
            }
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

Note que inicialmente é indicado que a conexão será realizada com o arquivo do Excel aberto e será lido os dados da planilha nomeada como “Planilha1”.

Caso houver mais de um arquivo do Excel aberto, o arquivo que será lido deve ser indicado:

conversation.connect("Excel", "C:\Planilha.xlsx");

Neste caso, será lido os dados da primeira planilha do arquivo, mas é possível especificar outra:

conversation.connect("Excel", "C:\\[Planilha.xlsx]Planilha2");

Com a conexão realizada, solicitamos os dados da primeira linha e primeira coluna:

System.out.println("Célula A1: " + conversation.request("R1C1"));

Note que a solicitação segue o padrão “Row1 Column 1”. Assim, caso deseje ler todos os dados de uma coluna, basta especificar apenas o seu número:

System.out.println("Coluna 1: " + conversation.request("C1"));

Para escrever algo em uma célula, pode ser utilizado o método poke:

conversation.poke("R1C1", "Nova informação!");

Após ler ou escrever no arquivo, a conexão precisa ser fechada executando o comando close():

conversation.execute("[close()]");

Evitando assim qualquer problema.

Criando um ouvinte DDE em Java

Uma área que ainda faz muito uso do DDE são instituições financeiras que operam em bolsa de valores. Neste ambiente, segundos podem significar milhões de reais, então ter os dados o quanto antes faz muita diferença. Desta forma, com o DDE “traders” conseguem criar planilhas dinâmicas, para sempre ter dados atualizados e podem tomar as decisões mais acertivas.

Neste cenário, com as células de uma planilha podendo mudar a todo momento, podemos criar um ouvinte que será informado quando os dados forem alterados:

import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.client.DDEClientConversation;
import com.pretty_tools.dde.client.DDEClientEventListener;
import com.pretty_tools.dde.DDEMLException;

public class App 
{
    public static void main( String[] args )
    {
        try
        {
            final DDEClientConversation conversation = new DDEClientConversation();

            conversation.setEventListener(new DDEClientEventListener()
            {
                public void onDisconnect()
                {
                    System.out.println("onDisconnect()");
                }

                public void onItemChanged(String topic, String item, String data)
                {
                    System.out.println("onItemChanged(" + topic + "," + item + "," + data.trim() + ")");
                }
            });

            System.out.println("Connecting...");
            conversation.connect("Excel", "Planilha1");
            try
            {
                conversation.startAdvice("R1C1");

                System.out.println("Precione qualquer tecla para finalizar!");
                System.in.read();

                conversation.stopAdvice("R1C1");
            }
            finally
            {
                conversation.disconnect();
            }
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
            e.printStackTrace();
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

Note que a forma de conexão não muda, entretanto agora é definido um ouvinte:

conversation.setEventListener(new DDEClientEventListener()
{
    public void onDisconnect()
    {
        System.out.println("onDisconnect()");
    }

    public void onItemChanged(String topic, String item, String data)
    {
        System.out.println("onItemChanged(" + topic + "," + item + "," + data.trim() + ")");
    }
});

Que sempre será chamado quando a célula da linha 1 e coluna 1 for modificada:

 conversation.startAdvice("R1C1");

Criando o seu servidor DDE

PHP - Fundamentos
Curso de PHP - Fundamentos
CONHEÇA O CURSO

Caso deseje fornecer dados para outras aplicações via DDE, a biblioteca também permite a criação de um servidor. Para isso, basta estender a classe abstrata DDEServer:

import com.pretty_tools.dde.ClipboardFormat;
import com.pretty_tools.dde.DDEException;
import com.pretty_tools.dde.DDEMLException;
import com.pretty_tools.dde.server.DDEServer;

import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

public class App 
{
    private static final String SERVICE = "TreinaServer";
    private static final String TOPIC = "TopicoExemplo";
    private static final String MY_ADVISE_ITEM = "MeuAdvise";
    private static final String MY_REQUEST_ITEM = "MinhaRequisicao";
    private static final String MY_POKE_ITEM = "MeuPoke";
    private static final List<String> ITEMS = Arrays.asList(MY_ADVISE_ITEM, MY_REQUEST_ITEM, MY_POKE_ITEM);


    public static void main( String[] args )
    {
        try
        {
            // Evento para esperar pela disconexão
            final CountDownLatch eventStop = new CountDownLatch(1);
            final AtomicInteger num = new AtomicInteger(1);

            final DDEServer server = new DDEServer(SERVICE) {
                @Override
                protected boolean isTopicSupported(String topicName)
                {
                    return TOPIC.equalsIgnoreCase(topicName);
                }

                @Override
                protected boolean isItemSupported(String topic, String item, int uFmt)
                {
                    return isTopicSupported(topic)
                           && ITEMS.contains(item)
                           && (uFmt == ClipboardFormat.CF_TEXT.getNativeCode() || uFmt == ClipboardFormat.CF_UNICODETEXT.getNativeCode());
                }

                @Override
                protected boolean onExecute(String command)
                {
                    System.out.println("onExecute(" + command + ")");

                    if ("stop".equalsIgnoreCase(command))
                        eventStop.countDown();

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, String data)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ")");

                    return true;
                }

                @Override
                protected boolean onPoke(String topic, String item, byte[] data, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + data + ", " + uFmt + ")");

                    return false; // Não suportado
                }

                @Override
                protected String onRequest(String topic, String item)
                {
                    System.out.println("onRequest(" + topic + ", " + item + ")");

                    return item + " data " + num;
                }

                @Override
                protected byte[] onRequest(String topic, String item, int uFmt)
                {
                    System.out.println("onPoke(" + topic + ", " + item + ", " + uFmt + ")");

                    return null; // Não suportado
                }
            };

            System.out.println("Iniciando...");
            server.start();

            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run()
                {
                    num.incrementAndGet();
                    try {
                        System.out.println("Notificando clientes");
                        server.notifyClients(TOPIC, MY_ADVISE_ITEM);
                    } catch (DDEException e) {
                        System.out.println("DDEClientException: " + e.getMessage());
                        cancel();
                    }
                }
            }, 1000L, 500L);

            System.out.println("Esperando para parar...");
            eventStop.await();
            System.out.println("Parando...");
            timer.cancel();
            server.stop();
            System.out.println("Finalizando");
        }
        catch (DDEMLException e)
        {
            System.out.println("DDEMLException: 0x" + Integer.toHexString(e.getErrorCode())
                            + " " + e.getMessage());
            e.printStackTrace();
        }
        catch (DDEException e)
        {
            System.out.println("DDEException: " + e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

Note que a classe DDEServer requer a implementação de métodos que serão executados quando o cliente solicitar um dado (onRequest) e quando ele requerer uma atualização (onPoke). A implementação de cada método irá depender das regras de negócio da aplicação.

O servidor acima pode ser testado utilizando os exemplos anteriores, bastando informar os dados de conexão dele:

conversation.connect("TreinaServer", "TopicoExemplo");

Mesmo ainda estando funcional, o DDE só deve ser utilizado quando não for fornecida outras formas de comunicação. Atualmente existem várias opções de comunicação entre aplicações mais seguras que o DDE.

Por hoje é só. Até a próxima!