Feed Artigos Comentários

Java Hildebrando em 04 Nov 2006

Desenvolvimento de Aplicativos para dispositivos móveis.

A ideia de desenvolver um aplicativo para um celular ou PDA envolve um plano diferente. Parece que você esta entrando em um seleto grupo de profissionais, aquela força tarefa que faz as coisas acontecerem. Você esta saindo do arroz com feijão WEB-Struts-Hibernate (Arroz-com-feijão bem servido por sinal).

Na semana passada fiz um mentoring para uma grande empresa integradora de telefonia, e como havia muita comparação entre tecnologias, quero compartilhar algumas ideias.

Primeiramente vou tratar neste artigo da tecnologia J2ME (Java Micro Edition). Apresentar alguns pontos e após você estar craque vamos aos obstáculos.

1 - Inicio

Java você ja sabe, então precisamos aplicar este conhecimento em APIs diferentes. A boa notícia é que as specs para trabalhar com J2ME são simples. Pense que para programar para um celular os seus recursos são limitados e portanto o que diferencia é a forma como você deve utiliza-las.

Existem muitas ferramentas com plugins para tratamento deste mercado móvel. Vamos fugir delas, por enquanto.

Comece baixando o WTK da Sun - Sun Java Wireless Toolkit 2.2. A Sun possue um Kit (gratuito) para desenvolvimento de J2ME. A maioria dos fabricantes possue o seu, com a vantagem da utilização de emuladores do próprio. Porém isso não afeta em nada o seu software, apenas pode deixar voce mais confortavel em determinados trabalhos. Obrigatório porém se o que você procura é utilizar as APIs proprietárias.

A instalação é muito simples. Famoso Next,Next,Finish.

2 - Código

O WTK é um empacotador de projetos, ou seja, ele não é um editor/compilador. Sua unica tarefa é criar o seu projeto, organizando seus arquivos em pastas específicas e construção do pacote para deploy. Para completar ele possue alguns emuladores para você testar seu código.

Comece criando seu projeto no WTK.

a) Execute o Ktoolbar
b) New Project [Project Name : WhereIsWally][MIDlet Name : WhereIsWally]
c) Mude em ‘Configurations’ para CLDC 1.1

Seu diretorio de trabalho será:

\WTK22\apps\WhereIsWally\src

Todo aplicativo que você for desenvolver deve seguir um contrato de código. Este contrato é estabelecido pela classe abstrata javax.microedition.midlet.MIDlet. Por tanto abra o seu editor Java favorito e construa esta classe.


public class WhereIsWally extends MIDlet {
}

A ideia de você estender da classe MIDlet é tanto para herdar alguns metodos quanto para definir outros.


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class WhereIsWally extends MIDlet {
public void startApp() {
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

Ao digitar este codigo lembre-se de adicionar no classpath do seu editor ou do sistema os jars midpapi20.jar e cldcapi11.jar. Ambos estão no diretorio lib, dentro do diretorio de instalação do WTK.

Os metodos apresentados acima são chamados de métodos de ciclo de vida e como o nome de cada um ja descreve são invocados a cada mudança de estado. Portanto lembre-se quem chama estes métodos é o Dispositivo móvel, e não o seu código.

Assim toda vez que o MIDlet for inicializado, o método startApp sera invocado, por exemplo.

3 - Código Usual

Para prosseguirmos com o processo de aprendizado você deve rechear os métodos com chamadas a API JME. E é somente estas APIS que podem ser utilizadas. Lembre-se que você esta desenvolvendo não mais com JSE, portanto algumas funcionalidades foram retiradas. A classe String por exemplo perdeu muitos dos seus métodos, a classe Math também, o pacote io mais ainda, as bibliotecas graficas AWT e SWING não existem. E muitas outras coisas.

Portanto para você saber o que você pode utilizar veja a documentação referente ao CLDC - JSR139. Imagine esse CLDC como o conjunto de classes fundamentais.

Porém só o CLDC não vai te levar a muito lugar não. Você precisa utilizar de recursos mais funcionais como acesso a chamadas HTTP por exemplo, ou utilização de sons e animações. Para isso voce deve conhecer o Profile MIDP - JSR118. Pense em Profile como recursos adicionais a parte core.

As APIs são curtas no entanto com um certo grau de complexidade (senão não existiram cursos de JME). Para impressionar seus amigos faça um programa bem básico.


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class WhereIsWally extends MIDlet {
public void startApp() {
Alert alert = new Alert("Titulo","Texto no Alerta",null,AlertType.INFO);
Display.getDisplay(this).setCurrent(alert);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
}

WTK >> Build >> Run

Esse é o HelloWorld. As APIS são simples, e bem organizadas. Seguindo sua estrutura hierárquica da para entender bem o que pode se colocar na tela ou não.

4 - High-level

Em JME existe a categoria de componentes de alto nível como o Alert, utilizado no exemplo anterior. A principal caracterítica deles é a facilidade na utilização, porém com isso é sacrificado a parte de customização, que pode ser essencial em alguns projetos. Existem outro componentes como o TextBox, List e o Form que também estão na mesma categoria. O principio da utilização deles é o mesmo. Instanciar um objeto e chamar o Display.getDisplay(this).setCurrente(objeto_criado).

O Form é o mais utilizado pois este possibilita agregar outros componentes dentro dele. Todos os filhos de Item. Assim montando uma tela com vários componentes.

5 - Low-level

E se você quiser criar uma tela de Splash ou um botão customizado ou mesmo um gráfico? Para isso você precisa conhecer os componentes de low-level, ou seja, aqueles que você vai desenhar, tratar eventos de tecla e tudo mais. Na AWT existe um objeto com essa funcionalidade. É o Canvas. Então no desenvolvimetno JME ele esta de volta, porém com algumas limitações, mas seguindo o mesmo modelo de desenhar utilizando o objeto Graphics (drawString, fillRect, etc).

6 - Jogos

Os jogos ganharam o pacote javax.microedition.lcdui.game (MIDP 2.0). Use e abuse deste pacote pois ele contem inumeras vantagens sobre o canvas no que se refere a parte de buferização para atualização da tela, essencial em jogos para garantir o dinamismo.

7 - Eventos

O tratamento de eventos é diferente para High-level, low-level e games. Para os de alto nível você precisa criar Listeners, parecido com o padrão AWT/Swing. Para os de low-level voce captura as teclas sobreescrevendo métodos específicos por ação como keyPressed. Para os games o tratamento é um pouco diferente pois obriga a verificação se o botão foi apertado através do start() de uma Thread. Esta garante a velocidade do jogo também.

8 - GCF

Generic Connection Framework é o comunicador com qualquer coisa. Se você quer abrir um Socket, enviar uma requisição HTTP ou enviar um SMS é através deste conjunto de classes que você vai conseguir. Pela especificação somente HTTP e HTTPS são mandatórios no MIDP 2.0, portanto você deve verificar se o dispositivo suporta as outras formas.

9 - Fim

Agora que você ja conhece boa parte da API e algumas funcionalidades vamos adiantar algumas restrições.

1 - Componente de High-level é de alto-nível mesmo. Se você não achar o método que o customize, esqueça. Quem o implementa é o dispositivo, assim se você manda abrir um Alert, este sera apresentado de acordo com o Alert do dispositivo.

2 - Para customizar um componente de High-level tente antes criar um com o CustomItem. Somente se não tiver possibilidade de adapta-lo baixe o nível para Canvas.

3 - A implantação em um celular envolve a geração de 2 arquivos, um JAR e um JAD. o JAD é um arquivo texto com um conjunto de pares chave/valor que descrevem sua aplicação, o arquivo JAR contem as suas classes compactadas. Para fazer a atualização do aplicativo no dispositivo utilize sempre o AMS (Gerenciador de Aplicações) pois nele podem ser configuradas regras de segurança. Para protegere seu codigo procure utilizar ofuscadores. Estes conseguirão embaralhar o codigo de forma que se alguem descompilar o seu JAR perderá muito tempo para entender seu algoritmo.

4 - Recurso vale ouro. Procure sempre declarar tipos pequenos como byte e short. Procure desenvolver regras de reutilização de objetos.

Desenvolvimento de Software Hildebrando em 17 Out 2006

Quer ser um desenvolvedor Java?

Utilizo a tecnologia Java em todos os projetos da 2Solutions, com raras excessões. Com isso acabei me tornando um especialista. Tenho consciência que não sei tudo, aliás acredito que não existe aquele “especialista de tudo”.

Quero indicar alguns caminhos para qualquer um virar um especialista Java. Com certeza ja existe algum texto semelhante na internet (google), no entanto quero fazer uma coisa diferente, focada no perfil do nosso pessoal. E como eles viraram especialistas também.

1 - Faça uma faculdade de tecnologia
Existe muita discussão neste assunto, precisa ou não precisa fazer uma faculdade para entrar no mercado de trabalho de TI. Uma coisa que aprendi na minha carreira de instrutoria Java é que só o fato de a pessoa fazer uma faculdade, as coisas acabam fluindo mais fáceis. Se você vai fazer ou não, fica a seu criterio, porém saiba que nem todo mundo é auto-didata, inclusive a grande minoria. Mesmo a faculdade sendo dispersiva em alguns assuntos, como as inúmeras materias de matemática em Ciência da Computação, tudo acaba agregando na sua formação.

2 - Faça um curso de Java
Existem livros, tutorias, apostilas, exemplos e mini-cursos que ajudam muito no seu aprendizado. Porém você tem que ter experiência com este estudo auto-didata. Exige disciplina e organização. A ideia de fazer curso envolve apenas 2 variaveis. Tempo e dinheiro. Se você tem tempo e não tem dinheiro estude em casa. Se você tem dinheiro e não tem tempo faça um curso.

Java em si é uma lingaguem simples.O grande problema é a parte de orientação a objetos. Isso é complicado. Envolve conceitos de alto nivel e abstrações. Aprender Java é diferente de aprender VB que você compra uma revista na banca e naquele mesmo dia você ja tem algo funcionando. É por isso que eu indico fazer cursos.

3 - A unica coisa que começa de cima é buraco
Tradução para paciência. Nesta hora precisamos ter humildade e seguirmos o papel de aprendiz. Você pode ser especialista em outras linguagens ou ja ser um cara que conhece muito de Hardware, no entanto com linguagens de programação o papo é diferente. Voce tem que aprender as manhas. Apanhar muito. E acima de tudo pergutar. Entre em foruns e listas de discussão. Mande duvidas, sempre seguindo as boas maneiras nestes ambientes.

4 - Arrume um trabalho na área
Essa parte é a mais difícil, porque as empresas so querem gente com experiência. Dai aparece o problema do ovo e da galinha. Sugestão: Faça projetos seus. Desenvola uma agenda, um cadastro de estoque da sua casa, um controle de gastos com combustível. Eu faço um trabalho de seleção aqui na empresa e para mim um projeto pessoal ou academico serve sim como experiência, e inclusive tem um atrativo a mais pois demonstra pró-atividade.

5 - Banco de Dados
Não pense em se tornar um especialista de banco de dados. Você tem que conhecer SQL. O banco é indiferente. Mas aproveite e faça o seguinte. Entre no site do MySQL e baixe o MySQL e suas ferramentas. Falo do MySQL pois considero a versão para Windows muito NNF (Next,Next,Finish), isso é bom para quem esta começando. Fazer um curso de SQL pode te ajudar muito, porém não é imprescindível, SQL é um pouco mais simples que as linguagens de programação de alto nível. Porém cai naquele mesmo assunto que conversei.

6 - Tenha contatos da área
Não estou falando em ter melhores amigos na área e sim formar uma rede de conhecidos que tenham o gosto pela tecnologia como característica comum. Nos cursos voce conhece muita gente, outros lugares são os eventos. Acho que as unicas panelas que existem nos eventos são dos que estão palestrando e dos que não estão palestrando. Não precisa comprar o livro ‘como fazer amigos’, apenas vai se misturando com pessoas que estão em situações parecidas com a sua. Isso vai ajudar a todos.

7 - Atividades e Cronograma (Estratégia Auto-didata freestyle)

a) Compre um livro de Java Fundamentos - 1 dia
b) Leia o livro (pois é, só comprar não adianta) - 1 mês - Se você achou muito é porque nunca leu um livro de tecnologia. Estas não são leituras narrativas. Você tem que sempre voltar, reler e refazer exercícios.
c) Compre um outro livro de JEE - 1 dia - Esta parte JEE é a que envolve WEB e Serviços de mais alto nível. Resumindo, é aonde esta o dinheiro ($$$$$). NUNCA COMECE POR UM LIVRO DE JEE SEM ANTES PASSAR PELOS FUNDAMENTOS.
d) Leia o livro, faça os exercícios e desenvolva um sistema de cadastro de Jogadores de futebol. Utilizando JSP/Servlets e JDBC - 1 mês
e) Desenvolva um outro sistema de cadastro, porém agora um de animais em um zoologico - 1 mês
f) Faça o seu curriculum ja incluindo os projetos que você desenvolveu. Junto a isso vá estudando frameworks de mercado como Struts e Hibernate - 1 mês

Não quero discutir a qualidade do profissional após o cronograma. No entanto você ja esta encaminhado para iniciar no mercado. É isso mesmo, INICIAR. Você é um iniciante no assunto. Tem muito que aprender. Uma faculdade ira te ajudar e muito nisso, porém tenha paciência. Quanto a dinheiro e conhecimento. Não queira aprender tudo e seja humilde o suficiente para aceitar a sua situação de aprendiz.

Boa Sorte

Dicas & Tutorias Hildebrando em 15 Out 2006

Entendendo e aproveitando XML DOM com Javascript.

Trabalhar com XML envolve a criação/leitura de um documento texto. Esta é a definição mais simples para as tarefas de XML, porém destas podemos ramificar em diversos parsers e validadores que a complexidade aumenta em progressão geométrica.

Neste texto que escrevo quero destacar a leitura de um XML via Javascript. Você ira precisar disto em toda situação que o servidor envia para o cliente um arquivo XML que deve ser interpretado.

Existem inumeros frameworks para isso, inclusive outras estratégias mais elegantes como a transformação do XML com XSL.

Como AJAX esta na moda vamos contextualizar nas chamadas assincronas o XML.

Primeiramente, adicione a API DOM no seu bookmark (http://www.howtocreate.co.uk/tutorials/javascript/domstructure). Este link não é do W3.com mas detalha de forma bem estruturada a API.

1 - Declarando um XML


var responseXML = '<response>'+
'<messages>'+
'<total>30</total>'+
'<message>'+
'<sender>Joao do Caminhao</sender>'+
'<text>Quero saber mais...</text>'+
'</message>'+
'<message>'+
'<sender>Atendente 01</sender>'+
'<text>Ja irei verificar senhor</text>'+
'</message>'+
'</messages>'+
'<status>O usuario esta digitando uma mensagem</status>'+
'<fault>skjdcnskjdncjksdnc</fault>'+
'</response>';

Declarando uma string com conteudo XML.

2 - Utilizando o parser do browser

Alguém precisa fazer o trabalho da leitura do elementos/atributos do XML. Todo browser que suporta elementos DOM possue um parser. Para você poder utiliza-lo pode declarar as linhas abaixo para criar uma referencia do documento associado ao parser. Estas linhas ja indicam parsers Cross-browsers.


var xmldoc = null;
if (window.ActiveXObject) {
xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async="false";
xmldoc.loadXML(responseXML);
} else {
var parser = new DOMParser();
xmldoc = parser.parseFromString(responseXML,"text/xml");
}

O elemento de resultado é o xmldoc e é a partir dele que iremos percorrer os nós do XML.

3 - Acessando os Nodes

var response = xmldoc.getElementsByTagName('response');

No exemplo acima eu quero recuperar a tag do XML. Porem assim como a assinatura do xmldoc indica o resultado é um vetor. Detalhe, se não existir esta tag, é retornado um vetor com tamanho 0.

alert(response[0].tagName)

tagName ira retornar o nome da tag. No entanto o mais importante dela são os nós internos ou seu valor.

Os Nodes internos a esta tag são acessados com outro método.


if(response[0].hasChildNodes()){
for(var k = 0 ; k < response[0].childNodes.length ; k++){
alert(response[0].childNodes[k]);
alert(response[0].childNodes[k].nodeValue);
}
}

Tudo ira depender de como esta formado o seu documento XML. Porem com isso ja podemos montar metodos auxiliares para facilitar a navegação nos Nodes.

4 - Utilizando tudo isso com AJAX

Imagine a situação que uma chamada assíncrona ira retornar as informações de endereço, baseado em um numero de cep.

XML Resultado


Av. Javascript DOM
EMACS
São Paulo
SP

Para recuperar os dados pode-se usar variações do método abaixo :


var cep = xmldoc.getElementsByTagName('response')[0]; //Ja retornar o Node
if(cep.hasChildNodes()){
for(var k = 0 ; k < cep.childNodes.length ; k++){
var valor = cep.childNodes[k].nodeValue;
if(cep.childNodes[k].tagName == 'bairro'){
//..>Atribuir o valor no campo bairro….
}
//…>E assim por diante
}

Desenvolvimento de Software Hildebrando em 27 Set 2006

Boas maneiras na manutenção em sistemas de terceiros.

Como se comportar quando cai no seu colo um sistema que não foi você quem desenvolveu?

Antes de mais nada quero explicar o porque da escolha de ‘Boas maneiras’ ao invés de ‘Boas práticas’. Boas maneiras esta ligada a boas práticas porém com a adição de ética e postura. Quando mexemos em um software desenvolvido por outra pessoa, precisamos lembrar que foi um companheiro de profissão que fez o trabalho. Falar mal, questionar e duvidar do Software em questão deve ser feito com muito cuidado e ética.

O cénario de mexer em um sistema de terceiro é muito comum, inclusive alguns sistemas acabam se tornando verdadeiros desafios. Só o fato de você ter de entender a arquitetura utilizada (quando tem) além da regra de negócio pode te comsumir muito mais horas do que o esperado. Para evitar noites sem dormir preparei uma cartilha que pode ajuda-lo nestas tarefas:

1 - Diretorios e arquivos do projeto

Faça um levantamento de todos os diretorios do projeto. Crie um documento texto com a lista de todos os diretorios e pacotes com um indicativo de qual a funçao do respectivo diretorio/arquivo no projeto.

Este levantamento vai te ajudar muito com uma visão de alto nível sobre as diferentes entidades envolvidas no projeto. É nesse momento que podemos identificar as camadas, as boas práticas e as convenções de nomenclatura.

Após entender a estrutura do sistema faça uma segunda análise com o objetivo de identificar os frameworks envolvidos e os arquivos de configuração (.properties e .xml)

Comportamento:
Mudanças na estrutura ou nomenclatura de pacotes só são aceitos em situações de Refactoring (alterar o codigo sem alterar funcionalidade). As vezes encontramos fulgas de padrões que realmente nos incomodam. Diretorios em português e inglês, nome de pacotes em maiusculo, etc. e mesmo assim devemos nos controlar e eveitar qualquer mudança. Lembre-se estamos na fase de Analise ainda.

2 - Depuração

Execute a aplicação em modo DEBUG. Realize operações simples e siga o fluxo de mensagens. Identifique entidades com papéis essencias como ServiceLocator, DAO, Factory, BusinessDelegate, Façade.

Neste momento você esta entendendo como funciona a arquitetura. A utilização de uma ferramenta de engenharia reversa para gerar um diagrama de sequencia e um diagrama de classe pode te ajudar muito.

Os modelos nesta situação servem para uma identificação mais detalhistas. Porém não se atenha somente aos modelos. Execute o programa. Veja as mensagens.

Comportamento:
Perca um tempo nesta etapa. Faça pesquisas, cadastrados e relatórios. Identifique a maioria das funcionalidades. Lembrando mais uma vez, ainda estamos na etapa de Analise. Não faça modificações.
Nesta etapa inclusive surgem as primeiras críticas ao software. Porque dessa classe vai para essa? O cara usou o DAO diferente dos projetos que eu estou acostumado? Poderiamos criar uma interface aqui ou ali.

3 - Começe pelo fácil

Na lista de novas funcionalidades a serem aplicadas no sistema, com certeza existem aquelas fáceis. Alinhamento de campo, formatação, validação. Comece por estas. Com isto você estará se familiarizando com a arquitetura, com a organização de arquivos e diretórios. Na comece pelas difíceis pois estas exigem um conhecimento de regra de negócio, que talvez você ainda não tenha.

Comportamento:
Ao fazer uma alteração, inclusão ou exlusão de código faça comentários. Mesmo que seja a inclusão de um atributo. Para os comentários utilize um identificar ligado a nova funcionalidade. Algo como

//NF0600505:Hildebrando Furlan Neto:Inclusao de if para validacao

O significado de NF é ‘New Feature’. Isto nao é um padrão, porém serve como controle para uma possível estatística de mudança. Adote o seu padrão. Converse com os outros envolvidos no projeto para seguirem este padrão.

4 - Testes unitários

Agora sim você consegue entender o porque da utilização de testes unitários é tão importante. Se ainda nao existe metodos de teste, crie-os. Isso ajuda inclusive para entender o algoritmo executado. Uma modificação em algo que esta funcionando deve ser feita com cautela. Com testes unitarios você tera um maior controle se o que você esta fazendo pode estar impactando em outras partes do Software.

Comportamento.
Siga o mesmo modelo de testes. Se for proprietário utilize o mesmo padrão. Caso nao possua, utilize um framework de testes como o JUnit e começe documentando alguns métodos de consistencia. Esclareça suas duvidas com o Analista responsavel para definir dados de entrada e as saidas. Se não existir ninguém simule testes na aplicação e utilize os dados de saida.

5 - Mão-na-massa

Ferramentas a mão e vamos codificar. Siga sempre a estrutura de pacotes e nomenclaturas (classes e identificadores). Abuse dos comentários. Adicione para que serve cada variavel, da onde veio e para onde vai. Mesma coisa com os metodos. Para que serve cada parametro. O que o metodo faz. Outro ponto é conhecer a Arquitetura utilizada. Se for proprietaria entenda seu processo e como as coisas funcionam. Interfaces que você deve implementar, VOs, DTOs, Tiles, Struts.

6 - Cuidado com os prazos

Somente após voce entender a estrutura completa do sistema (exemplo JSP -> Form -> Action) você conseguira dar uma prazo mais preciso. No entanto conheço a realidade brasileira e normalmente voce é questionado pelas horas antes mesmo do item 1. Os passos anteriores demoram cerca de 1 a 3 dias. Variando pelo numero de Frameworks e bibliotecas e seus conhecimentos em relação a eles.

Java Hildebrando em 20 Set 2006

Hibernate do começo ao fim - Diálogo do Sr. com o Jr.

Diálogo entre o pessoal de Desenvolvimento.

Sr. : Entao, neste projeto utilizaremos Hibernate?
Jr. : É mesmo? Ja ouvi falar, mas é bom mesmo? Me parece que voce não precisa mais fazer Query? Parece meio utópico isso ein.
Sr. : É bem interessante. Com o lance do mapeamente O/R da para ter uma produtividade muito grande. Facilita muito. Faz o seguinte, da uma olhada no tutorial do guj http://www.guj.com.br/java.tutorial.artigo.174.1.guj que da para você entender bem.
Jr. : Beleza, mas como funciona esse mapeamento? É com XML?
Sr. : Isso, da uma olhada no tutorial que vc vai entender bem.
// Alguns Exemplos, POJO e Hbm depois
Jr. : Estou tendo um problema que é o seguinte. Tem um tal de Lazy Loading que nao ta dando certo. Quando eu quero acessar um objeto de dentro de outro objeto ta dando pau. Parece que a sessao esta fechada.
Sr. : O lance é conceitual. Aqui no seu DAO, voce esta fazendo o seguinte. Pegar o session, executar a query e fechar o session. Quando o JSP for ser renderizado é neste momento que sera feito o acesso aos atributos Lazy (Lazy que dizer preguiçoso, ou seja, so sera feito a busca deste objeto quando for necessário). O que acontece é que você não pode fechar a sessão.
Jr. : Mas dai vou deixar a sessao aberta?
Sr. : Negativo. O que vc vai fazer é abrir e fechar em outro momento. Utilizando um filtro para esse controle é uma boa. Da uma olhada nesse link http://www.hibernate.org/43.html
Jr. : Mas utilizar um filtro? Nao vou estar misturando as camadas (Hibernate na view)?
Sr. : Da forma como esta implementada o artigo não. Da uma olhada no artigo.
//Depois de implementado o Filter
Jr. : Poxa, mas nao ta salvando. Que #?*&% esse Hibernate.
Sr. : Calma. Voce lembra do artigo? Para operações de insert/update/remove voce tem que abrir uma transação. Senão nao rola.
Jr. : Ah tá. Beleza.
//Transação com begin no filtro e comit no filtro também.
Jr. : Poxa, ta dando um outro erro. Se da problema no Servlet o filtro nao esta retornando para a tela de retorno do servlet. Poxa, estragou tudo. Preciso arrumar uma forma de passar a pagina de retorno do Servlet para o filtro para ele poder fazer o dispatcher disso. Como vou fazer? $%¨&# Hibernate.
Sr. : Calma. O lance é conceitual de novo. Você não pode abrir uma transação no filtro, pois o Hibernate só da flush das querys no commit. Assim o seu servlet ‘pensa’ que esta tudo ok, porém quando for feito o commit, la no filtro, vai dar pau. A parte de transação é uma funcionalidade de Negocio, portanto deve ser feita na camada de negócio. Da uma olhada em outro tutorial do guj.http://www.guj.com.br/java.tutorial.artigo.182.1.guj
//Transacao com Hibernate implementada.
Jr. : Nooooooooooosa. Show de bola ein. Poxa, sem comentarios, quando for um metodo transacional é só colocar o Annotation la. Elegancia.
Sr. : Pois é. Este é so o começo. Depois você da uma estudada em ferramentas de mapeamento, para gerar os HBM de acordo com suas tabelas, também tem toda a parte de cache, muito legal,porém o tipo de aplicação é influenciada diretamente nisso, também tem a parte da utilização do DataSource do Servidor, mapeamento de coleções, mapeamentos avançados como timestamp, version, herança, etc. Mas entendendo esses conceitos principais de mapeamento, session e transação, o resto é só correr atras.

Esse diálogo representa os pontos importantes da utilização do framework Hibernate. O caminho é meio arduo porém como tem mais carga conceitual do que decoração de API. Boa Sorte

Dicas Hildebrando em 07 Set 2006

Preenchimento de combo com AJAX

Independente do framework ou biblioteca para utilização de AJAX nos seus sistemas, é importante destacar a interação do resultado das chamadas assíncronas com os elementos da tela.

O exemplo abaixo foi aplicado na alteração dos valores de um combo na tela


//O primeiro parametro eh um codigo se ja existe item selecionado ou nao
//200|1|item1|2|item2|3|item3
function callbackPreencherCombo(responseAJAX){
var response = responseAJAX.split('|');
var combo = document.getElementById('produtoItemData');
combo.disabled = false;
combo.options.length = 0;
if(response[0] == '200'){
var contador = 0;
for(i = 1 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
}else if(response[0] == '201'){
var contador = 0;
for(i = 2 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
for(i = 0; i < combo.options.length; i++ ){
if(combo.options[i].value == response[1]){
combo.options[i].selected = true;
}else{
combo.options[i].selected = false;
}
}
}
}

Tutorias Hildebrando em 02 Set 2006

Javascript para quem ja conhece Java

Não importa se você é um Jedi em linguagens de programação de alto nível como Java e C++. Quando o assunto é desenvolvimento para Web infelizmente precisamos conhecer Javascript.

Por que do infelizmente?

Porque utilizamos Javascript justamente para criarmos uma dinâmica maior do lado do cliente, e assim acabamos chamando funções do ambiente do Navegador, algo como pesquisar um campo, alterar um label de botão ou abrir uma nova janela. Algumas destas funções são particulares de cada Navegador, e isto levou muita gente a duplicar metodos pois os mesmos teriam que possuir um ‘if’ para o navegador IE e o ‘else’ para outros. Isso quando não tinha os ‘else if’.

Hoje muita coisa evoluiu porém eu gostaria de dar algumas dicas para o pessoal que anda batendo cabeça com Javascript.

Tipos

Javascript faz a tipagem em tempo de execução, ou seja, não existem declarações de tipo no seu codigo.


var i = 10;
var j = "Javascript";

Assim nas declarações de métodos tambem nao existe os tipos de retorno.


function mostrarData(){
return "28/06/1979";
}

Gostou ? Eu não gosto muito pois estou acostumado a forte tipagem do Java, que é um recurso interessante inclusive para a parte de manutenção de código.

Varargs

Para quem conhece Java 5.0 vai entender fácil. Existe aquele termo conhecido como sobrecarga de metodo que é voce declarar varios metodos com o mesmo nome, variando sua lista de argumentos. No Javascript o mais utilizado não é a sobrecarga e sim a declaração do método com a passagem de parametro definida em tempo de execução.


function somarNumeros(a,b,c){
var soma = 0;
if(a){
soma += a;
}
if(b){
soma += b;
}
if(c){
soma += c;
}
}

somarNumeros(2);
somarNumeros(2,5);
somarNumeros(2,8,9);

Interessante não? De fato facilita no desenvolvimento, no entanto é um recurso que deve ser utilizado com muito cuidado pois não existe a obrigatoriedade de nenhum parametro, o que pode comprometer o algoritmo do metodo.

AJAX

Existem inumeros tutoriais de AJAX na internet. Quero apenas destacar neste item que sem Javascript você nao vai conseguir aproveitar desta nova onda (a nao ser com a utilização de algum framework). Segue um exemplo.


function AJAXInteraction(url, callback, returnParam) {

var req = init();
req.onreadystatechange = processRequest;

function init() {
try {
return new XMLHttpRequest();
} catch (trymicrosoft) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
alert("Error initializing XMLHttpRequest!");
}
}
}
}

function processRequest () {
// readyState of 4 signifies request is complete
if (req.readyState == 4) {
// status of 200 signifies sucessful HTTP call
if (req.status == 200) {
if (callback){
callback(req.responseText);
}
}
}
}

this.doGet = function() {
// make a HTTP GET request to the URL asynchronously
req.open("GET", url, true);
req.send(null);
}
}

function buscarClientes() {
var url = "/servlet/ajaxPedido?method=buscarClientesPorRazaoSocial&clienteRazaoSocial=A";
var ajax = new AJAXInteraction(url, callbackBuscarClientes);
ajax.doGet();
}
function callbackBuscarClientes(responseAJAX){
//Fazer o tratamento da resposta.
}

Olha que interessante. Em Javascript você também pode utilizar Objetos. A declaração é um pouco diferente inclusive existe um recurso de Prototipação que ajuda bastante também.

Estas são algumas dicas para a utilização de Javascript. O resto que você precisa conhecer são as diversas operações dos componentes. Esse é um estudo como de outra linguagem qualquer envolvendo a leitura das especificações e a construção de exemplos.

Dicas Hildebrando em 27 Ago 2006

AJAX response

Ao utilizar invocações assíncronas com AJAX, com o objeto de consulta a dados (preencher um combo, dados do cliente, dados do produto, endereço do cep) normalmente estes dados vêm separados por um token. Algo como:

Av. Ibirapuera|206|04087-070|São Paulo|SP

Porém esta simples linha pode te causar problemas se vc nao setar o conten-type correto no response.

Assim, quando fizer uma consulta com AJAX e o seu javascript:alert de depuração do retorno apresentar ‘????’ basta setar o response com os valores:


response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/plain; charset=ISO-8859-1");
PrintWriter out = response.getWriter();
out.print("Av. Ibirapuera|206|04087-070|São Paulo|SP");

Noticias Hildebrando em 25 Ago 2006

Blog 2Solutions no ar……

A publicação esta meio atrasada porém finalmente oficializamos a publicação do blog da 2Solutions.

Como proposta procuramos difundir tecnologias utilizadas em nossos projetos bem como disponibilizar um espaço para que nossos colaboradores possam comentar situações/informações que possam contribuir com o mercado de TI.

Este espaço é aberto, inclusive a comentários dos visitantes.

Seja bem vindo

Dicas Hildebrando em 21 Ago 2006

Hospede o seu próprio site…

Aqui na empresa estamos montando uma estrutura para suportar projetos dos nossos colaboradores. Assim vou compartilhar alguns problemas encontrados caso voce (sua empresa) também se aventure .

1 - Voce precisa registrar seu dominio no registro.br (sites nacionais). registro.br.

No ato do registro é obrigatorio informar os DNS que irão resolver o nome do seu domínio.

Voce pode utilizar o seu próprio servidor para ser o um dos DNS, porém para funcionar vc precisa liberar a porta 53 tcp/udp para o servidor do registro.br conseguir acessar.

2 - Para tratar diferentes dominios, é necessário configurar no Web Server multiplos domínios. Com o Apache isso é possível através do VirtualHost

3 - Analise bem a utilzação de um servidor de email, pois são esses que os robôs mais procuraram. Eu recomendo a utilização do QMail (logo que finalizar o HowTo eu ja posto aqui) junto a fortes politicas de firewall.

4 - Monitore a utilização do servidor com os logs do WebServer.

5 - Todo projeto deve ter um grupo. E é associado usuarios ao grupo do projeto, assim é possível liberar um diretorio de FTP para acesso aos arquivos do Projeto.

Logo que identificar mais eu ja posto aqui.

« Página Anterior - Próxima Página »