MVC Com Java e Desktop

Embed Size (px)

DESCRIPTION

MVC Com Java e Desktop

Citation preview

MVC com Java e desktopPublicado em 09/07/2012IntroduoNesse artigo iremos abordar um padro de projeto muito interessante, oMVC(Model, View, Controller). Quem nunca criou um "sistema-linguia", aquele que tem meia duzia de arquivos e cada arquivo faz tudo, processa, acessa banco, mostra resultados na tela e estoura pipoca, que atire a primeira pedra! muito comum fazermos esse tipo de programao quando estamos comeando a desenvolver, geralmente so classes Bom-Bril, mil e uma utilidades, todas amarradas com scripts SQL misturados com tomadas de decises e apresentaes grficas, um caos na hora de dar manuteno, parece um castelo de cartas. Tudo bem, e o que o MVC tem a ver com isso? O qu? Eu te explico!Segundo Erich Gamma,"A abordagem MVC separa Viso e Modelos pelo estabelecimento de um protocolo do tipo insero/notificao (subscribe/notify) entre eles. Uma viso deve garantir que a sua aparncia reflita o estado do modelo"O padro MVC coloca ordem nisso tudo, estipulando regras de separao do cdigo de acordo com as funcionalidades, distribuindo aaplicao em camadase fazendo com que elas sejam o mais independente possvel umas das outras.Exemplo modularPor exemplo, voc pode fazer uma aplicao que se baseia em: receber um valor, processar e retornar uma resposta, sem salvar nada em banco de dados nem exibir graficamente. Agora imagine que voc resolva acoplar a esse sistema um modulo que salve no banco de dados o resultado do processo e depois outro mdulo para exibir o resultado com interface grfica. Se isso no for bem estruturado, pode lhe dar uma tremenda dor de cabea para implementar e outra maior ainda para dar manuteno.Analogia com o mundo realUma analogia do MVC com o mundo real poderia ser o funcionamento de um carro. No carro temos o motor que faz o processo principal, gerar fora mecanica. Temos tambm os pedais e cmbio de marchas. Alm disso, temos o painel de controle do carro que exibe informaes de como est o seu funcionamento, como temperatura, presso do leo e medidor de rotao do motor.Colocando o exemplo do carro no padro MVC temos a seguinte estrutura:O motor do carro certamente a camadamodel, pois se trata do ncleo da aplicao (carro), exercendo o maior trabalho. Os pedais, cambio e painel fazem parte da camadaview, embora o painel seja diferente dos pedais e cmbio j que responsvel em exibir dados e os outros em colher dados (interao com o usurio).Agora imagine, j temos o motor e os elementos de interao com o usurio mas est faltando algo. Se no houvesse nada entre esses elementos e o motor, nada aconteceria, voc poderia pisar o quanto quisesse no acelerador, trocar qualquer marcha que nada aconteceria, o painel seria apenas um monte de ponteiros e luzes que no funcionariam para nada. nesse ponto que entra a camada decontroller. Essa camada corresponderia aos sensores de temperatura, de rotao do motor e de presso do leo do motor, responsaveis em fazer a interao entre a camadamodele aview, fazendo com que a presso exercida nos pedais interfira no funcionamento do motor e que o painel mostre o estado do motor.Estrutura MVCA estrutura bsica do MVC a seguinte: Model Value Object Business Object Data Access Object View Controller

Esquema MVC

Se voc encontrar outras estrutura MVC's diferentes mundo a fora, no se assuste, afinal de contas futebol, religio e MVC so difceis de se encontrar o melhor e o pior.Na prxima parte do artigo iremos por a mo na massa e desenvolver um "pequeno" sistema que ir usar todas as camadas faladas aqui, alm de explicar a fundo a camadamodele suas integrantes.Camada modelExplicado todos esses conceitos, vamos agora falar da principal camada da aplicacao, a camadamodel. Como vimos anteriormente, ela dividida em trs tipos de classes, AsValue Objects,Business ObjecteData Access Object. Sua funo prover todas as funcionalidades do software independente de interao com o usurio ou parte grfica.Value Objects (VO)Os objetos de valores (Values Objects) so classes que contm variveis e metodos de acessos, alm de construtores. Um exemplo desse tipo de classe seria assim:01packagebr.com.gqferreira;

02publicclassPessoa {

03//Variaveis

04privateString cpf;

05privateString nome;

06

07//Construtor

08publicPessoa(String cpf, String nome) {

09this.cpf = cpf;

10this.nome = nome;

11}

12

13//Get and Set

14publicString getCpf() {

15returncpf;

16}

17

18publicvoidsetCpf(String cpf) {

19this.cpf = cpf;

20}

21

22publicString getNome() {

23returnnome;

24}

25

26publicvoidsetNome(String nome) {

27this.nome = nome;

28}

29}

Objetos de valor tem a funo de modelar uma entidade, uma abstrao do mundo real. Por exemplo a classe pessoa, precisa conter todos os atributos que lhe interessar a respeito de uma pessoa. Esse tipo de classe muito utilizado para representar uma tabela do banco de dados, por exemplo, se voc tiver uma tabela de cliente, precisar de uma classe desse tipo com os mesmos atributos que contm na tabela do banco de dados. muito mais organizado e reutilizvel trafegar todos os atributosencapsuladosdentro de um objeto do que passar uma "enchorrada" de variveis de um canto ao outro.Os metodos de acesso (Get and Set) servem para garantir uma flexibilidade na hora de impor alguma regra no acesso aos atributos, embora voctalvznunca utilize-os. Por exemplo, digamos que hoje o mtodogetNome()apenas retorne o valor da varivel nome e exibido na tela. Derrepente voc decidiu que todo mundo ter o ttulo de Sr. e quer implementar essa regra, basta ir ao mtodogetNome()e mudar o retorno assim:1publicString getNome() {

2return"Sr. "+nome;

3}

Pronto, voc acaba de impor uma regra no acesso ao atributo nome e poder fazer isso em qualquer outro mtodo.Voc pode dar o nome que quiser para seus mtodos de acesso atributos, poderia serobtemNome()edefineNome()que iria funcionar do mesmo jeito, porm existe uma padronizao em utilizar os prefixosgeteset.Com o uso do construtor fica mais "elegante" criar um objeto, por exemplo, em qualquer lugar que precisar de uma instncia dePessoa, basta fazer assim:1Pessoa p =newPessoa("430.376.565-14","Joaquim da silva");

Dessa forma voc ter um objeto da classePessoacom todos os atributos j com valores definidos e poder acess-los a qualquer momento a partir dos metodos de acesso.1Pessoa p =newPessoa("430.376.565-14","Joaquim da silva");

2System.out.println(p.getNome());

Isso imprimiria no console o nome da pessoa.Data Access Object (DAO)As classes do tipo DAO so encarregadas de fazer oacesso dados, seja eles em um fluxo de rede, arquivo ou banco de dados. Por exemplo, mtodos responsveis em fazer acesso ao banco de dados devem estar nesse tipo de classe, assim como mtodos que manipulam arquivos ou que enviam e recebem dados pela rede. Lembre-se,entrada e sada de dados!Business Object (BO)Esse tipo de classe tambm compem amodelda aplicao, assim como os dois tipos de classe ditos anteriormente. A especialidade das classes BO's resolver operaes complexas, so os processos principais da aplicao, digamos que o "miolo" do software. Nessas classes so processadas regras de negcio e tomadas de deciso.

Outro projeto

Java - Criando uma aplicao em 3 camadas (MVC)

O passo a passo para a criao de uma aplicao usando Java, com Banco de Dados (BD) chamado H2 na estrutura MVC (Modelo, Viso e Controle).Ser um exemplo com uma nica classe sendo armazenada no BD.

Para os cdigos que seguem abaixo, em todas as classes deve-se incluir opackagecorreto e adicionar osimportsnecessrios. Observe a diviso abaixo:

1 - gui (Viso) - LoginGUI - ApiculturaGUI - ClienteGUI - controller (Controle) - ApiculturaController - IncluirClienteController - persistncia (Modelo) - ClienteDAO - FactoryConnection - dominio (Modelo) - Cliente

A primeira classe contm o famosopsvm(public static void main), que inicia a execuo da aplicao:

1public class Apicultura { public static void main(String[] args) { ApiculturaController app = new ApiculturaController(); }}

A classe ApiculturaController.java controla a janela de Login e a que contm o Menu.Se o usurio acertar a senha, que nica, a janela com menu ser apresentada, caso contrrio a aplicao finalizada.So instanciadas as classes com a interface grfica e aqui so tratados os eventos.

1public class ApiculturaController { private ApiculturaGUI gui = null; private LoginGUI guiLog = null; public ApiculturaController() { guiLog = new LoginGUI(); guiLog.adicionarOuvinteLogin (new OuvinteLogin()); } class OuvinteLogin implements ActionListener { public void actionPerformed (ActionEvent ev){ if (ev.getActionCommand() == "OK") { String senha = String.valueOf(guiLog.pfSenha.getPassword()); if (senha.compareTo("SENHA")==0) { guiLog.dispose(); // fecha a janela de login gui = new ApiculturaGUI(); gui.adicionarOuvinte(new OuvinteIncluir()); } else { JOptionPane.showMessageDialog(null, "Senha Invlida!"); System.exit(0); } } else System.exit(0); } }

class OuvinteIncluir implements ActionListener { public void actionPerformed (ActionEvent ev) { Object fonte = ev.getSource(); if (ev.getSource() instanceof JMenuItem) { if (fonte == gui.mcSair) { System.exit (0); } else if (fonte == gui.mcCadastro) { IncluirClienteController clienteController = new IncluirClienteController(); gui.desktop.add(clienteController.guiCli); } } } }}

A classe LoginGUI.java deve conter os componentes em seu mtodo construtor e a adio dos eventos, que so tratados na classe de controle (ApiculturaController.java).

1public class LoginGUI extends JFrame { // declarar os componentes aqui como public

public LoginGUI() { // tratar a parte grfica aqui } public void adicionarOuvinteLogin (ActionListener ouvinte) { this.btOK.addActionListener(ouvinte); this.btCancelar.addActionListener(ouvinte); }}

Um exemplo para a interface grfica de Login a seguinte:

A classe ApiculturaGUI.java a que contm o menu, usando as classes DesktopPane e JInternalFrame. Observe a implementao:

1public class ApiculturaGUI extends JFrame { public JDesktopPane desktop; public JMenuBar barraDeMenu; public JMenuItem mcCadastro, mpCadastro, mcSair, miSobre; public ApiculturaGUI() { this.setTitle("Sistema de Controle de Produo Apcula"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

barraDeMenu = criaMenu(); this.setJMenuBar(barraDeMenu);

desktop = new JDesktopPane(); this.setContentPane(desktop); this.setVisible(true); } public JMenuBar criaMenu() { // crie seu menu com os componentes JMenu, JMenuBar e JMenuItem } public void adicionarOuvinte (ActionListener ouvinte) { this.mcCadastro.addActionListener(ouvinte); this.mcSair.addActionListener(ouvinte); }}

Como aconteceu na classe LoginGUI.java, a classe ApiculturaGUI deve conter os componentes para a criao do menu em seu mtodo construtor e a adio dos eventos, que so tratados na classe de controle (ApiculturaController.java).

Veja como fica o Front-end da aplicao:

Observe que o JPanel contm uma imagem de fundo. Para maiores detalhes, acesse a explicaoclicando aqui.

A prxima classe a IncluirClienteController.java que chama a interface grfica para a classe Cliente e trata os eventos que sero adicionados pela classe ClienteGUI.java.

1public class IncluirClienteController { public ClienteGUI guiCli; public IncluirClienteController() { guiCli = new ClienteGUI(); guiCli.adicionarOuvinteCliente1 (new OuvinteIncluirCliente1()); } class OuvinteIncluirCliente1 implements ActionListener { public void actionPerformed(ActionEvent ev){ Object fonte = ev.getSource(); if (fonte == guiCli.bSaiCli) guiCli.dispose(); else if (fonte == guiCli.bLimCli) guiCli.limparCampos(); else if (fonte == guiCli.bExcCli) { ClienteDAO clienteDAO = new ClienteDAO(); clienteDAO.excluirCliente(guiCli.tfcodcli.getText()); guiCli.limparCampos(); } else if (fonte == guiCli.bConCli) { ClienteDAO clienteDAO = new ClienteDAO(); Cliente cliente = clienteDAO.consultarCliente(); if (cliente != null) mostrarCliente(cliente); } else if (fonte == guiCli.bIncCli) { ClienteDAO clienteDAO = new ClienteDAO(); Cliente cliente = obterCliente(); clienteDAO.incluirCliente(cliente); guiCli.limparCampos(); } else if (fonte == guiCli.bAltCli) ClienteDAO clienteDAO = new ClienteDAO(); Cliente cliente = obterCliente(); clienteDAO.alterarCliente(cliente); } } } }

public Cliente obterCliente(){ Cliente cliente = new Cliente(); // Aqui deve-se obter todos os dados contidos nos componentes // e preencher o objeto cliente. // Exemplo: cliente.setNomCli(guiCli.tfnomcli.getText()); return cliente; }

public void mostrarCliente(Cliente cliente){ // Aqui deve-se obter todos os dados contidos no objeto cliente // e preencher os componentes da interface grfica // Exemplo: guiCli.tfnomcli.setText(cliente.getNomCli()); }}

A classe ClienteGUI.java contm apresentao da interface grfica para tratar os dados do Cliente.Veja o exemplo:

Veja o trecho do cdigo:

1public class ClienteGUI extends JInternalFrame { // declarar os componentes da interface

public ClienteGUI() { // criar a interface grfica }

public void adicionarOuvinteCliente1 (ActionListener ouvinte) { // adicionar os ouvintes aos botes // Ex.: this.bIncCli.addActionListener(ouvinte); }

public void limparCampos() { // comandos para limpar os componentes }}

O menu est no JDesktopPane e as demais janelas sero JInternalFrame.

A classe que controla Cliente (IncluirClienteController.java) tambm precisa da classe Cliente.java que tem a definio dos atributos e dos mtodos acessores (get) e modificadores (set).Veja parte do cdigo:

1public class Cliente { // declare todos os atributos como private private int codcli; private String nomcli;

public Cliente() { super(); }

public Cliente (int codcli, String nomcli){ super(); this.codcli = codcli; this.nomcli = nomcli; } public int getCodCli(){ return this.codcli; } public String getNomCli(){ return this.nomcli; }

public void setCodCli(int codcli) { this.codcli = codcli; } public void setNomCli(String nomcli) { this.nomcli = nomcli; }}

A classe ClienteDAO.java (Data Access Object) trata das rotinas de incluso, excluso, alterao e consulta, ou seja, trabalha diretamente com a fonte de dados (o BD). Todos os seus mtodos realizaro a conexo com o Banco de Dados, sendo assim, precisam instanciar um objeto da classe FactoryConnection.java.Ex.: Connection con = FactoryConnection.getConnection();

1public class ClienteDAO { public void incluirCliente(Cliente cliente) { // tratar incluso } public Cliente consultarCliente() { // tratar consulta return cliente; } public void alterarCliente(Cliente cliente) { // tratar alterao }

public void excluirCliente(String strcod) { // tratar excluso }}

Para maiores detalhes,clique aquie acesse o Frum Programao Java - Dicas que contm detalhes da classe ClienteDAO.

A classe FactoryConnection apresenta a conexo com o Banco de Dados, que neste exemplo ser o H2.

1public class FactoryConnection { public static Connection getConnection(){ Connection con = null; try { Class.forName("org.h2.Driver"); String url = "jdbc:h2:tcp://localhost:9092/C:/DB/Banco"; String user = "admin"; String password = "senha"; con = DriverManager.getConnection(url, user, password); } catch (Exception e){ e.printStackTrace(); } return con; }}

Trabalhando dessa forma, suas classes ficam menores e bem dividas por assunto!O cdigos foram didaticamente apresentados! Portanto, use sua criatividade e melhore-os!