Feed Artigos Comentários

Tutorias Hildebrando em 17 Set 2008

Arquitetura Java 2Solutions (utilizando struts2+spring+jpa)

Abaixo estou listando um passo-a-passo para a implementação de requisitos de um sistema, utilizando a arquitetura Java da 2Solutions.

Em primeiro lugar, os frameworks que adotamos para o desenvolvimento são :

Struts2 : View e Controller
JPA (Hibernate) : Persistência
Spring : IoC e DI

Os frameworks se relacionam, facilitando o nosso trabalho assim, os trabalhos iniciam assim:

Resumo de Levantamento de requerimentos

A primeira coisa a fazer no desenvolvimento de software é o levantamento/descobrimente de requerimentos. Essas informações são bem armazenadas na forma de diagramas de caso de uso.

A ideia dos casos de uso é ser o mais simples possivel, apenas documentando as funcionalidades, deixando de descreve-las a fundo. O caso de uso deve ser documentado com um usuario e quais funcionalidades do sistema ele ira interagir, por exemplo :

Ator : Gerente de contas
Caso de Uso : Cadastrar novo cliente

Se o caso de uso ‘cadastrar novo cliente’ for um pouco complexo, repare bem, SE for complexo, dai sua lógica deve ser armazenada em um diagrama de atividades. Ou podemos utilizar cenários para armazenar as situações.

Junto a isso pode ser feito protótipos para ser apresentado ao cliente e este levantar mais informações pertinentes. Nesta fase não temos codigo compilado, apenas telas e informações sobre a funcionalidade. Podemos agilizar isso com reunioes, ou com viagens ao codigo e planos de teste.

Modelagem

A medida que as funcionalidades vão sendo descobertas o próximo passo é ir descrevendo as entidades encontradas. Essa descrição pode ser feita direto no banco de dados, ou pode ser feita associando classes.

Na 2Solutions nós fazemos as classes e anotamos seu nome e seus atributos para que as tabelas sejam geradas.

Por tanto o primeiro passo é fazer a modelagem das classes.

Uma forma de verificar se o modelo esta bem feito é criando testes unitários. Teste unitário é apenas garantir que aquela funcionalidade especifica da sua entidade como ‘inserir no banco’ esta funcionando. O ideal é criar para cada entidade testes unitarios de insert, select, update e delete.

Action/Jsp

Depois que suas classes estiverem corretamente modeladas e testadas, dai partimos para as interfaces. Por padrão toda entidade criada pode ser manipulada utilizando interfaces genéricas. Para que isso funcione voce precisa.

1 - Criar o arquivo EntidadeAction no pacote actions, seguindo o modelo de uma action padrão :

public class ClienteAction extends GenericAction {
public ClienteAction(GenericService service){
super(service);
}
}

2 - Com a entidade criada, o próximo passo é fazer as associações no Spring. O Spring é o responsável por cuidar da parte de instanciar objetos e seta-los nas entidades. Com o Spring temos benefícios imediatos como a IoC (Inversion Of Control) e a DI (Dependency Injection)

<!--
Entitys
-->
<bean id="clienteEntity" class="br.gov.sp.sucen.controledengue.entity.Cliente" scope="session"/>

<!--
Services
-->
<bean id="clienteService" class="br.gov.sp.sucen.controledengue.service.GenericServiceImpl">
<constructor-arg>
<value>br.gov.sp.sucen.controledengue.entity.Cliente </constructor-arg>
</bean>

<!--
Actions
-->
<bean id="clienteAction" scope="prototype" class="br.gov.sp.sucen.controledengue.action.ClienteAction">
<constructor-arg ref="clienteService" />
<property name="entity" ref="clienteEntity" />
</bean>

3 - Com tudo configurado a sua entidade ja esta com as operações basicas de manipulação prontas.

http://localhost:8080/MeuProjeto/cliente!novo.action
http://localhost:8080/MeuProjeto/cliente!pesquisar.action
http://localhost:8080/MeuProjeto/cliente!salvar.action
http://localhost:8080/MeuProjeto/cliente!remover.action
http://localhost:8080/MeuProjeto/cliente!editar.action
http://localhost:8080/MeuProjeto/cliente!visualizar.action

Personalizando

Procure sempre criar interfaces baseadas nas entidades. Com recursos como AJAX, nós podemos ter uma tela desempenhando varias funções no mesmo ambiente. Por exemplo, se na interface de cadastro de cliente você precisar mostrar uma lista com os vendedores, para selecionar qual o vendedor desse cliente, o processe ficaria assim.

Combo (<select>)

<%
ObjectFactory factory = StrutsSpringObjectFactory.getObjectFactory();
GenericService service = (GenericService)factory.buildBean("vendedorService",null);
pageContext.setAttribute("propertyListName",service.buscarTodos());
%>
<s:select name="entity.vendedor.id" label="Selecione Vendedor" list="%{#attr.propertyListName}" listKey="id" headerKey="" headerValue=""/>

Eu particularmente não gosto muito de Scriptlets no JSP, porém não gosto de ter que ficar criando uma colecao de retorno em toda Action

Radiobuttons (Sim/Nao)

<s:radio label="Ativo" list="#{'true':'Sim','false':'Nao'}" name="entity.ativo"/>

Checkbox (Lista de Elementos)

<%
GenericService service = (GenericService)factory.buildBean("vendedorService",null);
List all = service.buscarTodos();
pageContext.setAttribute("propertyListName",all);
%>
<s:checkboxlist name="entity.vendedores" label="Selecione vendedores" list="%{#attr.propertyListName}"/>

Enviar por e-mail  | Hits para esta publicação: 516

Link desta publicação | RSS dos Comentários

Deixe uma resposta.