Projeto Java Desktop com Maven 4º Post

Olá,

Projetinho parado há algum tempo devido a falta de tempo, mais vamos dar sequência para concluir.

Pra inicio, criei um JFrame dando o nome de Principal.

Como o nome já diz, esta será nossa tela principal do sistema, ela que será aberta quando nosso sistema for inicializado.

Para ela não irei fazer nada muito difícil, inseri somente uma barra de menu com dois itens.

Ficando da seguinte forma.

Image

Para a opção Estado do menu, criei um JDialog dando o nome de EstadoForm.

Para ele também nada excepcional, dois campos de texto e um menu com as opções novo, salvar, editar e excluir.

Resumindo nosso formulário ficou da seguinte forma.

Image

Como todos sabem Java é uma linguagem que trabalha com Orientação a Objetos.

Pensando toda nossa tela se torna um objeto assim como cada item da nossa tela também se torna um objeto.

Por enquanto vamos pensar em nossos botões e por sinal temos quatro.

Se cada botão é um objeto, significa que cada um terá um comportamento.

Ps.: Se você pensou que nem todo objeto tem um comportamento, acredite ficar parado sem fazer nada por incrível que pareça é um comportamento.

Em Java, comportamentos são implementados criando-se métodos.

Passo inicial seria pensarmos nas ações que devem ocorrer quando ocorrer um click no botão Novo.

Primeiro passo seria habilitar os campos para preencher e já vamos garantir que estes campos estejam limpos para que nosso usuário preencha com os dados que quiser.

Vamos criar dois métodos separados para executar esta ação.

Se você pensou por que dois métodos separados a explicação mais simples para isto seria a seguinte.

Como estamos utilizando componentes Swing, tais componentes possuem nativos a implementação de um Listener (ouvinte) para eventos, ou seja, um click, o apertar uma tecla, etc.

Para este caso estaremos criando um evento para o click no botão que criamos.

Para fazer isto, click com botão direito do mouse sobre nosso botão > action > actionPerformed.

A ferramenta irá gerar o seguinte método.

private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {  }

Nosso trabalho agora será implementar o comportamento desde método, uma vez que quando o usuário efetuar um click em nosso botão, o Listener saberá que é este método que deve ser executado.

Voltando agora na parte em que disse que criaríamos dois métodos separados para cara ação.

Para as duas ações em específicas que seria habilitar e limpar, e tais ações são bem genéricos e podem ser reutilizadas pra vários outros botões, então dentro dos métodos que indicará qual será a ação de nosso botão, apenas incluímos a chamada para nossos dois métodos, ficando da seguinte forma.

private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {

habilitar(true);

limpar();

//demais métodos

}

Como o foco deste post é somente fazer um exemplo bem simples dando os conceitos básicos para quem esta iniciando com Java encerro por aqui.

Abraço e até mais.

O projeto completo ficará disponível no Git Hub.

Projeto Java Desktop com Maven 3º Post

Olá galera,

Para este post estarei criando nossas entidades para damos inicio a parte legal do projeto.

Bom como disse é sistema vai ser algo bem simples e por se tratar de algo que servirá de estudos para iniciantes em programação vamos fazer um cadastro de cidades e estados.

Particularmente não faço este tipo de cadastro em nenhum de meus sistemas, deixar com que o usuário efetue tal tipo de cadastro pode gerar inconsistência no banco de dados, pois, damos ao o usuário o poder de cadastrar cidades e estados que não existem, além de cidades em estados errados. Exemplo claro, o usuário por engano cadastrar Porto Alegre no estado de São Paulo, isto seria um problema e tanto não dando nenhuma credibilidade a informações que nosso sistema fornecerá. Neste caso prefiro inserir cidades e estados diretamente no banco evitando este tipo de problema. Pense pelo seguinte é muito difícil surgir estados e cidades novas do dia pra noite e caso surgir, não é nada fora do comum inserir diretamente no banco um estado e cidade nova. Lembrando opinião particular todo caso gera exceções, por isso analisem bem sua regra de negocio antes de sair criando classes e programando.

Dando sequencia e começando pela entidade estado.

No pacote br.com.meuprimeroprojeto.modelo, vamos criar uma nova classe Java e dar nome a ela de Estado.

Primeiro passo e o mais importante, definir os atributos que nosso estado irá ter. No nosso caso, nome e sigla ficando conforme abaixo.


package br.com.meuprimeiroprojeto.modelo;

/**
*
* @author Fernado
*/

public class Estado {
private Long idEstado;
private String nome;
private String sigla;
}

Feito isso criaremos uma nova classe Java e daremos o nome a ela de Cidade. No caso, somente o nome, porém aqui entra uma coisa interessante. Java é uma linguagem orientada a objetos, para quem não intende orientação a objetos lei este POST, acredito que irá ajudar. Neste caso já possuímos um objeto Estado e se formos pensar, toda cidade fica dentro de um Estado certo?

Neste caso nossa classe cidade ficará da seguinte forma.

package br.com.meuprimeiroprojeto.modelo;

/**
*
* @author Fernado
*/

public class Cidade {
private Long idCidade;
private String nome;
private Estado estado;
}

Bem como o post não ficou extenso vamos fazer o mapeamento objeto relacional das classes pra que o Hibernate crie as tabelas de nosso banco de dados.

Para fazer o mapeamento usaremos algumas Annotations.

Vamos lá:

@Entity: Informa que a classe mapeada é persistente

@Id: Definição de chave primária.

@GeneratedValue: Permite a geração de forma automática para o valor identificador baseados nos mecanismos de geração automática que existem no Hibernate. @GeneratedValue(strategy=”GenerationType.IDENTITY”)  Para este estou utilizando o mecanismo de geranção IDENTITY que é utilizada pra criar colunas identidades na maioria dos bancos de dados, porém existem outros, como SEQUENCE, INCREMENT, AUTO e TABLE, basta escolher o que melhor se aplica ao seu caso.

@ManyToOne: Informa a cardinalidade de muitos para um ao banco de dados. Para mapearmos quando inserimos um objeto dentro de outro é necessário que se informe tal Annotation. Em nosso caso, temos um objeto Estado dentro do objeto Cidade, ao se utilizá-la estamos informando que existem muitas Cidades dentro de um Estado.

Obs: Fiz um breve comentário sobre as Annotations utilizadas neste post, caso queira saber mais recomendo pesquisar algo, existem deversas annotations criadas para facilitar o mapeamento objeto relacional entre outras coisas.

Feito isso basta irmos ao HibernateUtility que se no pacote útil e informar as classes que queremos que o Hibenate mapie para nós deixando o arquivo conforme abaixo.


package br.com.meuprimeiroprojeto.util;

import br.com.meuprimeiroprojeto.modelo.Cidade;
import br.com.meuprimeiroprojeto.modelo.Estado;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {

private static final SessionFactory factory;
private static final ThreadLocal sessionThread = new ThreadLocal();
private static final ThreadLocal transactionThread = new ThreadLocal();

public static Session getSession() {
Session session = (Session) sessionThread.get();
if ((session == null) || (!(session.isOpen()))) {
session = factory.openSession();
sessionThread.set(session);
}
return ((Session) sessionThread.get());
}

public static void closeSession() {
Session session = (Session) sessionThread.get();
if ((session != null) && (session.isOpen())) {
sessionThread.set(null);
session.close();
}
}

public static void beginTransaction() {
Transaction transaction = getSession().beginTransaction();
transactionThread.set(transaction);
}

public static void commitTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ((transaction != null) && (!(transaction.wasCommitted())) && (!(transaction.wasRolledBack()))) {
transaction.commit();
transactionThread.set(null);
}
}

public static void rollbackTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ((transaction != null) && (!(transaction.wasCommitted())) && (!(transaction.wasRolledBack()))) {
transaction.rollback();
transactionThread.set(null);
}
}

static {
try {
factory = new Configuration()
/***POSTGRESQL***/
//                    .setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect")
//                    .setProperty("hibernate.connection.driver_class", "org.postgresql.Driver")
//                    .setProperty("hibernate.connection.url", "jdbc:postgresql://localhost/meuprimeiroprojeto")
//                    .setProperty("hibernate.connection.username", "postgres")
//                    .setProperty("hibernate.connection.password", "postgres")
/***MYSQL***/
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
//CONFIGURAÇÃO DA BASE DE DADOS ** Verificar sempre Username e Password caso necessario alterar.
.setProperty("hibernate.connection.url", "jdbc:mysql://localhost/meuprimeiroprojeto")
.setProperty("hibernate.connection.username", "root")
.setProperty("hibernate.connection.password", "root")

//                    .setProperty("hibernate.connection.datasource", "jdbc/dbSGC") //data source (so pra aplicacao web e tem q configurar no tomcat)
.setProperty("hibernate.hbm2ddl.auto", "update")
.setProperty("hibernate.c3p0.max_size", "10")
.setProperty("hibernate.c3p0.min_size", "2")
.setProperty("hibernate.c3p0.timeout", "5000")
.setProperty("hibernate.c3p0.max_statements", "10")
.setProperty("hibernate.c3p0.idle_test_period", "3000")
.setProperty("hibernate.c3p0.acquire_increment", "2")
.setProperty("show_sql", "true")
.setProperty("use_outer_join", "true")
.setProperty("hibernate.generate_statistics", "true")
.setProperty("hibernate.use_sql_comments", "true")
.setProperty("hibernate.format_sql", "true")
//CLASSES PARA MAPEAMENTO
.addAnnotatedClass(Cidade.class)
.addAnnotatedClass(Estado.class)

.buildSessionFactory();
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
}

public static void main(String [] args) {

}

}

Ao termino temos nossas classes com as devidas annotations ficarma da seguinte forma:

Classe Estado


package br.com.meuprimeiroprojeto.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
*
* @author Fernado
*/
@Entity
public class Estado {

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long idEstado;
private String nome;
private String sigla;

//GETTERS E  SETTERS OMITIDOS

}
<pre>

Classe Cidade


package br.com.meuprimeiroprojeto.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

/**
*
* @author Fernado
*/
@Entity
public class Cidade {

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long idCidade;
private String nome;
@ManyToOne
private Estado estado;

//GETTERS E  SETTERS OMITIDOS
}

Para concluir, basta abrir MySQL e criarmos um novo schema dando a ele o nome dele de meuprimeiroprojeto.

Com isso termino por aqui e até o próximo post.

Fiz algumas alterações no arquivo POM.xml estarei deixando disponivel o código no GITHUB

Projeto Java Desktop com Maven

Para este post estarei iniciando um projeto de aplicação desktop utilizando o Netbeans, Hibernate e o Maven.

Estarei utilizando neste projeto o padrão de persistência DAO (Data Access Object) por se tratar de algo bem simples. Ao término deste começarei um novo projeto utilizando EntityMannager e SpringFramework algo mais elegante.

Bom por que utilizar o Maven ?

O Maven é um framework que considero muito interessante, ele irá nos proporcionar um certo conforto no desenvolvimento do projeto, uma vez que ele será o responsável por gerenciar nossas dependências, e consequentemente nosso projeto inteiro. Como ele faz isso acho que ficará mais claro no andamento do projeto.
Para iniciar devemos primeiramente configurar o Maven em nossa máquina e no NetBeans, para isso recomendo ler o post do meu amigo Thiago Marques que explica passo a passo como fazer isso.

Próximo passo agora é a criação do projeto no netbeans.
Quem desenvolve projetos desktop está acostumado a criar um projeto simples, porém para utilizar o Maven temos uma pequena diferença.
No menu vamos em Arquivo > Novo Projeto.  Ou pelo atalho CTRL+SHIFT+N.
Iremos selecionar em categorias a opção MAVEN e em Projeto APLICATIVO JAVA.

Ficando como na figura abaixo.

Na próxima tela inserimos algumas informações de nosso projeto ficando da seguinte forma.

Para este projeto, por se tratar de algo bem simples estas informações acima não são de muita importância, mais para projetos futuros que envolvem um pouco mais de complexidade explicarei a importância de tais informações. Já de inicio digo que tais informações estarão incluídas no arquivo POM.xml que é nosso arquivo de configuração do Maven.

Terminado a estrutura de nosso projeto deverá ficar desta forma

Iremos excluir o pacote com.MeuPrimeroProjeto  existente no diretório Pacotes de códigos fonte e Pacote de teste, deixando nosso projeto da seguinte forma.

Ao término teremos nossa estrutura da seguinte forma:
Pacote de códigos-fonte – Onde serão inseridos os pacotes de nosso projeto, classes, interfaces e formulários e etc.
Pacote de testes – Caso utilize testes automatizados tudo relacionado a isso deve ser incluído neste pacote.
Dependências – Onde serão inseridas as bibliotecas do projeto.
Testar Dependências – Onde serão inseridas as bibliotecas de testes caso seja feitos testes automatizados.
Arquivos do Projeto – Onde fica o POM.xml que é nosso arquivo de configuração do Maven, nele serão declaradas nossas dependências do projeto, plugins para compilação e tudo mais. Entrarei em mais detalhes nos próximos posts.

Com isso termino por aqui este primeiro post de inicialização do nosso projeto, para o próximo post iniciarei a criação das classes formulários e interfaces, lembrando que disponibilizarei no GITHUB todo o código quer for gerado neste projeto.
Até mais.

TCC – Ferramentas e Frameworks

Neste post estarei falando um pouco sobre as ferramentas e frameworks escolhidos para o desenvolvimento deste trabalho.

A princípio, na segunda etapa deste trabalho foi feito o levantamento de requisitos. Nesta etapa diversos requisitos não funcionais foram analisados, entre estes requisitos estão quais ferramentas deveriam ser utilizadas para o desenvolvimento deste software.

Por se tratar de um software para desktop em que uma pequena parte será desenvolvida para web, diversos nomes de ferramentas foram listados, sendo elas: IDEs, banco de dados, frameworks, ferramentas de modelagem entre outros.

De inicio, diversas delas chamam atenção de todo desenvolvedor por apresentar uma inteface bonita, parecer de fácil implementação ou até mesmo por que alguém falou muito bem de tal ferramenta. Como todo mundo sabe, nem tudo é o que parece ser, algumas vezes escolher uma ferramenta sem conhece-la pode se torna um problema e por isso existe o estudo de viabilidade.

No estudo de viabilidade estas ferramentas listadas precisam ser bem estudas, pois pode-se comprometer todo um projeto simplesmente por ter feito a escolha da ferramenta errada. Outro requisito que deve ser levado em consideração é a escolha de ferramentas que necessitam a aquisição de licenças para uso.

Atualmente no mercado podemos encontrar diversas ferramentas gratuitas, com um poder igual ou até mesmo superior ao de ferramentas pagas, oferecendo mais agilidade se aplicadas de maneira correta e na área certa. Com esta afirmação não estou defendendo que todos os projetos devam utilizar ferramentas gratuitas. Cada projeto possui suas características e em alguns casos é inevitável que seja necessária aquisição ferramentas especificas. A ideia é escolher a melhor ferramenta sendo ela paga ou gratuita, levando-se em consideração a complexidade do software que se esta desenvolvendo. Caso seja necessária uma ferramenta paga, de alguma forma alguém terá que pagar pela licença, portanto cuidado com este requisito, pois é necessário que se tenha uma atenção especial, se esta parte passa sem analise pode-se encarecer o projeto e o tornar inviável financeiramente.

Bom, se você nunca pensou em nada disso antes de um projeto espero ter levantado uma duvida. Neste caso, como escolher a melhor ferramenta?

Muitos requisitos devem ser levados em consideração, dentre eles, verifique se esta ferramenta possui fóruns ativos na internet, uma vez que em todo projeto chega-se a um momento em que se encontra um problema para a implementação de algum método, e é nestes fóruns que se vai encontrar a ajuda necessária para se solucionar tal problema. Verifique a quantidade de profissionais que utilizam a ferramenta e analise qual a opinião deles sobre tal ferramenta, e o principal, a que área aplicar e como aplicar o uso tal ferramenta no projeto. Pode-se perdem tempo analisando estas informações? Sim, porém é um tempo necessário, para que seu projeto seja bem executado e não tire suas horas de sono.

Para o meu projeto foram escolhidas algumas ferramentas que achei interessantes. Confesso que algumas delas ainda estou aprendendo como é seu funcionamento, e escolhi por motivos próprios por não se tratar de uma aplicação o comercial e sim de um trabalho de conclusão de curso. Neste caso testar algumas ferramentas e frameworks novos se torna interessante, uma vez que entre estas que escolhi,  existem algumas que estão em alta no mercado, e um profissional que esta se formando agora como eu, precisa de um conhecimento amplo para se preparar para o mercado de trabalho. Vou da uma breve descrição de algumas ferramentas que estarei utilizando neste projeto.

Ferramentas aplicadas neste projeto nas áreas Desktop e Web.

Apache Maven: Apache Maven ou simplesmente Maven esta atualmente na sua versão 3,  é uma ferramenta de automação de projetos em Java. Desenvolvido em cima da ferramenta Ant, o Maven se tornou uma ferramenta bastante utilizada por sua configuração serem mais simples, uma vez que sua configuração é baseada em XML. Por se tratar de uma ferramenta de automação de projeto, ele é quem descreve todo o processo de construção de um software. O Maven gerencia as dependências de um projeto, seus módulos e componentes e sequencia de construção através de uma estrutura conhecida como POM (Project Object Model).  Uma característica marcante do Maven é a possibilidade de trabalhar em rede onde seu núcleo pode baixar as dependências diretamente de um repositório.

Mais informações:  http://maven.apache.org/

Subverison: O Subversion é uma ferramenta de controle de versão, ou seja, ele gerencia arquivos e diretórios salvando todas as modificações feitas no projeto com o tempo. Com isso pode se recuperar versões mais antigas do projeto ou examinar o histórico de alterações. O Subversion pode funcionar em rede, com isso permite-se que varias pessoas trabalhem no mesmo projeto estando em computadores diferentes. Em grandes projetos ganha se em produtividade, pois e sempre que um profissional envolvido termine determinada tarefa, pode submetê-la e outro profissional que ao atualizar seu projeto estará com a versão atualiza em sua maquina.

Mais informações:  http://svnbook-pt-br.googlecode.com/svn/snapshots/1.4/svn.intro.whatis.html

Hibernate: O Hibernate é um framework para mapeamento objeto-relacional que tem como objetivo diminuir a complexidade entre programas Java que utilizam o modelo de programação orientada a objetos e banco de dados modelo objeto relacional.  Sua principal característica e transformar classes em Java em tabelas de banco de dados, além de gerar todo o SQL da aplicação liberando o programador desta tarefa.

Mais Informações: http://www.hibernate.org/

Ferramentas para Web:

Spring: Spring é um framework que trabalha com Inversão de Controle e Injeção de Dependência. Possui sua arquitetura baseada em POJOS (Plain Old Java Object) e oferece a eles a eles a possibilidade de alcançar coisas que somente eram possíveis com EJBs.  No Spring o container se encarrega de instanciar as classes e definir quais são suas dependências através de um arquivo de configuração no formato XML permitindo o baixo acoplamento entre classes.

Spring Security: O Spring Security trabalha com segurança baseada em roles. Com isso não é necessário chamar nenhum método para realizar autenticação ou autorização de acesso a usuários em um sistema. Com os roles definidos informamos a aplicação quais recursos podem ser acessados por um usuário que acessou uma área restrita.

Mais informações:  http://www.springsource.org/

JSF: Sobre o Java Server Faces (JSF) não falarei aqui para que o post não fique muito extenso. Fiz um post sobre JSF há algum tempo, então segue o link  Fernando Godoy – JSF.

PrimeFaces: O Primefaces é uma biblioteca de componentes de código aberto para JSF e citada por muitos como uma das melhores bibliotecas do mercado, possuindo cerca de 100 componentes.

Mais informações: http://www.primefaces.org/

Estas são as ferramenta mais interessantes e que estarei utilizando, dentre outras tenho o Astah, Ireport, DbDesigner, DbWrenchapp, PostGreSQL que será meu banco de dados e o NetBeans que será minha IDE.

Estas são algumas das ferramentas e frameworks escolhidas, postei junto com cada descrição o link que contem mais informações caso interesse a mais alguém. Não me aprofundei muito nas explicações para o post não ficar muito extenso, mais sem duvida vale a pena estudar cada uma delas.

Em breve estarei postando códigos e tutorias de configuração de cada uma das ferramentas listadas acima.

Espero que gostem e até o próximo.