wpjr2’s Weblog

Artigos e tutoriais úteis

Archive for julho \17\UTC 2008

Web 2.0: Aptana Studio

Posted by wpjr2 em julho 17, 2008

Um Ambiente de desenvolvimento integrado baseado no Eclipse muito interessante, o Aptana permite a criação de acplicações Web 2.0 em PHP, Ajax ou Ruby on Rails. Inclusive, ele possui suporte ao desenvolvimento de aplicações para o IPhone da Apple.

Link: http://www.aptana.com/

Anúncios

Posted in Noticias | Etiquetado: , | Leave a Comment »

Revista MundoJava: Edição Julho

Posted by wpjr2 em julho 17, 2008

Usando ponto-flutuante em Java ME
Aprenda as possíveis abordagens para o uso de tipos com ponto-flutuante nas diferentes plataformas Java ME.
Floggy: Framework de Persistência para JME/MIDP
Saiba como persistir dados em dispositivos móveis de maneira simples e fácil sem utilizar diretamente o RMS.
Marge: Bluetooth Fácil para Desktop e Dispositivos Móveis
Por meio do projeto Marge, desenvolver aplicações Java que usem a tecnologia sem fio Bluetooth ficou muito mais fácil.
Lidando de Forma Eficiente com Validações Locais
de Objetos

Aprenda a construir um miniframework para validar objetos locais sem afetar a complexidade do código.
JavaOne 2008
Veja como foi o principal evento de Java no mundo e aprenda sobre as novidades nas APIs EJB 3.1, JPA 2.0, WebBeans, JSF 2.0 e Java SE 7.
Arqueologia de Software: O que é e por que deve
interessar aos desenvolvedores Java?

A linguagem Java é muito madura, e a maioria dos novos projetos não começa do zero, pois geralmente são extensões de projetos já existentes.
Explorando a Manipulação de Bytecode
com o ASM

Aprenda como fazer coisas incríveis com a manipulação de bytecode utilizando a API baseada em eventos do ASM.
SiteMesh: Dividir para Conquistar
Colocando em prática esquemas de layout reutilizáveis com SiteMesh.
Usando a API Batik
Criando e manipulando gráficos vetoriais em SVG de forma programática com a API Batik.
Tendências em Foco: Java e a Computação
Embarcada

Entenda como o Java se posiciona no mercado de desenvolvimento de aplicações embarcadas.
ProfessorJ: Programação Multithreaded com Swing
Aprenda como tornar sua aplicação desktop mais robusta e responsiva com a utilização de programação multithread.
Mundo OO: Implementando uma dsl Interna
Projetando e codificando uma domain-specific language interna usando a linguagem Java.

Posted in Noticias | Etiquetado: , | Leave a Comment »

Tecnologia: Projetor R2-D2

Posted by wpjr2 em julho 9, 2008

Talvez um objeto de desejo de muitos por ai, inclusive meu, um projetor de vídeo/fotos baseado no personagem R2-D2 de Star Wars. Só o preço que é um pouco salgado, em torno de US$ 3,000.00.

Link

Link do vídeo no youtube

Link da página de compra

Posted in Noticias | Etiquetado: | Leave a Comment »

Swing/OpenGL Photo Viewer

Posted by wpjr2 em julho 7, 2008

Encontrei um projeto baseado em Swing e OpenGL muito interessante que apresenta fotos em 3 dimensões, conforme mostrado na gravura abaixo. O projeto é open-source e o seu código pode ser abaixado gratuitamente.

Link

Posted in Curso de Programação Java | Etiquetado: , | Leave a Comment »

JavaSE: Demos

Posted by wpjr2 em julho 7, 2008

Não sei se todos sabem, mas na instalação do JavaSE existe um diretório contendo diversos demos interessantes. dentre estes, se destacam:

  • SwingSet2: <DIRETORIO_INSTALACAO_JAVA>\demo\jfc\SwingSet2

  • Java2D: <DIRETORIO_INSTALACAO_JAVA>\demo\jfc\Java2D

  • MetalWorks: : <DIRETORIO_INSTALACAO_JAVA>\demo\jfc\MetalWorks

  • Notepad: : <DIRETORIO_INSTALACAO_JAVA>\demo\jfc\Notepad
  • Table Example: : <DIRETORIO_INSTALACAO_JAVA>\demo\jfc\TableExample

Artigos Úteis:

Posted in Curso de Programação Java | Etiquetado: , | Leave a Comment »

Struts Logging: Jakarta Commons Logging e Log4J

Posted by wpjr2 em julho 7, 2008

Segue abaixo alguns links relacionados aos temas que vimos na aula deste final de semana:

Jakarta Commons Logging

Log4J

Java Logging API

Estou disponibilizando tb a versão online dos slides adicionais que criei sobre o Log4J e o JCL:

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , , | 1 Comment »

Struts Validator: Lab 09

Posted by wpjr2 em julho 5, 2008

Segue abaixo detalhes do laboratório 9 (Struts Validator) do curso de desenvolvimento de aplicações Web com Apache Struts:

1) Criar a classe EmpresaAction que estende de LookupDispatchAction

package curso.struts.visao.action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.LookupDispatchAction;
import org.apache.struts.validator.DynaValidatorForm;

import curso.struts.modelo.dao.EmpresaDao;

public class EmpresaAction extends LookupDispatchAction {

public ActionForward pesquisar(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// obtendo o formulario
DynaValidatorForm formulario = (DynaValidatorForm) form;
String nomeEmpresa = (String) formulario.get(“nome”);
// buscando a lista de empresa
List empresas = EmpresaDao.getInstancia().
getEmpresaPorNome(nomeEmpresa);
// salvando a lista na sessao
request.getSession().setAttribute(“empresas”, empresas);
// retornando para a lista
return mapping.findForward(“lista”);
}

protected Map getKeyMethodMap() {
Map mapa = new HashMap();
mapa.put(“acao.pesquisar”, “pesquisar”);
return mapa;
}
}

1a) Criar os arquivos de configuração (XML):

Copiar o validation-rules.xml do Lab09.zip para WEB-INF
Copiar o validation.xml do Lab09.zip para WEB-INF

2) Acrescentar no arquivo filtro.jsp a propriedade hidden:

<html:hidden property=”acao” value=”Pesquisar” />

3) Criar  no Struts-config.xml um novo form:

<form-bean name=”EmpresaForm”
type=”org.apache.struts.validator.DynaValidatorForm”>
<form-property name=”nome” type=”java.lang.String”/>
</form-bean>

4) Criar  no Struts-config.xml uma nova ação:

<action input=”/filtro.jsp” name=”EmpresaForm” parameter=”acao”
path=”/empresa” scope=”request”
type=”curso.struts.visao.action.EmpresaAction” validate=”true”>
<forward name=”lista” path=”/listaEmpresas.jsp”/>
</action>

5) Definir a validação do formulário no validation.xml:

<formset>
<form name=”EmpresaForm”>
<field depends=”required” property=”nome”>
<arg key=”empresa.nome” position=”0″ />
</field>
</form>
</formset>

6) Mudar no filtro.jsp a ação a ser executada pelo formulário:

Mudar de: <html:form action=”/pesquisaempresa”>
Para: <html:form action=”/empresa”>

7) Acrescentar no struts-config.xml o plugin do validator a ser usado:

<plug-in className=”org.apache.struts.validator.ValidatorPlugIn”>
<set-property property=”pathnames” value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/>
</plug-in>

8) Adicionar a lib Lib commons-validator-1.3.1.jar ao projeto Web:

A Lib commons-validator-1.3.1.jar deve estar no diretório WebContent/WEB-INF/lib

9) Acrescentar a propriedade no arquivo application.properties:

acao.pesquisar=pesquisar

10) executar a aplicação via URL:

http://localhost:8080/curso/filtro.jsp

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , , | Leave a Comment »

Struts Validator: Links úteis

Posted by wpjr2 em julho 4, 2008

Segue abaixo alguns links úteis referentes ao Struts Validator:

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: | Leave a Comment »

Struts Validator: FormSet e i18n

Posted by wpjr2 em julho 4, 2008

Na aula de sábado passado, um de meus alunos (Rafael Albergaria) teve um problema ao utilizar o DynaValidatorForm para criar formulários dinâmicos no Struts e para estes serem validados pelo Jakarta Commons Validator 1.3.1. Este exercício está relacionado ao capítulo 9 que vimos na aula passada.

O problema foi que, na definição da validação do formulário (validation.xml), o <formset/> foi definido para uma localização específica (pt, BR), causando um problema ao executar a aplicação sobre um browser que não estivesse definido nesta localização.

<formset country=”BR” language=”pt”>
<form name=”EmpresaForm”>
<field depends=”required” property=”nome”>
<arg key=”empresa.nome” position=”0″ />
</field>
</form>
</formset>

Durante o exercício em sala de aula, como o meu browser estava definido para esta localização, o formset era encontrado corretamente e a validação era executada com sucesso. O problema ocorre quando a localização do browser está definida para um valor diferente do definido no <formset/>. Quando isto acontece, o Commons Validator não consegue encontrar o form definido no validation.xml, desta forma não executando a validação.

Para este problema, existem duas soluções:

a) não definir a localização no formset, tornando-o genérico para todas as localizações e idiomas

b) se for necessário definir a localização (validações para linguas específicas), implementar a validação específica em uma subclasse de DynaValidatorForm, utilizando-a na definição do form no arquivo de configurações struts-config.xml

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , | Leave a Comment »

JavaME: Sistema de Vendas

Posted by wpjr2 em julho 4, 2008

Segue abaixo um post que pedi para um de meus ex-alunos (Lerço) do curso de programação em JavaME escrever sobre um projeto que ele está desenvolvendo e eu o ajudei um pouquinho.

Vou fazer um breve relato do projeto num todo para voce entender a explicacao do uso da rotina implementada !
Aqui na empresa, desenvolvemos um projeto J2ME, para aumentar e automatizar a forca de venda dos vendedores de nossos clientes distribuidores que atuam em todo o estado de MG.
Requisitos :
1) Evitar re-trabalho na digitacao dos pedidos ( faziam no bloco no cliente e lancavam pelo portal ) !
2) Ter uma lista com todos os seus clientes da regiao, e informacoes de ultima compra e inadimplencia;
3) Ter uma lista com todos os produtos e precos ( atualizados ! )
4) Obter a informacao rapida se o pedido foi aceito e a confirmacao de estoque dos produtos !
5) Deixar uma copia do pedido com o cliente;
Recursos :
1)Possuimos um ERP interno e um portal na internet para a digitacao dos pedidos pelos vendedores ( interligado com o ERP ).
2)Para este projeto, montamos um web-service em php responsavel por toda a comunicacao com o dispositivo. ( no caso um palm treo 680 ). Ele é quem alimenta todas as tabelas de ( cliente, condicao pagamento, forma pagamento, fornecedores, produtos e precos ) e insere os pedidos feitos no palm !

Case : Na tela de Pedidos, precisa listar num choice.pop_up todas as condicoes e forma de pagamento cadastrados.
Na inclusao do pedido, ira mostrar a lista toda focando na 1a. opcao . Na alteracao do pedido, preciso tambem mostrar toda a lista, mas focando na opcao selecionada anteriomente na inclusao !
Para este problema estava utilizando 2 HashTable’s ( 1 para apontar pelo index – idRegistro e outro para apontar idRegistro – index ). Mas nao estava achando a melhor alternativa. Ai tive a importante ajuda do Waldir com a dica : ” criar uma classe que extenda a classe ChoiceGroup e dentro desta vc ter um arranjo que dado o id da choice”. Entao fui maos a obra :
Seguem abaixo as classes :
Condicao.java – modelo
public class Condicao {
private int codigoCondicao;
private String descricaoCondicao;
private int idRegistro;
private int idPosicao;
— getters and setters
}
// classe sugerida pelo Waldir para resolver o problema das buscas index – codigo e codigo – index
CondicaoChoice.java – extends choicegroup
public class CondicaoPagtoChoice extends ChoiceGroup {
private int [] idEntidades;

public CondicaoPagtoChoice(String label, int choiceType) {
super(label, choiceType);
// criada uma classe que tem um metodo statico que retorna o nr. registros de um recordstore
idEntidades = new int[DadosDao.totalRegistros

(AppMIDlet.BD_CPG)];
}

public void insert(int elementNum, Condicao entidade) {
idEntidades[elementNum] = entidade.getCodigoCondicao();
insert(elementNum, entidade.getDescricaoCondicao(), null);

}

// retorna o id da entidade selecionada
public int getIdEntidadeSelecionada() {
return idEntidades[getSelectedIndex()];
}

// retorna a posicao no list – poderia ter criado um outro array de inteiros para fazer este retorno !
public int getPosicaoSelecionada(int cod) {
int y=0;
for (int i=0;i<idEntidades.length;i++){
if (cod==idEntidades[i]) {
y=i;
break;
}
}
return y;
}
}
// classe responsavel para ler o recordstore da condicao !
CondicaoDao – DAO
public class CondicaoDao extends DadosDao {
// retorna um obj CondicaoPagtoChoice populado e ja com as referencias de index – codigo e codigo – index prontos !
public static CondicaoPagtoChoice choiceCondicao(){
CondicaoPagtoChoice lista=null;
int id;
try {
RecordStore rs=DadosDao.abrirRecordStore(AppMIDlet.BD_CPG);
RecordEnumeration re=rs.enumerateRecords(null, new OrdemAlfabetica(), false);

if (re.numRecords()>0){
Condicao p;
int cont=0;
lista = new CondicaoPagtoChoice(“Cond.Pagto:”,Choice.POPUP);
while (re.hasNextElement()) {
id = re.nextRecordId();
byte[] dados = rs.getRecord(id);
ByteArrayInputStream bain = new ByteArrayInputStream(dados);
DataInputStream dis = new DataInputStream(bain);
p= new Condicao();
p.setCodigoCondicao(dis.readInt());
p.setDescricaoCondicao(dis.readUTF());
p.setIdRegistro(id);
lista.insert(cont, p);
cont++;
}
}
re.destroy();
rs.closeRecordStore();
} catch (Exception e){
System.out.println(e);
}
return lista;
}
}
Agora o mais facil : na tela de pedidos ..
TelaPedido.java – VISAO
public class TelaPedido extends Form implements CommandListener, ItemStateListener {
private Pedido p;
private CondicaoPagtoChoice condicao;
… demais campos e commands

// recebo como parametros o titulo e o objeto do pedido ( para saber se alteracao ou inclusao )
public TelaPedido(String title,Pedido p) {
super(title);
this.p = p;
init(1);
}

private void init(int tp) {
condicao = CondicaoDao.choiceCondicao();
if (p.getIdCondicao()>0 ) {
condicao.setSelectedIndex(condicao.getPosicaoSelecionada(p.getIdCondicao()), true);
}
… demais campos e comands

append(condicao);
}
}

Posted in JavaME | Etiquetado: | Leave a Comment »