quarta-feira, 30 de abril de 2008

Tagged under:

JavaOne, aí vou eu!

Para quem gosta de Java, o JavaOne é um evento diferenciado. Nunca vi tanta gente (de 15 a 20.000 pessoas) junta em volta de uma tecnologia, durante 4 dias. Estou indo pela segunda vez, agora com a agradável missão de blogar sobre o evento para o JavaBahia. Na 6a-feira estou a caminho de San Francisco...

Isso me faz lembrar o ano de 2005, especial para mim. Em maio, foi disponibilizada na página da Receita Federal do Brasil (RFB) a primeira versão do Imposto de Renda Pessoa Física (IRPF) sob a minha liderança (no ano anterior, participei como desenvolvedor da equipe mista RFB/Serpro que construiu a primeira versão do IRPF Java). Em abril, apresentei o IRPF Java no CaféBrasil, evento internacional que ocorreu em Brasília. Lá, estive com outros colegas do Serpro em reunião com nada menos que James Gosling, considerado o pai do Java, que pôde conhecer mais sobre essa importante aplicação do governo brasileiro.


Serge, James Gosling, Elizier e Leonardo (atual líder da equipe IRPF), no CafeBrasil 2005

Em junho, fruto da repercussão causada pelo Duke's Choice Award recebido pelo IRPF Java em 2004, fui ao JavaOne com a missão de apresentar o aplicativo junto com Bruno "JavaMan" Souza, então consultor do projeto. A TS-1453 foi a única Technical Session Brasileira em 2005, a minha primeira apresentação em inglês. O mais difícil foi conversar com Bruno sobre a apresentação (ele não pára durante todo o evento!), o que conseguimos fazer na hora do almoço, umas 2 horas antes do início.


Bruno, Juggy (mascote mundial das comunidade de usuários Java) e Serge

Durante os dias pude assistir a diversas palestras interessantes, conversar com pessoas de várias partes do mundo e também com brasileiros importantes na comunidade Java. Esse post é pequeno para falar de tanta experiência, então vou economizar para falar do JavaOne 2008. Abaixo uma foto com a "delegação brasileira" (na verdade, esse são alguns). Não dá para citar o nome de todos, então quero destacar a Fabiane Nardon, de rosa claro, segurando o Duke's Award que recebeu em 2005 representando o time de desenvolvimento do Sistema Único de Saúde (SUS) da cidade de São Paulo, e Júlio Shinzato (o primeiro em pé, à direita), líder e principal arquiteto da primeira versão do IRPF Java, além de meu parceiro de viagem.


Brasileiros no JavaOne 2005

Bom, ainda deu para dar um passeio com Júlio pelo Sul da Califórnia e apreciar um pouco da bela região. Depois da volta do JavaOne continuei mantendo contato pessoal e profissional com Bruno. Graças ao seu incentivo (pra não dizer, insistência!), conheci Ulisses Telemaco (JavaRN e JEEBrasil) e junto com ele assumimos a liderança do JavaBahia (com o aval, é claro, dos seus fundadores). De lá para cá, muitas palestras e eventos realizados, boas amizades construídas e histórias interessantes para contar. No Serpro, também muitas mudanças (assumi a gerência da equipe, hoje com quase 90 pessoas), mas o vínculo com Java sempre firme, embora o tempo de codificação tenha se reduzido bastante...

Nesse 30 de abril de 2008, quando encerramos mais um prazo de entrega com sucesso do IRPF (números ainda não oficiais: cerca de 24 milhões de declarações transmitidas, mais de 16 milhões feitas no IRPF Java!!!), começo a entrar no clima do JavaOne 2008. Se você não pôde estar presente esse ano, está convidado a acompanhar essa viagem junto comigo nos próximos posts. Até!

sábado, 26 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 5ª parte

Prosseguindo com nossa seqüência de posts (parte 1, parte 2, parte3 e parte 4), vamos implementar a manutenção do cadastro de empresas (o popular CRUD) e depois executar o que já foi feito até o momento no Tomcat.

Clique com o botão direito do mouse no projeto JavaBahiaWeb, depois clique em Novo (New), Fragmento da Página JSF Visual da Web (Visual Web JSF Page Fragment). Digite 'Cabecalho' no campo Nome do Arquivo (File Name) e depois clique no botão Finalizar (Finish). Crie a tela conforme a imagem abaixo e siga configurando as propriedades dos componentes da tela de acordo com a tabela a seguir.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
--- ! Cabecalho ! {width:600px, height:80px} ! ---
StaticText ! stxTitulo ! {style:font-size: 18px; font-weight: bold;, text:JavaBahia Web} ! ---
GridPanel ! panelLinks ! {columns:1} ! ---
Hyperlink ! linkEmpresas ! {text:Empresas} ! Coloque dentro de panelLinks.
-------------------------------------------------------------------------------------


Abra a página PagePrincipal.jsp e insira uma Caixa de Fragmento de Página (Page Fragment Box), escolhendo o arquivo Cabecalho.jspf – veja a figura abaixo.



Clique com o botão direito do mouse no projeto JavaBahiaWeb, depois clique em Novo (New), Página JSF Visual da Web (Visual Web JSF Page). Digite 'PageEmpresas' no campo Nome do Arquivo (File Name) e depois clique no botão Finalizar (Finish). Antes de editarmos a tela, abra o arquivo de configuração faces-config.xml para podermos editar a navegação entre as telas já criadas. Clique em cima de Cabecalho:linkEmpresas, dentro de PagePrincipal.jsp, e arraste o mouse até PageEmpresas.jsp, soltando-o. Clique em cima da linha desenhada para selecioná-la, pressione as teclas Control+R, e renomeie case1 para manterEmpresas, conforme mostra a figura abaixo. Essa ação que fizemos configurou o linkEmpresas para abrir a tela PageEmpresas dentro do fragmento Cabecalho.



Volte à edição da página PageEmpresas e crie a tela conforme a imagem abaixo, configurando as propriedades dos componentes da tela de acordo com a tabela a seguir. Por enquanto, deixe o componente Tabela (Table) do mesmo jeito que o Netbeans puser na tela.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
FragmentPageBox ! --- ! {file: Cabecalho.jspf} ! ---
GridPanel ! panelRegistros ! {colums: 1} ! ---
Table ! tableEmpresas ! por enquanto, deixe assim ! Coloque dentro de panelRegistros.
MessageGroup ! grpMsg ! {} ! Coloque dentro de panelRegistros.
GridPanel ! panelBotoes ! {colums: 5} ! ---
Button ! btnLimpar ! {text: Limpar Campos} ! Coloque dentro de panelBotoes.
Button ! btnFiltrar ! {text: Filtrar pelos Campos} ! Coloque dentro de panelBotoes.
Button ! btnSalvarNovo ! {text: Salvar Novo} ! Coloque dentro de panelBotoes.
Button ! btnAtualizar ! {text: Atualizar} ! Coloque dentro de panelBotoes.
Button ! btnExcluir ! {text: Excluir} ! Coloque dentro de panelBotoes.
GridPanel ! panelCampos ! {colums: 1} ! ---
Label ! lblCnpj ! {text: CNPJ, for: txtCnpj} ! Coloque dentro de panelCampos.
TextField ! txtCnpj ! {columns: 15} ! Coloque dentro de panelCampos.
Label ! lblNome ! {text: Nome, for: txtNome} ! Coloque dentro de panelCampos.
TextField ! txtNome ! {columns: 50} ! Coloque dentro de panelCampos.
Label ! lblEmail ! {text: E-mail, for: txtEmail} ! Coloque dentro de panelCampos.
TextField ! txtEmail ! {columns: 50} ! Coloque dentro de panelCampos.
-------------------------------------------------------------------------------------


Antes de continuarmos a configuração da tabela que exibirá os registros de Empresas, teremos que criar um provedor de dados (data provider). Esse objeto irá povoar a tabela com os dados a serem exibidos.

Clique com o botão direito do mouse no projeto JavaBahiaWeb, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como EmpresaProvider e escreva no campo Pacote (Package), o valor 'javabahia.web.provider'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class EmpresaProvider extends ObjectListDataProvider {

private List<Empresa> empresas;

public EmpresaProvider() {
empresas = new ArrayList<Empresa>();
// a linha abaixo existe apenas para que possamos desenhar a tabela na IDE
empresas.add(new Empresa());
setList(empresas);
}
}


***

Essa classe estende a classe ObjectListDataProvider, fornecida pelo Netbeans, encapsulando uma lista de objetos para a tabela de nossa página web.

Procure no pacote 'javabahia.web' a classe SessionBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private EmpresaProvider empresaProvider;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.web.provider.EmpresaProvider. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setEmpresaProvider(new EmpresaProvider());

Retornando à edição da página PageEmpresas, vamos continuar a configuração da tabela que exibirá os registros de empresas. Clique com o botão direito do mouse na tabela e escolha a opção Layout da Tabela (Table Layout). Na lista de seleção Pegar Dados De (Get Data From) escolha o objeto empresaProvider, proveniente do SessionBean1. Coloque na lista Selecionados (Selected) os atributos cnpj, email e nome. Edite os Textos de Cabeçalho (Header Text) de cada campo. Somente para o atributo cnpj, selecione Hyperlink como Tipo do Componente (Component Type).



Clique na aba Opções (Options) da caixa de diálogo. Digite o valor 'Empresas' no campo Título (Title), o valor 'Não há registros a serem exibidos' no campo Mensagem de Dados Vazios (Empty Data Message), e marque as opções Mostrar Botão de Limpar Ordenação (Show Clear Sort Button), Mostrar Botão de Alternância de Ordenação (Show Sort Panel Toggle Button), e Habilitar Paginação (Enable Pagination), digitando o valor 5 para o Tamanho da Página (Page Size).



Ao final de tudo, sua tela deverá parecer com esta imagem abaixo.



Procure no pacote 'javabahia.web' a classe RequestBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Empresa empresa;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Empresa. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setEmpresa(new Empresa());

Volte à página PageEmpresas.jsp, com o editor visual aberto (design). Clique com o botão direito do mouse em cima do campo de texto txtCnpj, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade cnpj do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.



Clique com o botão direito do mouse em cima do campo de texto txtNome, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade nome do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação. Clique com o botão direito do mouse em cima do campo de texto txtEmail, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade email do objeto Empresa que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Agora só nos resta programar as ações que os botões da tela realizarão quando forem clicados. Em primeiro lugar, iremos programar o que acontecerá quando o link da coluna CNPJ da tabela for acionado. Dê um clique com o botão esquerdo do mouse em cima do link na tabela, e configure a propriedade id para o valor 'linkCnpjEmpresa'. Dê dois cliques em cima do mesmo link e o Netbeans abrirá o editor de código para você, colocando o método que será responsável pela ação do usuário sobre o link. Digite o seguinte código:

public String linkCnpjEmpresa_action() {
try {
String selecionado = (String) getValue("#{currentRow.value['cnpj']}");
JavaBahiaFacade facade = new JavaBahiaFacade();
Empresa registro = facade.obterEmpresaPorCnpj(selecionado);
getRequestBean1().setEmpresa(registro);
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

Acrescente também o seguinte código:

private void limparCamposFormulario() {
getRequestBean1().setEmpresa(new Empresa());
}

Retorne a edição visual da página e dê dois cliques em cima do botão 'Limpar Campos'; digite o código:

public String btnLimpar_action() {
limparCamposFormulario();
return null;
}

Agora, vamos fazer os mesmos passos para os demais botões da tela, digitando os códigos abaixo listados. Chamo a atenção para o código do botão Filtrar, onde comento por quê não estamos fazendo filtro realmente.

public String btnFiltrar_action() {
try {
Empresa filtro = getRequestBean1().getEmpresa();
// para simplificar o tutorial, o filtro não será utilizado,
// ficando o resultado deste método sempre trazendo todos os registros
// a modificação necessária aqui fica por conta de você, ok?
JavaBahiaFacade facade = new JavaBahiaFacade();
List registros = facade.obterTodasEmpresas();
getSessionBean1().getEmpresaProvider().setList(registros);
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

public String btnSalvarNovo_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.inserirEmpresa(registro);
info("Registro inserido com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

public String btnAtualizar_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.atualizarEmpresa(registro);
info("Registro atualizado com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
} return null;
}

public String btnExcluir_action() {
try {
Empresa registro = getRequestBean1().getEmpresa();
JavaBahiaFacade facade = new JavaBahiaFacade();
facade.excluirEmpresa(registro);
info("Registro excluído com sucesso! Atualize a tabela para perceber as modificações.");
limparCamposFormulario();
} catch (Exception e) {
error(e.getMessage());
}
return null;
}

Finalmente, vamos botar aplicação pra funcionar. Compile os dois projetos que criamos no Netbeans. No projeto JavaBahiaWeb, clique com o botão direito do mouse e depois clique em Executar (Run). A própria ferramenta se encarregará de iniciar o servidor Tomcat e implantar (deploy) a aplicação nele. O Netbeans ainda abrirá o seu navegador padrão já na tela principal de nossa aplicação, ou seja, PageLogin. Use o usuário teste que inserimos no banco de dados para acessar a aplicação.

Esse quinto post ficou enorme porque a criação da tela visual para Empresas é a parte mais trabalhosa desse nosso exemplo. Por isso, a criação da tela de Contratos não será mostrada aqui no blog. Vou deixar como exercício para você, leitor, fazer o restante da aplicação.

Comentarei no próximo e último post da série sobre algumas coisas que fizemos e deixamos de fazer aqui em nosso tutorial. Aproveitarei também para colocar um link para o código completo, permitindo a você comparar e corrigir o exercício. Fico grato pela sua atenção e tenha um ótimo dia!

segunda-feira, 21 de abril de 2008

Tagged under: , ,

JavaBahia no FISL - 3o Dia

O maior FISL de todos os tempos, essa é a notícia de encerramento no sítio oficial do evento. 7.417 participantes de 21 países, 257 palestrantes. Sem dúvida, o ponto alto foi a palestra de Jon "maddog" Hall, diretor executivo da Linux Internacional, entintulada Fun and Software Livre! - Return of the Jedi! Com o auditório lotado, Maddog procurou retomar o espírito da diversão do SL, lembrando quando Linus Torvalds, ele e os demais parceiros resolveram construir um sistema operacional just for fun. Vejam no que deu a brincadeirinha deles! Foram apresentados exemplos de desenvolvedores com 12 a 15 anos de idade, empresários de 19, comprovando que nesse mundo não importa quem você é ou qual sua idade, mas a qualidade e quantidade das suas contribuições. É como ele mostrou numa charge de um cachorro usando o computador. Abaixo, o dizer: "Na internet, ninguém sabe que você é um cachorro". Na sessão de perguntas, alguém quis saber porque Linus nunca esteve no FISL. Jon respondeu que Torvalds se vê mais como um engenheiro e tem uma certa fobia de grandes multidões.

Java para dispositivos móvies e embarcados foram tema da palestra Mobile & Embedded, the first 15 month, por Roger Brinkley. Foi feito um histórico da evolução ocorrida após a criaçao da comunidade Mobile & Embedded liderada por Roger, que estava vestido com sua roupa de jogar Golf (veja fotos). No taco ele prendeu um Sun Spot e fez alguns movimentos, mostrando que o dispositivo poderia ser usado para calcular a velocidade da tacada. Dois projetos brasileiros foram apresentados, um deles criou uma API para exibir gráficos no celular , semelhante ao JFreeChart. O outro foi o Marge, framework para facilitar a criação de aplicações Blueetooth em Java. Bruno Ghisi e Lucas Torri falaram sobre o Marge na palestra seguinte, curiosamente usando o celular para avançar os slides da apresentação. Isso é possível por causa do mOOo, projeto que usa o Marge em um plugin do OpenOffice.org. Também mostraram um joguinho de Pong pelo celular, convidando dois voluntários da platéia para uma disputa. Muito legais a palestra e o projeto. Ah, veja na figura abaixo a razão da escolha do nome.



Consegui assistir algumas outras coisas legais, como suporte ao Ruby no NetBeans 6, desenvolvimento ágil com XP e Scrum, apresentado pelo time da Globo.com, e Engenharia e Software Livre: tudo a ver!. Não deu pra assistir, mas fiquei na vontade, as palestras sobre OpenJDK, OFBiz - ERP open source Java e, por curiosidade, uma sobre framework web para Smalltalk. No último dia tinha muito tema interessante, mas o FISL não é só feito de palestra. Circular pelo pavilhão e conversar com pessoas é tão importante quanto!

Se você ainda não teve a oportunidade participar, pode ir se programando desde já pros 10 anos de FISL em 2009. Dê uma navegada pela página principal do FISL, veja blogs, fotos e vídeos para obter informações de várias fontes e tirar suas próprias conclusões. A história recente vem nos mostrando que já passamos a barreira do convencimento. Agora, é como disse Maddog respondendo uma última pergunta: "Que o software livre vai vencer, não é uma questão de se, mas de quando".

sábado, 19 de abril de 2008

Tagged under:

JavaBahia no FISL - 2o Dia

No meu segundo dia de FISL, destaque para a palestra que seria do Simon Phipps, chefe do escritório open source da Sun, entitulada Adoption-Led: The Trend that is driving Free Software in open source communities. Seria porque de última hora Simon teve um problema no dente e não pôde viajar. Ainda assim, teve a gentileza de gravar um vídeo que foi exibido logo no início, justificando sua ausência, fazendo uma breve introdução sobre o tema e apresentando sua substituta, Jean Elliot, diretora sênior da divisão de marketing de produtos Java. No filme, Phipps explicou a transição dos modelos de negócio baseados em vendas de licenças de software para a oferta de serviços agregados, como suporte, correção de bugs, atualizações rápidas e um plano de serviços. É isso que ele chama de Adoption-Led Business Model.

Na sequencia, Jean fez um histórico sobre a transição que a Sun vem promovendo/sofrendo: de uma empresa fechada, e no passado criticada pela comunidade de SL, até a abertura do código dos seus principais produtos (Java, OpenSolaris, NetBeans, por exemplo) mandendo um canal constante de comunicação com as pessoas. Vale o grifo pela importância dada a esse "componente" às vezes deixado em segundo plano em detrimento à tecnologia. Com seu toque feminino, Jean foi mostrando as lições que a Sun vem aprendendo ao longo desses anos, destacando que "Coisas maravilhosas podem acontecer quando as pessoas se comunicam". Durante a jornada é preciso coragem, conhecimento, compaixão, paciência, perseverança, tempo e humor. A Sun sabe que a estrada é longa e não tem certezas sobre tudo, mas acredita estar no caminho certo.

Outra palestra interessante foi Apache Harmony : Building open-source Java from the Ground Up, de Geir Magnusson. O Harmony é um projeto da Apache Software Foundation criado antes do anúncio do OpenJDK, a implementação livre do Java. Geir falou sobre o projeto, sua situação atual (99,06% do Java 5 já funciona) e as principais dificuldades. Garantir que a implementação da Apache é realmente Java significa investir muito em automatização de testes e submeter o código ao Test Compatibility Kit (TCK). Enfim, quem ganha é o desenvolvedor, que poderá em breve escolher a implementação Java livre de sua preferência. Na saída da palestra, encontrei Gregg Sporar (que esteve conosco no I Simpósio Java do Sertão) e Gary Thompson, que está demonstrando o robô trackbot no stand da Sun. Após almoçarmos juntos, Gary me mostrou como funciona o "bichinho" e a API de programação do Sun Spot. Clique aqui se quiser saber mais.



Também vi a experiência da Dataprev com SL e comunidades, uma comparação do software proprietário com a dependência causada pelo tabaco e um painel falando sobre a divisão do espectro de rádio-frequencia brasileiro. Foi um dia de bastante informação e aprendizado, ufa!

(Enquanto digitava esse post, assisti 2 palestras do FISL por vídeo stream. É só identificar o número da sala na programação do evento e acessar a TV Software Livre.)

sexta-feira, 18 de abril de 2008

Tagged under:

JavaBahia no FISL 9.0 - 1o Dia

O maior evento do mundo do software livre acontece pelo 9o ano consecutivo no Brasil, em Porto Alegre. O Fórum Internacional de Software Livre 2008 reúne desenvolvedores, administradores de rede, afixionados por tecnologias, comunidades de usuários, gestores, políticos e, sim, programadores Java. Neste ano resolvir mandar posts diários sobre o que tenho visto de mais interessante, mas não espere só coisas ligadas a Java. Ultimamente tenho procurando muito mais entender o funcionamento do mundo do SL do que assuntos puramente técnicos. Bom... lá vai!

Gostei bastante da palestra Creación colaborativa de Empresas - Cooperativismo y Software Libre, ministrada pelo argentino Leandro Monk. contando sua experiência como fundador de uma cooperativa de trabalho em SL. Monk focou em aspectos interessantes como os princípios de adesão aberta e voluntária, controle de democrático e participação econômica dos sócios, autonomia e independência, e cooperação entre cooperativas. Como obstáculos, apontou e a falta de confiança e compromisso de sócios, juntamente com a burocracia governamental. As cooperativas de SL aparecem como alternativas ao modelo não tradicionais de trabalho. Na Bahia a Colivre é pioneira e pode te ajudar a entender melhor como esse mundo funciona.

Quanto a Java, tive boas conversas com profissionais da Sun, que só fortalecem a parceria com o JavaBahia. Também estive com Manoel Pimentel, do NetBeans User Group Brazil, que já passa dos 400 membros com menos de 1 ano e meio. No final da tarde fui convidado a apresentar o IRPF Java durante 1/2 hora para o Rich Sands, Community Marketing Manager do Java SE. Interessado nos desafios encontrados pela equipe de desenvolvimento e nas características técnicas da aplicação, Rich ficou impressionado com os números: Mais de 17 milhões de downloads e 8 milhões de declarações transmitidas (e o prazo para entrega sem multa ainda é no final de abril!).

Outra palestra que prometia uma boa discussão era a Artistas e Programadores: Como Interfaces de Usuarios Impactam o Movimento de Software Livre, conduzida pelos irmãos Ean e Erick Schuessler (da Brainfood). A idéia era debater, com mais alguns convidados, como designers e programadores poderiam se aproximar mais para criar aplicações de melhor usabilidade. Outra questão seria como envolver designers nos eventos e comunidades de SL. Do meio pro fim, perdeu-se um pouco o fio da meada, descambado para discutir coisas como "O Inkscape e o GIMP substituem o CorelDraw e o Photoshop" ou "existem opções livres para os softwares de design gráfico". Vou tentar conversar um pouco com eles para compreender melhor suas idéias, mas fiquei com a sensação de que o tema central deve ser retomado e debatido inclusive nas universidades.

Ao final do dia, o diretor-presidente do Serpro, Marcos Mazoni, apresentou a Política de SL do Serpro. Mesmo sendo funcionário da empresa, é sempre bom ouvir o quanto o Serpro e o governo Brasileiro estão atuando nessa questão. Ouvi repercussões positivas sobre sua fala. Podemos esperar cada vez mais participação ativa de funcionários públicos nas comunidades de usuários, bem como um aumento na contribuição entre empresas de governo, disponibilizando o código das suas soluções para a sociedade.

No post do 2o dia vou tentar colocar algumas fotos (dá uma Googlada) e falar mais um pouco de Java. Nada como participar pessoalmente, mas vou tentando dar uma idéia de como estão as coisas por aqui...

quinta-feira, 17 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 4ª parte

Para você que está chegando agora a este blog, saiba que estamos construindo uma aplicação web em uma seqüência de postagens (parte 1, parte 2 e parte 3) e, neste momento, construiremos o componente Web (veja arquitetura definida na parte 1) que irá “apresentar” o nosso sistema ao usuário.

Vá no menu Arquivo (File), Novo Projeto (New Project). Escolha a categoria Web e o tipo de projeto Aplicação Web (Web Application); clique no botão Avançar (Next). Dê o nome JavaBahiaWeb para o projeto, escolha a localização dele no seu computador e clique no botão Avançar (Next). Você agora terá que escolher o Servidor (Server) em que funcionará o sistema. Como o nosso sistema é simples, ele deverá funcionar em um container web simples como o Tomcat. Se não houver nenhum servidor listado nesta tela, você terá que adicioná-lo clicando no botão Adicionar (Add). No campo Caminho do Contexto (Context Path) escreva '/javabahia' (não esqueça da barra) e clique no botão Avançar (Next). Finalmente, marque o framework Visual Web JavaServer Faces, escreva no campo Pacote Java Padrão (Default Java Package) o valor 'javabahia.web' (não esqueça o ponto), e clique no botão Finalizar (Finish). O Netbeans abrirá para você o código da primeira página criada: Page1.jsp.

Clique com o botão direito do mouse no projeto recém criado, e escolha Propriedades (Properties). Selecione a categoria (categories) Bibliotecas (Libraries); clique no botão Adicionar Biblioteca (Add Library). Escolha a biblioteca que criamos na parte 2 (Hibernate) e clique em OK. Clique no botão Adicionar Projeto (Add Project), escolha o projeto JavaBahiaApp e clique no botão Adicionar JAR do Projeto(Add Project JAR Files). Por fim, clique no botão OK da janela de propriedades do projeto.

Neste post, iremos criar a tela de autenticação do usuário para acessar o sistema. Para isso, vamos renomear a página que foi automaticamente criada – Page1.jsp – para PageLogin.jsp. Clique com o botão direito do mouse em cima do arquivo Page1.jsp, clique em Refatorar (Refactor), depois em Renomear (Rename). Digite o novo nome no campo Novo Nome (New Name) e depois clique em Refatorar (Refactor).

Agora, crie a tela conforme a imagem abaixo, e configurando as propriedades dos componentes da tela de acordo com a tabela a seguir.


-------------------------------------------------------------------------------------
Tipo ! Id ! Propriedades ! Observações
GridPanel ! panelCampos ! {columns:2} ! ---
TextField ! txtLogin ! --- ! Coloque dentro de panelCampos.
Label ! lblLogin ! {for:txtLogin, text:Login} ! Coloque dentro de panelCampos.
PasswordField ! txtSenha ! --- ! Coloque dentro de panelCampos.
Label ! lblSenha ! {for:txtSenha, text:Senha} ! Coloque dentro de panelCampos.
GridPanel ! panelBotoes ! {columns:2} ! ---
Button ! btnAcessar ! {text:Acessar} ! Coloque dentro de panelBotoes.
Button ! btnLimpar ! {text:Limpar} ! Coloque dentro de panelBotoes.
MessageGroup ! grpMsg ! --- ! ---
-------------------------------------------------------------------------------------

Procure no pacote 'javabahia.web' a classe SessionBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuarioLogado;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Agora, procure no pacote 'javabahia.web' a classe RequestBean1.java, e abra-a no editor de código do Netbeans. Digite, bem abaixo da seção Definição de Componentes Gerenciados (Managed Component Definitions), a seguinte linha:

private Usuario usuario;

Clique com o botão direito do mouse no código e clique em Corrigir Imports (Fix Imports) para o Netbeans fazer a importação da classe javabahia.entidade.Usuario. Clique novamente com o botão direito e escolha Refatorar (Refactor), Encapsular Campos (Encapsulate Fields). Marque para criar o get e o set, e clique em Refatorar (Refactor).

Digite, dentro do método init(), bem abaixo da seção Inicialização de Componentes Gerenciados (Managed Component Initialization), a seguinte linha:

setUsuario(new Usuario());

Volte à página PageLogin.jsp, com o editor visual aberto (design). Clique com o botão direito do mouse em cima do campo de texto txtLogin, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade login do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do campo de texto txtSenha, e clique em Associar a Dado (Bind To Data). Clique na aba Associar a um Objeto (Bind to an Object), e selecione a propriedade senha do objeto Usuario que está dentro do objeto RequestBean1. Clique em OK para finalizar a associação.

Clique com o botão direito do mouse em cima do projeto JavaBahiaWeb, e selecione Novo (New), Página JSF da Web Visual (Visual Web JSF Page). Digite PagePrincipal no campo Nome do Arquivo (File Name) e clique em Finalizar (Finish). Abra o arquivo faces-config.xml na seção Arquivos de Configuração (Configuration Files) e o Netbeans lhe exibirá as páginas até o momento criadas. Clique em cima de btnAcessar, dentro de PageLogin.jsp, e arraste o mouse até PagePrincipal.jsp, soltando-o. Clique em cima da linha desenhada para selecioná-la, pressione as teclas Control+R, e renomeie case1 para acessoLiberado, conforme mostra a figura abaixo.

Falta ainda criar o evento que será disparado quando o usuário clicar no botão para entrar no sistema. Clique com o botão direito do mouse em cima do botão btnAcessar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). O Netbeans abrirá automaticamente o editor de código, posicionando o cursor dentro de um método recém-criado. Esse método executará o que deverá ser feito para processar a ação do usuário. Digite o seguinte código:

public String btnAcessar_action() {
JavaBahiaFacade facade = new JavaBahiaFacade();
Usuario uReq = getRequestBean1().getUsuario();
Usuario usuario = facade.obterUsuarioPorLoginSenha(uReq.getLogin(), uReq.getSenha()); if (usuario != null) {
getSessionBean1().setUsuarioLogado(usuario);
} else {
error("Não foi possível encontrar o usuário a partir do login/senha informado(s).");
}
return "acessoLiberado";
}

Volte ao editor visual da página PageLogin.jsp (clique no botão Design no topo da janela de código), clique com o botão direito do mouse em cima do botão btnLimpar e clique em Manipulador do Evento da Ação (Edit Action Event Handler). Digite o seguinte código:

public String btnLimpar_action() {
getRequestBean1().setUsuario(new Usuario());
return null;
}

Antes de acessarmos a nossa aplicação, teremos que inserir um registro na tabela Usuario do banco de dados.

INSERT INTO usuario VALUES('teste','teste','Usuário de Teste','teste@javabahia.dev.java.net');

Para os usuários mais avançados, já podem executar esse código, usando o Tomcat, e testar a autenticação. Aos usuários iniciantes, tenham um pouco de calma pois está chegando o grande final. No próximo post, mostrarei como executar esse código e terminaremos de construir nossa aplicação, criando as telas de interface para as entidades Empresa e Contrato. Até lá!

segunda-feira, 14 de abril de 2008

Tagged under: , ,

Tem Java no Sertão!

O SertãoJUG iniciou oficialmente suas atividades em grande estilo: O I Simpósio Java do Sertão foi um sucesso de público e organização! O JavaBahia está orgulhoso em ser parceiro de um grupo de pessoas tão interessado e competente, que se esmerou em cuidar do evento em seus mínimos (mas não menos importantes) detalhes.

Particularmente, foi um dos melhores eventos que já participei. Infelizmente não pudemos estar desde o início, pois Bruno Souza e Gregg Sporar chegaram no sábado de manhã. Na ida de Salvador para Feira, tivemos (eu e Carlos "Bob" Alberto - JavaBahia, Bruno Souza e Gregg Sporar - Sun, e Daniel deOliveira - DFJUG) um papo riquíssimo e animado sobre Fábricas de Software e o cenário brasileiro de TIC. Ao chegar, Bruno e Daniel começaram a tirar fotos sem parar. Algumas podem ser vistas em javabahia.fotopages.com.

Durante o evento, ficamos impressionados com o nível de interesse da platéia. Num dia ensolarado de sábado, a maioria marcou presença até o final. E ainda tiveram a chance de tirar algumas fotos com os palestrantes, ganhar um Pen-drive do NetBeans, uma revista Mundo Java ou um outro brinde qualquer.

Na pessoa de Aécio Júnior, parabenizamos todos os membros do SertãoJUG. Agradecimentos especiais à CPM Braxis, UEFS, DFJUG, Sun e à Vegah Traduções, amigos e parceiros de tantas jornadas.

Agora, já ficamos pensando em qual será (e quando) o próximo evento...
Posted by Picasa

quarta-feira, 9 de abril de 2008

Tagged under: ,

Desenvolvendo uma aplicação web de forma fácil e prática – 3ª parte

Continuando os posts anteriores (parte 1 e parte 2), iremos, nesta terceira parte, inicialmente, criar as classes de persistência, popularmente conhecidas como classes DAO (Data Access Objects).

Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como UsuarioDao e escreva no campo Pacote (Package), o valor 'javabahia.dao'; clique no botão Finalizar (Finish).

O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código mostrado a seguir:

***


public class UsuarioDao {

private EntityManager em;

public UsuarioDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
usuario = em.merge(usuario); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(usuario); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Usuario usuario) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select u from Usuario u");
return qry.getResultList();
}

public Usuario obterPorChave(String login) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1");
qry.setParameter("param1", login);
return (Usuario) qry.getSingleResult();
}

public Usuario obterPorLoginSenha(String login, String senha) {
Query qry = em.createQuery("select u from Usuario u where u.login = :param1 and u.senha = :param2");
qry.setParameter("param1", login);
qry.setParameter("param2", senha);
return (Usuario) qry.getSingleResult();
}
}


***

Vamos às explicações sobre alguns trechos de código.

private EntityManager em;
// (...)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();

Essa é a forma como obtemos uma instância da classe EntityManager, responsável pelas operações de persistência dos objetos. As entidades persistentes são associadas a um contexto de persistência (a classe Persistence) e precisam de um provedor de persistência para mostrar como as “coisas” funcionam. As configurações utilizadas pelo provedor de persistência são descritas no arquivo persistence.xml, dentro da pasta META-INF, e nomeadas por uma unidade de persistência (persistence unit).

em.getTransaction().begin();
// (...)
em.getTransaction().commit();
// (...)
em.getTransaction().rollback();

Estas linhas de código servem para, respectivamente, abrir uma transação, finalizar uma transação, e desfazer uma transação.

usuario = em.merge(usuario);

O método merge() coloca o objeto no estado gerenciado pelo contexto de persistência e o insere, ou atualiza-o, no banco de dados. Ele sempre devolve o objeto atualizado pelo banco de dados.

Usuario ref = em.find(Usuario.class, usuario.getLogin());
em.remove(ref);

O método remove() retira o objeto da gerência do contexto de persistência, o que levará o Hibernate a excluí-lo do banco de dados. Antes de remover o objeto, precisamos atualizar a referência do objeto; senão, uma exceção será lançada pelo EntityManager.

Agora, crie também os arquivos EmpresaDao, ContratoDao, e ContratadaDao, lembrando de colocá-los no mesmo pacote 'javabahia.dao'.

***


public class EmpresaDao {

private EntityManager em;

public EmpresaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
empresa = em.merge(empresa); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(empresa); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Empresa empresa) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Empresa ref = em.find(Empresa.class, empresa.getCnpj());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select e from Empresa e");
return qry.getResultList();
}

public Empresa obterPorChave(String cnpj) {
Query qry = em.createQuery("select e from Empresa e where e.cnpj = :param1");
qry.setParameter("param1", cnpj);
return (Empresa) qry.getSingleResult();
}
}


***


public class ContratoDao {

private EntityManager em;

public ContratoDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
contrato = em.merge(contrato); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contrato); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contrato contrato) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contrato ref = em.find(Contrato.class, contrato.getNumero());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contrato c");
return qry.getResultList();
}

public Contrato obterPorChave(Integer numero) {
Query qry = em.createQuery("select c from Contrato c where c.numero = :param1");
qry.setParameter("param1", numero);
return (Contrato) qry.getSingleResult();
}
}


***


public class ContratadaDao {

private EntityManager em;

public ContratadaDao() {
// criação do entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaBahiaAppPU");
em = emf.createEntityManager();
}

public void close() {
em.close();
}

public void inserir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void atualizar(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
contratada = em.merge(contratada); // persiste o objeto e devolve-o sincronizado

em.getTransaction().commit(); // encerra a transação

em.refresh(contratada); // atualiza a referência do objeto

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public void excluir(Contratada contratada) {
em.getTransaction().begin(); // abre uma transação

try {
// atualiza a referência do objeto antes de removê-lo
Contratada ref = em.find(Contratada.class, contratada.getContratadaPK());
em.remove(ref); // remove o objeto

em.getTransaction().commit(); // encerra a transação

} catch (Exception e) {
em.getTransaction().rollback(); // desfaz a transação

}
}

public List obterTodos() {
Query qry = em.createQuery("select c from Contratada c");
return qry.getResultList();
}

public Contratada obterPorChave(ContratadaPK pk) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.cnpjempresa = :param1 and c.contratadaPK.numerocontrato = :param2");
qry.setParameter("param1", pk.getCnpjempresa());
qry.setParameter("param2", pk.getNumerocontrato());
return (Contratada) qry.getSingleResult();
}

public List obterPorNumeroContrato(Integer numeroContrato) {
Query qry = em.createQuery("select c from Contratada c where c.contratadaPK.numerocontrato = :param1");
qry.setParameter("param1", numeroContrato);
return qry.getResultList();
}

public List obterPorCnpjEmpresa(String cnpjEmpresa) {
Query qry = em.createQuery("select c from Contratada c where c.cnpjempresa = :param1");
qry.setParameter("param1", cnpjEmpresa);
return qry.getResultList();
}
}


***

Criadas as classes de persistência, vamos agora criar a classe que irá encapsular todo esse subsistema: o Façade. Clique com o botão direito no nosso projeto, e escolha a opção Novo (New), Classe Java (Java Class). Na caixa de diálogo que se abre, nomeie a classe (Class Name) como JavaBahiaFacade e escreva no campo Pacote (Package), o valor 'javabahia'; clique no botão Finalizar (Finish). O Netbeans abrirá o editor de código para a classe recém-criada. Digite o código como é mostrado a seguir:

***


public class JavaBahiaFacade {

   
public JavaBahiaFacade() {
   
}

   
public Usuario obterUsuarioPorLoginSenha(String login, String senha) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorLoginSenha(login, senha);
       
dao.close();
       
return obj;
   
}

   
public Usuario obterUsuarioPorLogin(String login) {
       
UsuarioDao dao = new UsuarioDao();
       
Usuario obj = dao.obterPorChave(login);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosUsuarios() {
       
UsuarioDao dao = new UsuarioDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.inserir(usuario);
       
dao.close();
   
}

   
public void atualizarUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.atualizar(usuario);
       
dao.close();
   
}

   
public void excluirUsuario(Usuario usuario) {
       
UsuarioDao dao = new UsuarioDao();
       
dao.excluir(usuario);
       
dao.close();
   
}

   
public Empresa obterEmpresaPorCnpj(String cnpj) {
       
EmpresaDao dao = new EmpresaDao();
       
Empresa obj = dao.obterPorChave(cnpj);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasEmpresas() {
       
EmpresaDao dao = new EmpresaDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.inserir(empresa);
       
dao.close();
   
}

   
public void atualizarEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.atualizar(empresa);
       
dao.close();
   
}

   
public void excluirEmpresa(Empresa empresa) {
       
EmpresaDao dao = new EmpresaDao();
       
dao.excluir(empresa);
       
dao.close();
   
}

   
public Contrato obterContratoPorNumero(Integer numero) {
       
ContratoDao dao = new ContratoDao();
       
Contrato obj = dao.obterPorChave(numero);
       
dao.close();
       
return obj;
   
}

   
public List obterTodosContratos() {
       
ContratoDao dao = new ContratoDao();
       
List lista = dao.obterTodos();
       
dao.close();
       
return lista;
   
}

   
public void inserirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.inserir(contrato);
       
dao.close();
   
}

   
public void atualizarContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.atualizar(contrato);
       
dao.close();
   
}

   
public void excluirContrato(Contrato contrato) {
       
ContratoDao dao = new ContratoDao();
       
dao.excluir(contrato);
       
dao.close();
   
}

   
public Contratada obterContratadaPorContratoEmpresa(Integer numeroContrato, String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
ContratadaPK chave = new ContratadaPK();
       
chave.setNumerocontrato(numeroContrato);
       
chave.setCnpjempresa(cnpjEmpresa);
       
Contratada obj = dao.obterPorChave(chave);
       
dao.close();
       
return obj;
   
}

   
public List obterTodasContratadasPorContrato(Integer numeroContrato) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorNumeroContrato(numeroContrato);
       
dao.close();
       
return lista;
   
}

   
public List obterTodasContratadasPorEmpresa(String cnpjEmpresa) {
       
ContratadaDao dao = new ContratadaDao();
       
List lista = dao.obterPorCnpjEmpresa(cnpjEmpresa);
       
dao.close();
       
return lista;
   
}

   
public void inserirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.inserir(contratada);
       
dao.close();
   
}

   
public void atualizarContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.atualizar(contratada);
       
dao.close();
   
}

   
public void excluirContratada(Contratada contratada) {
       
ContratadaDao dao = new ContratadaDao();
       
dao.excluir(contratada);
       
dao.close();
   
}
}


***

Com isso, finalizamos o nosso componente Aplicação. Agora nos resta construir o componente Web, o qual será a nossa interface com o exemplo que estamos desenvolvendo. Isso ficará para o próximo post. Até lá!

PS: Os arquivos .java foram disponibilizados no serviço 4Shared mas foram apagados após um tempo de inatividade de minha conta. Por isso, colei o código das classes no meio do texto desse post e retirei os links originais.