| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 19:13:48
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
Boa tarde pessoal,
Estou começando em Java e quebrando a cabeça pra entender onde colocar cada coisa, considerando uma abordagem MVC.
Sendo assim, suponha que seja requerida uma interface com o usuário com botões de navegação do tipo "Primeiro", "Próximo", "Anterior" e "Ultimo".
Eu criei a interface grafica (esse seria meu componente View ?) que utiliza um objeto do tipo Usuario e seta cada JTextField com o valor do atributo correspondete do objeto, esse valor do é acessado através de um método getXXXX (esse objeto Usuário seria meu Controller ?).
Bom, se eu não estiver falando muito bobagem e esquecenco do Model por enquanto tudo parece bem. Agora o dúvida:
Considerando que cada um dos meus botões de navegação, "Primeiro", "Próximo", "Anterior" e "Ultimo", possuem um método do tipo:
O que devo colocar nesse método para que, mantendo a estrutura MVC, eu retorne respectivamente o primeiro, próximo, anterior e último elemento da minha tabela ?
Eu deveria alterar minha View para receber um array de Usuário no lugar de um Objeto ?
Será que alguem vai entender a minha dúvida ?!
É que sou meio enrolado mesmo...
De qualquer forma, obrigado.
Um abraço a todos
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 20:14:24
|
m0ska
JavaGuru
![[Avatar]](/images/avatar/2a5b63fbaadcaa8ca0ef6b555fbe0c8a.jpeg)
Membro desde: 28/03/2007 19:20:52
Mensagens: 221
Localização: Maceió-AL
Offline
|
Bem no conceito de mvc, o model, é quem trabalha diretamente com o negócio, ou seja, provavelmente a clase "Usuario" faz parte do model, o que eu estou sentindo falta é de uma parte intermediária, que justamente seria o controller. é uma parte do seu softweare que faz a comunicação entre a interface e as classes de negócio, pra deixar as classes de negócio independentes.
|
--
Igor Cavalcante |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 20:23:17
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
mOska:
Model não é a camada responsável pela persistencia dos dados ? Ou seja, não é onde vamos colocar a conexão com o banco, insert´s, delete's, etc ?
As regras de negócio, ou seja, validação de dados digitados pelo usuário, não é o papel do Controller ?
Mas no caso da minha questão: que código colocaria no método
private void btAnteriorActionPerformed(java.awt.event.ActionEvent evt)
para que ao clicar no botão os dados apresentados na tela sejam atualizados corretamente ?
Obrigado.
Um abraço,
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 21:24:14
|
bzanchet
Java Ninja
Membro desde: 18/05/2006 20:04:34
Mensagens: 256
Offline
|
Olá.
Está havendo uma certa confusão de conceitos. A camada de persistência não é prevista pela arquitetura MVC. Apenas modele-a como uma quarta camada, que conhece o modelo, mas não tem conhecimento do controller ou da view.
No Model, represente o seu sistema. Os componentes. Seus problemas. A "inteligência" do seu sistema, que resolve esses problemas. No MVC clássico, esse model deve ser "observável" pela interface, que por sua vez deve ser capaz de se atualizar (http://en.wikipedia.org/wiki/Observer_pattern).
A validação dos dados pode ser papel do Controller, mas muitas vezes vai exigir colaboração do Model (exemplo: como saber se já existe um usuário cadastrado com determinado e-mail?).
Mais leitura:
http://fragmental.com.br/wiki/index.php?title=MVC_e_Camadas
http://www.akitaonrails.com/articles/2006/11/01/mvc-vs-model-2
Enfim, um pouco de prática.
Pela breve descrição do teu problema, imagino que no modelo haja duas classes. Uma classe Usuario, e uma outra, que mantém uma lista ordenada de objetos Usuario e uma referencia ao "atual" (e que tem também os metodos e a lógica para retornar proximo, ultimo, anterior, primeiro).
Na arquitetura proposta pelo swing, deverias usar subclasses de javax.swing.Action para cada ação ("proximo", "anterior" etc) e fazer uso delas na camada de apresentação ("view", a janela do programa). Segue código exemplo.
Model
Controller
View
Note que este approach é bem simplista, e dificilmente seria suficiente para sistemas maiores e mais complexos. E eu nem fiz a camada de persistência.
Podem ser necessários eventos e listeners mais especializados, pode ser necessário que a própria camada de apresentação mantenha um estado (http://www.martinfowler.com/eaaDev/PresentationModel.html).
Pode-se optar por responsabilizar o controller pela atualização da camada de apresentação. Pode-se usar algum framework para fazer "binding" automático (https://binding.dev.java.net/ - https://genesis.dev.java.net/).
Mas... bom... não vou escrever um livro. Não aqui, agora.
[]s
Bruno
|
http://conceitua-se.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/05/2007 13:09:30
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
bzanchet:
Desculpe pelo abuso, mas se puder me explicar mais algumas coisas...
Eu estou no começo do começo... então nunca nem tinha ouvido falar nas interfaces Observer e Action que vc citou, então, sinceramente, não consegui entender o que esta acontecendo no seu exemplo.
Meu pedido é: da pra implementar um modelo MVC sem utilizar essas interfaces e classes que vc citou ?
Explicando melhor:
Eu criei basicamente 3 classes, sendo:
-Uma classe CadastroUsuario, que é a minha tela, com todos os JTextFields e JButtons que vou utilizar.
-Uma classe Usuario, que possui todos os atributos de um usuário e getters e setters para acessá-los.
-Uma classe UsuarioDAO que possui um método Conecta(), que cria a conexão com o Banco de Dados, um método BuscaUsuario(int userID) que faz um select no banco pelo ID do usuario e retorna um objeto Usuario.
Como a coisa esta funcionando, ou seria melhor dizer, como não esta funcionando...
Executo a classe CadastroUsuario, que no seu construtor utiliza o método BuscaUsuario da classe UsuarioDao para receber um Usuario e mostra esses dados na tela.
Pra mim parece obvio que esta errado, porque:
-eu não tenho uma lista encadeada de usuarios,
-cada vez que quero mostrar outro usuario, clicando em proximo, por exemplo, eu chamo novamente o método BuscaDados da classe UsuarioDAO, o que leva a uma nova conexão com o banco e um novo select.
-a minha classe CadastroUsuario, que é a minha View (pelo menos eu acho que seja) esta utilizando a classe UsuarioDAO, o que não deveria acontecer num modelo MVC, certo ?
Só que entre saber que esta errado e como é o certo, pra mim esta uma grande distancia.... será que voce pode me ajudar ?
Só mais uma questão... eu devo criar uma outra classe que irá utilizar a classe UsuarioDAO e criar uma lista de usuarios que será devolvida para a CadastroUsuario ?
Muito obrigado pela paciencia.
Um abraço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/05/2007 03:29:05
|
bzanchet
Java Ninja
Membro desde: 18/05/2006 20:04:34
Mensagens: 256
Offline
|
Sim, é possível fazer uma aplicação MVC sem usar interface alguma. São só objetos, afinal.
Desculpa, mas infelizmente acho que as demais dúvidas são muito pouco específicas, nada que eu consiga responder de forma objetiva.
Meu conselho é: esqueça o padrão DAO, por enquanto. Tente entender, terminar a implementação (e até modificar) o exemplo que eu escrevi (um debugger ajuda, e modificações foram sugeridas aqui). E depois, leia sobre o DAO e tente incluí-lo no exemplo.
Se não quiser o que eu disse, tudo bem. Porém, poste aqui a implementação que fizesses, e faça perguntas mais específicas. Aí, sim, poderei ajudar.
Abraço,
Bruno
|
http://conceitua-se.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/05/2007 16:57:53
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
Bruno:
Vou tentar reproduzir a forma como acabei implementando e se você puder analisar e apontar onde estão os erros na abordagem vou ficar muito agradecido.
Primeiro a minha Interface com o usuario, suponho que seria minha View:
Agora a minha classe Usuario (não sei como classifica-la, acredito que faça parte da camada Model):
Agora a classe que chamei de UsuarioModel, mas agora não sei se ela representa esta camada:
E por fim uma classe responsável pela conexão com o banco, é nessa classe que eu pretendo colocar os métodos de persistencia, insert, update e delete, alem do select que ja coloquei:
Para tentar diminuir cortei algumas coisas, por os métodos criados pelo NB 5.5, como o initComponents(), imports e declaração de JTextFiels e JLabels, mas no meu código esta completo e aparentemente funcioando.
Bom se alguém tiver boa vontade e paciencia para analisar meus códigos e me orientar, vou ficar realmente muito grato. De coração.
Um abraço a todos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 19:03:45
|
raci0nal
JavaChild
![[Avatar]](/images/avatar/a50f4ea03581f27aae82ea135f1b6fb4.jpg)
Membro desde: 09/01/2007 12:53:24
Mensagens: 147
Offline
|
Amigo,
Infelizmente acho que não posso lhe responder com propriedade se está correto ou não.
Também sou novato, e estou há algum tempo pesquisando sobre MVC e DAO.
Acabei chegando na mesma conclusão que você, e estou implementando (quase) da mesma maneira. Especificamente:
Camada Model
Aqui eu fiz minhas classes que são entidades com seus atributos, setters e getters.
Camada Controller
Aqui eu fiz minhas classes DAOs que vão realizar a persistencia (via JDBC), são os métodos de inserir, alterar e excluir. Além de um método que retorna um objeto de uma classe através do atributo identificador e outro que retorna um List de objetos desta classe.
Camada View
Aqui eu fiz meus formulários (com swing) que busca um List da respectiva classe no DAO e monta o JTable, JTextFields e afins.
A unica coisa é que os métodos da classe que você chama de UsuarioModel eu colocaria na camada de visão.
Só também não sei se estou certo.
Abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 20:27:27
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
Boa noite amigo...
Como disse tambem sou novato, no entanto gostaria de questioná-lo em alguns pontos, quem sabe assim conseguimos um ajudar o outro, não ?
Sobre a camada Model:
Concordo em classe classificar a classe que definem um objeto Usuario, por exemplo no meu caso, com pertencente a essa classe, ou seja, no meu caso tenho a classe Usuario.java que define um objeto usuário, com todos seus getters e setters.
No entanto achei que nessa camada tb colocaria a classe DAO que faz acesso e persistencia no BD.
Na camada Controller no meu exemplo, eu entendi que ficaria a minha classe UserModel, que no meu caso será responsável pelas regras de negócio.
E no que parece que concordamos plenamente, que seria a camada View, estaria a minha classe CadastroUsuario, que cria a tela para interface com usuário.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 22:24:46
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Este problema de MVC realmente está começando a chegar no limite.
Primeira coisa que todos devem se lembrar é : Esqueça que existe MVC.
Segunda coisa a lembrar : MVC não é uma forma de diferenciar o sistema em camadas em em pacotes. Aliás MVC percente apenas a 1 camada e 1 pacote.
Dito isto, esqueçam , por amor de Deus que MVC existe.
O que estão querendo e separação de responsabildade.
Vcs querem uma parte do código que construa e mostre a tela.
Uma parte que responda aos eventos da tela.
Uma parte que acesse ao banco de dados e/ou faça pesquisas de dados.
A parte que constroi e controla a tela é a parte swing. Criam JFrames com controles lá dentro , num certo layout etc...
Quando estiver funcionando a tela gerará eventos. Esses eventos vão para objetos listeners. Para começar, crie uma inner classe do frame que ouve todos os eventos necessários e responde conforme. Depois, quando entender o que está acontecendo vá separando as classes cadas vez mais, até que a controladora nem saiba que existe uma tela. Isso é um estágio MUITO avançado que não é recomendo em estágio inicial.
Qual é a arquitetura melhor para uma aplicação desktop com swing ?
1. Criação de Tela: Espera-se que o programador não tenha que criar todos os botões e layouts na mão. Alcançar um mecanismo bom para isto é complicado, mas existem frameworks por ai. O que deve ser dado a esta parte são os controladores de apresentação. Ou seja, as classes que recebem e respondem a eventos e decidem o que ha a fazer.
2. Controlo de tela. Espera-se que exista um conjunto de tipos de objeto que respondem aos eventos da tela e controlam o programa. É aqui que ficam os códigos que fazem alguma coisa. Claro que, cada tipo de evento, tem o seu tipo de controle. Ao apertar um botão uma ação é iniciada. É preciso saber qual a ação e recolher parâmetros. Isto é diferente de responder a uma seleção de uma linha numa tabela ? Quando menos for, melhor será a sua abstração e melhor será o objeto de controle.
O inverso também é verdade. Se eu quiser mostrar m texto na tela, tenho que saber qual o label onde escrever o texto, ou não ? Quando menos eu tiver que saber da tela e seus objetos, melhor.
Atingir estes niveis de abstração e facilidade de controle não é simples. Por isso, para começar comecem por entender os objetos básicos. O que é um JComponent e quais tipos tem disponíveis. Sabes quais eventos eles geram é importantissimo. O resto é experiencia. É repetir , melhorar , aprender com os erros. Ler muito, e ENTENDER o que se lê.
Depois , daqui a um tempo, verá que tem muita coisa repetitiva e tentará colocar isso em classes à parte. Ou usar um framework swing (ou awt ou outro qq). Mas isso é no futuro. Por agora faça a coisa mais simples.
E por amor de Deus não digam que isto é MVC.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2007 09:38:00
|
Zeed01
Virtual Machine Man
Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline
|
Grato pela ajuda...
Sua definição exclareceu quase todas as dúvidas...
Essas posturas são realmente motivadoras.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/06/2007 18:32:44
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Zeed01, o fórum é lugar público e não tem como evitar a presença de ninguém. O negócio é invocar setModeIgnore("On") para individuos que só fazem barulho e continuar tentando resolver seu problema na boa.
Alguns links que podem te ajudar com o seu problema:
Esse é fundamental. Nele você vai ver que Swing implementa um MVC modificado, chamado pela Sun de separable model architecture, porque junta View e Controller, mas os separa do Model.
Swing architecture is loosely based -- but not strictly based -- on the traditional MVC design. In the world of Swing, this new quasi-MVC design is sometimes referred to a separable model architecture.
Se você pensar em algo bem próximo do MVC para o seu aplicativo, então isto aqui vai te ajudar bastante.
Aqui no GUJ, também já discutimos sobre isso.
Mas não pare ainda não! Tem uma série de outros artigos interessantes, padrões sugeridos, pelos arquitetos do Swing, no site do JGoodies, etc. Ou seja, se quiser trabalhar com o Swing vai ter que ler bastante, entender, suar a camisa.
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/06/2007 13:52:34
|
raci0nal
JavaChild
![[Avatar]](/images/avatar/a50f4ea03581f27aae82ea135f1b6fb4.jpg)
Membro desde: 09/01/2007 12:53:24
Mensagens: 147
Offline
|
O que falta às vezes é um exemplo. Pelo menos até agora eu não achei nenhum.
Uma aplicação com o rótulo: "ISSO FOI DESENVOLVIDO COM MVC"
Proporcionaria uma melhor compreensão
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/06/2007 05:25:38
|
AllMighty
Java Ninja
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 266
Localização: São Paulo
Offline
|
http://www.martinfowler.com/eaaDev/uiArchs.html
|
Rafael de F. Ferreira
Blog: http://www.rafaelferreira.net/
Links miscelâneos: http://stoa.usp.br/rafaelferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/06/2007 15:54:22
|
Guto_Magalhaes
JavaTeenager
![[Avatar]](/images/avatar/9ec80d58ed3495c213848b3957cf8ea1.png)
Membro desde: 11/06/2007 11:51:52
Mensagens: 180
Offline
|
Ae galerinha, aqui vai um material + do que basico so bre mvc:
http://www-usr.inf.ufsm.br/~marvin/monografia.pdf
|
|
|
 |
|
|
|
|