Adotamos aqui na empresa o para o padrão MVC o framwork Jakarta STRUTS.
As views em jsp + taglibs(As tags do Struts e a JSTL).
Para o modelo uma arquitetura de camadas que foi idealizada na UFPE e é adotada por várias empreas do Recife.
Tentarei explicar de maneira simplificada nossa arquitetura.
As camadas são divididas em:
±-----------------+
Fachada |
controlador |
------------------- |
Cadastro |
------------------- |
Repositório |
±-----------------+
Essa arquitetura pode ser aplicada para qualquer tipo de modelo de negócio não estando preso ao uso do EJB.
Resumindo as camadas:
A Fachada
Implementa o padrão Facade ou no caso de trabalhar com EJB o SessionFacade, seria o ponto de entrada para o sistema(em sistemas pequenos usamos uma única fachada) ou para cada módulo do mesmo.
O acesso do cliente se limita a Fachada do sistema, no caso do STRUTS, o acesso ficaria por conta das Actions. A fachada deve ser acessada mediante uma Fábrica de fachadas (Usando o padrão AbstractFactory) para que exista a independência das camadas. A fachada repassa as solicitações para os Controladores que mais uma vez são acessados por uma fábrica de controladores.
O Controlador
O controlador implementa a regra de negócio referênte ao caso de uso, ele gerencia os Cadastros para repassar solicitações de regra de negócio mais específica da entidades. Aqui não acessamos os cadastros por uma fábrica tornando essa camada acoplada ao controlador. Nossa regra de negócio esta ligada aos Controladores + Cadastros. Os Controladores também são responsáveis pelo gerenciamento das transações.
O Cadastro
As classes de cadastro são responsáveis pela regra de negócio específica da entidade. As classes de Cadastro fazem acesso aos repositórios de dados por uma fábrica de repositórios.
O Repositorio
O Repositório implementa o padrão DataAccessObject, ele é responsável pelo acesso aos dados de qualquer natureza. Seja um SGDB, um arquivo xml, um txt … nele serão implementadas as funções de inserir, deletar, excluir e localizar, nenhuma regra pode existir nos repositórios e nele o acesso a dados pode ser implementado com JDO, EntityBean, JDBC … ficando transparente para as outras camadas.
IDE
Estamos usando o JBuilder8 para o STRUTS e o Together para modelar as camadas e Patterns.
OBS:
Caso você trabalhe com EJB coloque um BussinessDelegate em conjunto com um ServiceLocator entre a Action do STRUTS e o SessionFacade. Isso faz com que seu cliente possua uma abstração local das camadas remotas e isola todo o mecanismo de lookup da Fachada remota.
No final nossa arquitetura de camadas fica da seguinte maneira.
±-----------------+
GUI |
Fachada |
------------------- |
controlador |
------------------- |
Cadastro |
------------------- |
Repositório |
±-----------------+
Onde a GUI pode ser uma interface web(com Struts,Velocity etc), Swing ou outra alternativa. E como cada camada fica independente da outra podemos fazer uma troca na camada que as outras não percebem. Um exemplo podemos ter um sistema funcionando com uma GUI web e um repositório em JDO e depois trocar a GUI por uma interface Swing e o repositório por um Entity Bean e o sistema continua numa boa.