logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!

CRUD com Flex e Java

Colocado por Edgard Davidson na(s) categoria(s): CRUD, Flex, Glassfish, Hibernate, Java, JAX-WS, web services em 08 31st, 2009 | Sem comentários

O objetivo deste post e demonstrar um CRUD (Create, Retrieve, Update e Delete) feito em Flex e Java. A tecnologia utilizada é a seguinte:  do lado do servidor temos:  JAVA EE, Hibernate, JAX-WS e Glassfish. Do lado do cliente temos o Flex consumindo o webservices Java.

Esse post é continuação do anterior onde falei sobre paginação com datagrid. Agora será demonstrado como inserir, alterar, excluir.

A figura 1 ilustra a interface principal do exemplo.

Tela 11

Figura 1

Para iniciar a criar a aplicação servidor, será mostrado passo a passo como criar a aplicação no Netbeans 6.5.1.

Abra o NetBeans clique em “Novo Projeto”, em seguida escolha a categoria “Java Web” em seguida o projeto “Aplicação Web” conforme ilustrado na figura 2.  O projeto está sendo criado dessa forma porque será uma aplicação web que publicará um serviço web.

tela 1

Figura 2

O próximo passo no Wizard do NetBeans é criar um nome para o projeto. No caso deste exemplo, o projeto foi nomeado como “CrudServidor”. O local do projeto poderá ser o caminho padrão do NetBeans ou outro que você indicar.

tela 2

Figura 3

Como estamos criando uma aplicação Web, então será necessário indicar qual servidor de aplicação web será utilizado pelo projeto que está sendo criado. Conforme a figura 4, o servidor escolhida foi o GlassFish v2, mas nada impede de você escolher outro como tomcat, jboss, etc. No mais deixe os outros campos como estão.

tela 3

Figura 4

Na próxima tela do wizard (Figura 5), será necessário indicar quais frameworks serão utilizados pelo novo projeto. Nesse caso, será utilizado apenas o Hibernate 3.2.5. Fazendo isso o Netbeans já adiciona todos os ponto jar’s necessários para o hibernate, evitando que você tenha que indicar manualmente.  Na figura 5 do wizard também é necessário indicar para qual banco de dados o Hibernate será configurado. Poderia ter criado um novo banco de dados. Se esse projeto fosse para construir uma aplicação real teríamos que criar um novo banco, mas como isso é um exemplo, foi utilizado o “banco sample” que vem junto com a IDE do Netbeans. Então configura conforme figura 5. Neste ponto o seu projeto está criado no Netbeans.

Tela 4

Figura 5

Agora,  configurado o banco, será necessário criar um novo arquivo de mapeamento do Hibernate e POJOS de banco de dados. Para isso clique com o botão direito do mouse sobre a pasta “Pacotes de código fonte” do seu projeto, em seguida clique em novo e encontre o termo “Novo arquivo de mapeamento do Hibernate e POJOS de banco de dados.” Será aberta a tela conforme figura 6. O próximo passo é criar o hibernate.cfg.xml. Esse arquivo contém as informações necessárias para que o Hibernate se conecte ao banco de dados. Nessa tela do wizard (Figura 6), será necessário escolher as tabelas para que o wizard crie um mapeamento por meio de engenharia reversa. Nesse exemplo será mapeado apenas a tabela “Customer”.

Tela 6

Figura 6

A figura 7 mostra a tela do wizard onde será configurado para onde as classes de entidade, ou seja, as classes que mapeiam as tabelas do banco de dados serão geradas. Neste ponto é possível informar se você que criar o mapeamento utilizando anotation ou xml. Nesse projeto foi escolhida a estratégia de criar um arquivo XML de mapeamento objeto relacional para cada classe de entidade. No mais as classes geradas e seus respectivos arquivos de mapeamento com a extensão “.hbm.xml” serão gerados dentro do pacote entidade que foi previamente criado dentro da pasta source do projeto.

Tela 7

Figura 7

Em seguida (Figura 8), será necessário adicionar ao seu projeto um novo serviço web. Esse serviço web será a sua classe de fachada que irá publicar um web services com uma lista de métodos disponíveis para ser consumidos por qualquer aplicação cliente. Nesse projeto o nome do serviço Web é ControleCustomer. Entenda a classe de fachada com um classe que implementa as regras de negócio de um caso de uso, então se tivéssemos um caso de uso chamado “Getão de Customer”, então a classe ControleCustomer implementaria as suas regras. Note que a classe ControleCustomer  será gerada dentro do pacote chamado “controle” que foi previamente criado.

Tela 8

Figura 8

Bem, seguido todos os passos acima, espera-se que o seu projeto tenha a estrutura como ilustrado na figura 9.

Tela 9

Figura 9

A primeira classe gerada foi a classe de entidade Customer. Essa classe foi gerada automaticamente por engenharia reversa com descrito acima.
Segue o código da classe

package entidade;
// Generated 27/08/2009 21:14:32 by Hibernate Tools 3.2.1.GA

/**
 * Customer generated by hbm2java
 */
public class Customer  implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

     private int customerId;
          private String zip;
     private String name;
     private String addressline1;
     private String addressline2;
     private String city;
     private String state;
     private String phone;
     private String fax;
     private String email;
     private Integer creditLimit;

    public Customer() {
    }

    public Customer(int customerId, String zip) {
        this.customerId = customerId;
        this.zip = zip;
    }
    public Customer(int customerId, String zip, String name, String addressline1, String addressline2, String city, String state, String phone, String fax, String email, Integer creditLimit) {
       this.customerId = customerId;
       this.zip = zip;
       this.name = name;
       this.addressline1 = addressline1;
       this.addressline2 = addressline2;
       this.city = city;
       this.state = state;
       this.phone = phone;
       this.fax = fax;
       this.email = email;
       this.creditLimit = creditLimit;
    }

    public int getCustomerId() {
        return this.customerId;
    }

    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }

    public String getZip() {
        return this.zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getAddressline1() {
        return this.addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }
    public String getAddressline2() {
        return this.addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }
    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getFax() {
        return this.fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getCreditLimit() {
        return this.creditLimit;
    }

    public void setCreditLimit(Integer creditLimit) {
        this.creditLimit = creditLimit;
    }
}

Agora a classe de fachada ControleCustomer que também é o webservices.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import entidade.Customer;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import persistente.GenericDAO;
import persistente.GenericException;

/**
 *
 * @author Edgard Davidson
 */
@WebService()
public class ControleCustomer {

    private GenericDAO dao = new GenericDAO();

    @WebMethod
    public void inserirCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.save(customer);
    }

    @WebMethod
    public void alterarCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.update(customer);
    }

    @WebMethod
    public void exlcuirCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.delete(customer);
    }

    @WebMethod
    @SuppressWarnings("unchecked")
    public List obterObjetosCustomer(String campo, String pesquisa, int indice, int maximo) throws GenericException {
        // Tratar aqui alguma regra de negócio
        Customer customer = new Customer();
        return  dao.loadObjects(campo, pesquisa, customer, indice, maximo);
    }

    @WebMethod
    public long obterQuantidadeObjetosCustomer(String campo, String pesquisa) throws GenericException {
        // Tratar aqui alguma regra de negócio
        Customer customer = new Customer();
        return dao.getCountObjects(campo, pesquisa, customer);
    }
}

As demais classes e arquivos XML de configuração estão empacotados para download no final do post.

Agora segue o código fonte Flex:
Primeiro a código fonte da aplicação principal.




	
		 0)
					var temp1:int=this.indice + 1;
				var temp2:int=this.indice + this.maximo;
				if (temp2 > this.qtdeObjetos)
					temp2=this.qtdeObjetos;
				lbPag.text=temp1.toString() + " - " + temp2.toString() + " de " + this.qtdeObjetos.toString();
			}

			private function onResultObterObjetosCustomer(event:ResultEvent):void
			{
				var acTemp:ArrayCollection=new ArrayCollection();
				var i:int;
				acTemp=event.result as ArrayCollection;
				AC.removeAll();
				var customer:Customer;

				if (event.result != null)
				{
					if (acTemp == null)
					{
						this.controleBotoesPaginacao(1);
						customer=new Customer();
						customer.customerId=event.result.customerId;
						customer.name=event.result.name;
						customer.city=event.result.city;
						customer.state=event.result.state;
						customer.zip=event.result.zip;
						customer.email=event.result.email;

						AC.addItem(customer);
					}

					if (acTemp != null)
					{
						this.controleBotoesPaginacao(acTemp.length);
						for (i=0; i < acTemp.length; i++)
						{
							customer=new Customer();

							customer.customerId=acTemp.getItemAt(i).customerId;
							customer.name=acTemp.getItemAt(i).name;
							customer.city=acTemp.getItemAt(i).city;
							customer.state=acTemp.getItemAt(i).state;
							customer.zip=acTemp.getItemAt(i).zip;
							customer.email=acTemp.getItemAt(i).email;

							AC.addItem(customer);
						}
					}
				}
				else
					this.controleBotoesPaginacao(0);
			}

			private function onResultExcluirCustomer(event:ResultEvent):void
			{
				AC.removeItemAt(gridCustomer.selectedIndex);
				AC.refresh();
				Alert.show('Excluido com sucesso!', "Mensagem");
			}

			private function onResultObterQuantidadeObjetosCustomer(event:ResultEvent):void
			{
				this.qtdeObjetos=event.result as int;
				srv.obterObjetosCustomer(comboBoxFiltro.selectedItem, campoBusca.text, indice, maximo);
			}

			private function onFault(event:FaultEvent):void
			{
				if (event.fault.rootCause == null)
					Alert.show("MOTIVO:\n" + event.fault.faultString + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
				else
					Alert.show("MOTIVO:\n" + event.fault.message + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
			}

			private function inicio_Click():void
			{
				this.indice=0;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function retroceder_Click():void
			{
				if ((this.indice - nsMaximo.value) <= 0)
					this.indice=0;
				else
					this.indice=this.indice - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function avancar_Click():void
			{
				this.indice=this.indice + nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function fim_Click():void
			{
				this.indice=this.qtdeObjetos - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}
		]]>
	
	
		
		
		
		
		
		
		
		
	
	

		
			
				
					
					
					
					
					
					
				
			
			
				
				
				
				
				
				
				
				
			
			
				
					name
					cyte
					state
					zip
					email
				
			
			
			
		
		
			
			
			
			
			
		
	


Agora o fonte da tela de cadstro.




	
		
	
		
		
		
		
	

	
		
			
		
		
			
		
		
			
		
		
			
		
		
			
		
			
	
		
		
		
		
	

A figura 11 é print da tela de cadastro de usuário

Tela 12

Figura 11

Segue o código fonte do lado servidor feito em Java. CrudServidor

Segue o código fonte do lado cliente feito em Flex. CrudCliente



Veja o post original no blog do autor aqui!  

Edgard Davidson

Escrito por Edgard Davidson @ http://edgarddavidson.com
Saiba mais sobre o autor na sua pagina de perfil
Outros posts do autor:
» Scrum em cinco minutos
» Métodos ágeis de desenvolvimento
» Esse semestre não dei prova Final – Dei DOJO

Deixe um comentário



Spam Protection by WP-SpamFree

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2795 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com