Mostrando postagens com marcador Exemplo. Mostrar todas as postagens
Mostrando postagens com marcador Exemplo. Mostrar todas as postagens

segunda-feira, 12 de novembro de 2007

Granite DS + Adobe Flex Builder

eis a grande questão... comecei semana passada a estudar o uso do Granite DS que me possibilita o uso do protocolo AMF3 para comunicação entre Client & Server...

* a problemática: legal, peguei os exemplos do Granite DS, os .war neles contidos, coloquei no Tomcat e funcionou... dai me veio a questão... como faço para usar isso em um projeto usando o Flex Builder?

* o que usei? segue o que usei nesse meu teste:
- Java 1.5
- Eclipse 3.2 + WTP 2.0 + Adobe Flex Builder Plugin
- Tomcat 5.5.20
- OC4J 10.1.3.20 (servidor de app da Oracle usado como servidor de teste de deploy do projeto)
- graniteds-pojo-0.4.0 (como base para o projeto server side)

* criando projeto para o server side da aplicação
- criar um projeto no Eclipse Dynamic Web Project
- criei um diretório para o projeto com o nome GranitePojoFlex
- após criado o projeto no diretório de nome definido
- copiar os arquivos do graniteds-pojo-0.4.0 para o projeto
> web.xml, códigos, diretórios do WEB-INF
- criei um diretório no /WebContent para o projeto Client Side - Adobe Flex, com nome de flex
- defini nas propriedades do projeto, no item: Web Project Settings, o Context Root para: granitepojoflex

* criando o projeto client side
- criei o projeto no diretório flex citado anteriormente
- o mxml do graniteds-pojo-0.4.0, copiei o conteúdo desse para o arquivo main.xml
- copiei o arquivo /WEB-INF/flex/services-config.xml, para o raíz do projeto
- editei esse arquivo services-config.xml

de:

    <channels>
        <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">
            <endpoint
                uri="http://{server.name}:{server.port}/{context.root}/graniteamf/amf"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>


para:

    <channels>
        <channel-definition id="my-graniteamf" class="mx.messaging.channels.AMFChannel">
            <endpoint
                uri="http://{server.name}:{server.port}/granitepojoflex/graniteamf/amf"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>


- feito isso é hora de adicionar esse arquivo nos parametros de compilação do projeto, indo nas propriedades, em Flex Compiler, onde adicionei o seguinte: -services "services-config.xml", com isto ira dizer onde está nossos dados...
- ainda é necessário configurar um outro detalhe nas propriedades do projeto, no item Flex Build Path, o item: Output folder URL, para dizer onde executar a aplicação em Flex... e como nesse caso estamos utilizando o tomcat o valor para esse item será: http://localhost:8080/granitepojoflex/flex/bin, o como esse projeto do Flex está dentro do /WebConten/Flex do projeto Server Side, justifica o porque dessa URL

* hora de executar
- primeiro colocar o projeto server side para executar, como não tem nenhum JSP, não irá aparecer nada quando o servidor e a aplicação estiver rodando
- agora hora de executar o projeto Flex, só mandar executar nosso main.mxml...
- lembrando que foi configurado a URL, você irá observar que estará executando em um endereço URL no seu browser

e eis um projeto em Flex Builder + Granite

* fazendo um deploy em um servidor para testar
no caso usei o OC4J, mas antes...
- no projeto Server Side, clique com o botão direito e vá em exportar WAR...
- para facilitar exporte para o Desktop por exemplo
- no OC4J, na parte de administração eu selecionei esse .war gerado e realizei o deploy...
- após iniciado a aplicação eu usei a seguinte URL para acessar e testar: http://localhost:8888/granitepojoflex/flex/bin/main.html, a porta é 8888, pois essa é a padrão do OC4J

segue o projeto Zipado: [link]

Obs.: esse projeto usa a versão modificada do Granite DS, falado nesse [post]

Granite DS, mapeamento flexível

hoje estudando o Granite Data Services, que é uma alternativa OpenSource e gratuita ao LiveCycles da Adobe, acabei encontrando uma informação que julgo eu ser muito útil...

estava vendo o funcionamento do AMFPHP, onde verifiquei que o mapeamento das classes são flexíveis, onde posso ter múltiplas classes mapeadas, enquanto no granite, eu tinha que mapear apenas uma única classe de cada vez... mas segundo a sugestão repassada, tem como deixar o Granite funcionando de forma similar ao AMFPHP, que em tese é mais fácil de reutilizar o mapeamento...

a dica está nesse [link flex-brasil]

onde é sugerido a alteração da classe: org.granite.messaging.service.SimpleServiceFactory.java

para que o Granite possa ser utilizado de forma flexível:

classe original:
package org.granite.messaging.service;

import flex.messaging.messages.RemotingMessage;

import org.granite.config.flex.Destination;
import org.granite.context.GraniteContext;

import java.util.Collections;
import java.util.Map;

/**
 @author Franck WOLFF
 */
public class SimpleServiceFactory extends ServiceFactory {

    @Override
    public ServiceInvoker<?> getServiceInstance(RemotingMessage requestthrows ServiceException {
        String messageType = request.getClass().getName();
        String destinationId = request.getDestination();
        
        GraniteContext context = GraniteContext.getCurrentInstance();
        Destination destination = context.getServicesConfig().findDestinationById(messageType, destinationId);
        if (destination == null)
            throw new ServiceException("No matching destination: " + destinationId);
        String scope = (String)destination.getProperties().get("scope");
        
        Map<String, Object> cache = null;
        if (scope == null || "request".equals(scope))
            cache = context.getRequestMap();
        else if ("session".equals(scope))
            cache = context.getSessionMap();
        else if ("application".equals(scope))
            cache = Collections.synchronizedMap(context.getApplicationMap());
        else
            throw new ServiceException("Illegal scope in destination: " + destination);
        
        String key = SimpleServiceInvoker.class.getName() '.' + destination.getId();
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        if (service == null) {
            service = new SimpleServiceInvoker(destination, this);
            cache.put(key, service);
        }
        return service;
    }
}

classe alterada:
package org.granite.messaging.service;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.granite.config.flex.Destination;
import org.granite.context.GraniteContext;

import flex.messaging.messages.RemotingMessage;

/**
 @author Franck WOLFF
 @author Erko Bridee de Almeida Cabrera
 
 * Alterações da classe para possibilitar um mapeamento
 * flexivel para qualquer classe do projeto
 
 * * dica do link:
 * http://br.groups.yahoo.com/group/flex-brasil/message/7933
 * - Graniteds com unico mapeamento de Classe
 
 */
public class SimpleServiceFactory extends ServiceFactory {

    @Override
    public ServiceInvoker<?> getServiceInstance(RemotingMessage requestthrows ServiceException {
        String messageType = request.getClass().getName();
        String destinationId = request.getDestination();
        
        GraniteContext context = GraniteContext.getCurrentInstance();
        Destination destination = context.getServicesConfig().findDestinationById(messageType, destinationId);
        if (destination == null)
            throw new ServiceException("No matching destination: " + destinationId);
        String scope = (String)destination.getProperties().get("scope");
        
        Map<String, Object> cache = null;
        if (scope == null || "request".equals(scope))
            cache = context.getRequestMap();
        else if ("session".equals(scope))
            cache = context.getSessionMap();
        else if ("application".equals(scope))
            cache = Collections.synchronizedMap(context.getApplicationMap());
        else
            throw new ServiceException("Illegal scope in destination: " + destination);
        
        /*************/
        Destination d = destination;
        ifdestination.getProperties().get("source").equals("*") ){
          Map<String, Object> propertiesMap = new HashMap<String, Object>();
          propertiesMap.put("source", request.getSource());
          d = new Destination(destination.getId(),
          destination.getChannelRefs
          (), propertiesMap, destination.getRoles());
        }
        /**************/
        
        /* String key = SimpleServiceInvoker.class.getName() + '.' + destination.getId();
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        if (service == null) {
            service = new SimpleServiceInvoker(destination, this);
            cache.put(key, service);
        } ALTERADO */
        
        String key = SimpleServiceInvoker.class.getName() '.' +
        d.getProperties().get("source")//<--Muda Aqui
        SimpleServiceInvoker service = (SimpleServiceInvoker)cache.get(key);
        ifservice == null ) {
          service = new SimpleServiceInvokerd, this )//<--Muda Aqui
          cache.put(key, service);
        }
        
        return service;
    }
}

com isto no projeto do código fonte do GraniteDS, basta usar o build.xml para regerar o .jar do Granite e utilizar este novo jar gerado...

com isto no exemplo do Granite-Pojo, o services-config.xml fica de outra forma:

    <services>
        <service
            id="granite-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="pojo">
                <channels>
                    <channel ref="my-graniteamf"/>
                </channels>
                <properties>
                    <scope>session</scope>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>



e no código mxml, no mx:RemoteObject, você deverá indicar o atributo source, como mostrado abaixo:

    <mx:RemoteObject
        id="srv"
        showBusyCursor="true"
        destination="pojo"
        source="test.pojo.PojoService"/>



feito isto, com um único mapeamento, você poderá acessar n-classes do seu projeto...
melhor, o que achou?

terça-feira, 6 de novembro de 2007

Java : ordenando uma coleção|lista de objetos, costumizado

algo bem útil, que as vezes quebra um galho quando estamos trabalhando com coleções e listas... as vezes precisamos ordenar, mas como fazer para ordenar uma coleção de objetos complexos?

para isso segue o seguinte:

considerando que temos uma classe específica em nosso projeto, para o exemplo, vou me basear nessa abaixo:

public class MyObj {
  
  private int myValue;
  priate String desc;
  
  public MyObj() {}
  
  public void setMyValueint value ) { this.myValue = value; }
  public int getMyValue() { return this.myValue; }

  public void setDescString newDesc ) { this.desc = newDesc; }
  public String getDesc() { return this.desc; }
    
}


para esta classe, defini uma classe de comparação, especifica para esta classe:

import java.util.Comparator;

public class MyObjComparator implements Comparator {
    
    public int compare(Object o1, Object o2) {
        MyObj ob1 = (MyObj)o1;
        MyObj ob2 = (MyObj)o2;
        ifob1.getMyValue() == ob2.getMyValue() ) {
            return 0;    
        else ifob1.getMyValue() < ob2.getMyValue() ) {
            return -1;
        else ifob1.getMyValue() > ob2.getMyValue() ) {
            return 1;
        }
        return 0;
    }    
}


considerando que tenho uma coleção|lista de objetos da minha classe definida, anteriormente:

List myObjList...

para ordenar, utilize um código como esse, que irá utilizar a classe de comparação:

Collections.sortmyObjList, new MyObjComparator() );

com isso resolve o problema, relacionado a ordenar uma coleção|lista de objetos complexos (definidos no teu projeto)

sexta-feira, 5 de outubro de 2007

Adobe Flex enviando parametros para a aplicação web em Java

eis um grande problema quando estamos utilizando o Adobe Flex, como enviar de modo que funcione parametros para nossa aplicação java, segue uma dica de como fazer para enviar os parametro de forma que funcione para aplicações que utilizam o Struts 2 ou o Mentawai na aplicação que roda no servidor (pelo menos nos testes que eu fiz funcionou...)

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  
  <mx:Script>
    <![CDATA[
      
      import mx.controls.Alert;
      import mx.rpc.events.ResultEvent;
      import mx.rpc.events.FaultEvent;
      import mx.utils.ObjectUtil;
      import mx.rpc.http.HTTPService;
      
       public function getLoginParameters():Object {
              return {
                "user.login": loginField.text, 
                "user.password" : passwordField.text 
              };
            }
      
      public function enviarDados()void {                          
        userRequest.sendthis.getLoginParameters() );          
      }
      
        public function onSuccess(event:ResultEvent):void {
    
        Alert.showXML(event.result) );
    
        //cria String baseado no resultado
        var rawData:String = String(event.result);
        
        Alert.showrawData );              
        }
    
        public function onError(event:FaultEvent):void {
            Alert.show(ObjectUtil.toString(event.fault));
        }      
            
    ]]>
  </mx:Script>
  
  <mx:HTTPService id="userRequest" 
     url="http://localhost:8080/mentawai_teste/FlexAction.loginXML.mtw" 
     result="onSuccess(event)"
    fault="onError(event)"
    resultFormat="e4x"
    method="POST"/>

   <mx:Panel width="300" height="154" layout="absolute" horizontalCenter="0" verticalCenter="11" title="Login">
      <mx:Form width="100%" height="100" x="0" y="0">
         <mx:FormItem label="Login">
            <mx:TextInput id="loginField"/>
         </mx:FormItem>
         <mx:FormItem label="Password">
            <mx:TextInput id="passwordField"/>
         </mx:FormItem>
      </mx:Form>
      <mx:Button y="84" label="OK" horizontalCenter="0" id="sendBtn" click="enviarDados()"/>
      <mx:Label x="10" y="96" text="{loginField.text}" enabled="false"/>
      <mx:Label x="174" y="96" text="?" enabled="false"/>
   </mx:Panel>
  
</mx:Application>

Observe: a function getLoginParameters():Object, aqui está a questão, o formato que finalmente funcionou para envio dos parametros de forma que chegassem corretamente no servidor, sem nenhum erro inesperado...

onde a comunicação com o servidor é efetuada através do componente : mx:HTTPService, sendo que neste caso utilizei retorno em XML como resultado da execução da action

---

quanto a aplicação em java eu tenho na minha classe action o respectivo atributo setado na classe:

private UserBean user;

onde a estrutura dessa classe é:
public class UserBean {

  private String login;
  private String password;
  
  public String getLogin() {
    return login;
  }
  public void setLogin(String login) {
    this.login = login;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  
}

bom fica ae a dica para conseguir enviar parametros do Flex para sua aplicação em java ;)

quarta-feira, 22 de agosto de 2007

Java : links úteis

* Exemplos de código java, bom para uma consulta rápida
- The Java Developers Almanac 1.4 [link]
- CatalogJava [link]

* Usando componentes Swing [link]

* Notícias em geral sobre Java [link]

sexta-feira, 3 de agosto de 2007

Exemplo e demos de Ajax : Javascript : DHTML

Existe um site na internet com vários exemplos e utilidades para download, que visa ajudar/facilitar o desenvolvimento utilizando Ajax/Javascript/Dhtml

fonte [Digg / Programming]

segunda-feira, 23 de julho de 2007

Hibernate : usando SQL

um exemplo simples de uso de SQL no Hibernate

package roseindia.tutorial.hibernate;

import org.hibernate.Session;
import org.hibernate.*;
import org.hibernate.criterion.*;
import org.hibernate.cfg.*;
import java.util.*;
/**
 @author Deepak Kumar
 
 * http://www.roseindia.net Hibernate Native Query Example
 *  
 */
public class NativeQueryExample {
  public static void main(String[] args) {
    Session session = null;

    try{
      // This step will read hibernate.cfg.xml and prepare hibernate for use
      SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
      session =sessionFactory.openSession();
      /* Hibernate Native Query Average Examle*/
       String sql ="select stddev(ins.invested_amount) as stdErr, "+
         " avg(ins.invested_amount) as mean "+
         " from insurance ins";
       Query query = session.createSQLQuery(sql).addScalar("stdErr",Hibernate.DOUBLE).
         addScalar("mean",Hibernate.DOUBLE);
       //Double [] amount = (Double []) query.uniqueResult(); 
       Object [] amount = (Object []) query.uniqueResult()
       System.out.println("mean amount: " + amount[0]);
       System.out.println("stdErr amount: " + amount[1]);

       /* Example to show Native query to select all the objects from database */
       /* Selecting all the objects from insurance table */
       List insurance = session.createSQLQuery("select  {ins.*}  from insurance ins")
      .addEntity("ins", Insurance.class)
        .list();
      for (Iterator it = insurance.iterator(); it.hasNext();) {
        Insurance insuranceObject = (Insuranceit.next();
        System.out.println("ID: " + insuranceObject.getLngInsuranceId());
        System.out.println("Name: " + insuranceObject.getInsuranceName());
      }
      
          session.close();
    }catch(Exception e){
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
    
  }
}

fonte [link]

segunda-feira, 9 de julho de 2007

Oracle : SQL : INNER JOIN : mais de um campo

ainda continuando o tema, refazendo mais alguns testes verifiquei que o formato de SQL para INNER JOIN com mais de um campo como o abaixo:

SELECT
A.COLUNA1,
B.COLUNA2
FROM
TB1 A
INNER JOIN TB2 B ON (
B.CHAVE1 = A.CHAVE1 AND
B.CHAVE2 = A.CHAVE2 AND
B.CHAVE3 = A.CHAVE3
)
WHERE
A.CODIGO = 1


funcinou, anteriormente no teste que havia feito tinha uma clausula errada no WHERE por isso não estava funcionando :P

quarta-feira, 4 de julho de 2007

Oracle : útil : selecionando próximo código

algo útil que de vez em sempre me esqueço, uma SQL para selecionar um próximo valor, normalmente utilizada para recupara qual o próximo valor de código a ser inserido na entidade/tabela, segue:

SELECT nvl( max( COLUNA ), 0 )+1 COLUNA FROM ENTIDADE_TABELA


bom fica ae a dica ;)

sábado, 30 de junho de 2007

Struts : exemplo de projeto

algo útil em geral, pelo menos eu tenho maior facilidade de assimilar conhecimento pegando um projeto funcionando, ver os fontes e debugar =]

baseado nisso estou disponibilizando 5 projetos simples de uso do Struts:

- struts1_tiles_crud
uso do Struts 1 em conjunto do Tiles( gerenciador de templates ) em um caso de CRUD simples

- struts2_action_annotations
exemplo de como utilizar actions através de anotações no Struts 2

- struts2_blank
exemplo de um projeto simples em branco do Struts 2, também nesse projeto tem um exemplo de como definir saída de stream de dados dinamicamente

- struts2_crud_example
exemplo de crud simples utilizando o Struts 2

- struts2_tiles2_example
exemplo de uso do Tiles 2 em conjunto do Struts 2

Obs.: em todos os projetos possuem um arquito NOTA.txt, com mais informações

ambiente no qual foi montado esses projetos:
- Eclipse 3.2
- WTP 1.5.3
- Java SDK 1.5.x
- Java SDK 1.4.x
- Apache Tomcat 5.5.20
- Apache Tomcat 5.0.28

quinta-feira, 28 de junho de 2007

Mentawai: usando o SMTP do Gmail

algo interessante que acabei contribuindo para o projeto do Mentawai, foi uma vez que tive a necessidade de enviar email pela minha aplicação porém eu não possuia nenhum servidor SMTP disponível, o jeito era utilizar o que eu tinha disponível que no caso era utilizar o SMTP do Gmail, mas como fazer para utilizar o SMTP do Gmail, inicialmente o suporte de email do Mentawai( que é excelente ) não me possibilitava, com isso peguei os fontes do Mentawai, fiz uma proposta de alteração que possibilitaria o envio de email usando o SMTP do Gmail, o qual é autentificado via SSL, a proposta de alteração foi aceita e desde a versão 1.8 do Mentawai está disponível para os usuários...

porém no site do Mentawai no exemplo de uso do suporte de email, não tem um exemplo de como usar o SMTP do Gmail, bom eis aqui um exemplinho:

import org.mentawai.core.*;
import org.mentawai.mail.*;

public class ApplicationManager extends org.mentawai.core.ApplicationManager {
    
    public void init() {
        Email.setDefaultHostName("smtp.gmail.com");
        Email.setSSLConnectiontrue );
        Email.setDefaultPort465 );
        Email.setDefaultAuthentication("login@gmail.com""*senha*")
        Email.setDefaultFrom("login@gmail.com""Login");
    }
  
    public void loadActions() {
        // ...
    }
}
   

e dentro da sua classe action para enviar um mail simples, você pode utilizar esse trecho de código:
        try {
            SimpleEmail email = new SimpleEmail();
            email.addTo("login@gmail.com""Login");
            email.setSubject("Testing...");
            email.setMsg("Hi,\n\nBye!");
            email.send();            
        catch(Exception e) {
            e.printStackTrace();
        }  


veja o link:[Mentawai:enviando email]

sábado, 17 de março de 2007

OpenLaszlo : gerenciamento de views

um exemplo de gerenciamento de views, pode ser util...



código fonte: [link]

sexta-feira, 16 de março de 2007

OpenLaszlo: eventos de teclado e combo de teclas

um exemplinho de tratamento de evento de teclado e também como trabalhar com combo de teclas do genero: "Ctrl + c", por exemplo...

OBS.: a tecla 'Alt' não funciona na aplicação, ainda não descobri o motivo dessa limitação, em outras palavras, se tentar usar um combo de teclas onde tenha o alt no meio, muito provavel que não tenha nenhum efeito...

segue o exemplo de código:
<canvas debug="true">

<view
    name="v"
    x="20" y="20"
    width="100" height="100"
    bgcolor="0x7F7F7F" focusable="true">
    
    <handler name="onkeyup" reference="LzKeys" args="kc">
        // trata o evento apenas se o mouse estiver
        // na área da view
        if( this.mouseIn() ) {
            Debug.write("got onkeyup: ", kc);
        } else {
            Debug.write( "Fora" );
        }
    </handler>

    <!-- verifica se o mouse está sobre a view -->
    <method name="mouseIn"><![CDATA[
        var mouse_x = this.getMouse( "x" );
        var mouse_y = this.getMouse( "y" );
        if( mouse_x > this.width ) {
            return false;
        } else if( mouse_x < 0 ) {
            return false;            
        } else if( mouse_y > this.height ) {
            return false;            
        } else if( mouse_y < 0 ) {
            return false;            
        }
        return true;
    ]]></method>
    
    <method event="oninit">
        Debug.write("init called.");
        this._del = new LzDelegate(this, "tecla");
        LzKeys.callOnKeyCombo(_del, ["c"]);  // this works
        LzKeys.callOnKeyCombo(_del, ["shift", "b"]);  // funciona
        LzKeys.callOnKeyCombo(_del, ["control", "g"]); // funciona
        LzKeys.callOnKeyCombo(_del, ["control", "a"]); // funciona
        LzKeys.callOnKeyCombo(_del, ["alt", "s"]); // não funciona
    </method>
    
    <method name="tecla">
        Debug.write("myCallback called.");
    </method>
</view>

<button y="150">something else to focus on</button>
<button y="180">something else to focus on</button>

</canvas>

quinta-feira, 8 de março de 2007

OpenLaszlo: exemplo de organização de projeto

bom agora para exemplificar, já temos o exemplo da mini aplicação OpenLaszlo a qual mostra os dados do status do Portal Java.com e atualiza em certo intervalo de tempo, essa nova aplicação a interface é exatavamente a mesma, o que muda dela é a sua organização do projeto, a qual diferentemente da versão anterior que era tudo em um único .lzx, agora está separada em classes para possibilitar o reuso dos componentes gerados em outras aplicações...



como comentei, visualmente essa nova versão é exatamente igual a diferença está na forma que foi estruturada quanto ao código... compare ambas as versões para ver a estrutura...

download da versão anterior: [link]
download da versão estruturada em classes: [link]

com isso pode-se até traçar um paralelo das vantagens de uma programação mais organizada, quando se pensa em reuso, manutenção e até expansão de aplicação =]

terça-feira, 6 de março de 2007

OpenLaszlo: um exemplo completo de mini aplicação

bom base no exemplo de uso do LzTimer, alguns amigos sugeriram fazer uma mini aplicação com OpenLaszlo que também listasse o login dos usuários logados no Portal Java.com e também possibilitasse algum tipo de configuração, bom estão lá vai um exemplo de mini aplicação com OpenLaszlo =]

Observação: para acessar a parte de configuração precione a tecla ESC para exibi a tela de configuração, e ESC novamente para voltar a tela com as informações... também foi definido um tempo inicial de atualização de dados em 5 minuto, possibilitando uma configuração para o valor, sendo o mínimo de 1 minuto de tempo de espera. ( A fonte de dados desse app é um .php )

* tamanho da aplicação: 104 kB



Código fonte da mini aplicação: [link]

Modelo dos XML das fontes de dados:
* ds_status
<pjonline>
   <membros>?</membros>
   <visitantes>?</visitantes>
   <total>?</total>
</pjonline>


* ds_user
<list>
   <item number="1" user="usuário A" />
   <item number="2" user="usuário B" />
   <item number="3" user="usuário c" />
   <item number="4" user="usuário D" />
   ...
</list>

domingo, 4 de março de 2007

OpenLaszlo: exemplo de LzTimer

um exemplo simples de como criar uma aplicação do genero Timer, para a cada intervalo de tempo realizar algum tipo de processamento, no caso este exemplo mostra o status em tempo real das pessoas que estão acessando ao Portal Java.com



Código fonte da aplicação: [link]
<canvas
    title="Portal Java Who is Online"
    width="200" proxied="false">
    
    <attribute name="flag" value="true" type="boolean" />
    
    <!-- dataset da aplicação -->
    <dataset
        name="ds"
        src="http:whoisonline.php"
        querytype="post"
        request="false"
        proxied="false"/>
    <!-- trata o evento de recebimento de dados pelo dataset -->    
    <handler reference="ds" name="ondata"><![CDATA[
        // verifica o tratamento de tempo para executar a cada 1 segundo
         if( typeof this.del == "undefined" ) {
            this.del = new LzDelegate( this, "atualizaInfo" );
            LzTimer.addTimer( this.del, 1000 );
        } else {
            LzTimer.resetTimer( this.del, 1000 );
        }
    ]]></handler>    
    <!-- método que trata a inicialização da aplicação -->
    <method name="init"><![CDATA[
        this.atualizaInfo();
    ]]></method>
    <!-- método para atualizar -->
    <method name="atualizaInfo"><![CDATA[
        if( this.flag ) {
            // requisita os dados para o servidor
            this.ds.doRequest();
        }
    ]]></method>    
    <!-- @BEGIN: definição visual -->
    <simplelayout axis="y" spacing="5"/>
    <text><u><b> Pessoas on-line: </b></u></text>
    <view>
        <text>Membros: </text>
        <text x="65" datapath="ds:/pjonline/membros/text()"/>
    </view>
    <view>
        <text>Visitantes: </text>
        <text x="65" datapath="ds:/pjonline/visitantes/text()"/>
    </view>
    <view>
        <text>Total: </text>
        <text x="65" datapath="ds:/pjonline/total/text()"/>
    </view>
    
    <button x="20" name="btn" text="Parar">
        <handler name="onclick"><![CDATA[
            if( canvas.flag ) {
                canvas.btn.setAttribute( "text", "Atualizar" );
                canvas.flag = false;
            } else {
                canvas.btn.setAttribute( "text", "Parar" );
                canvas.flag = true;
                canvas.ds.doRequest();
            }
        ]]></handler>
    </button>
    <!-- @END: definição visual -->    
</canvas>


Formato do XML recuperado com as informações:
<pjonline><membros>4</membros><visitantes>185</visitantes><total>189</total></pjonline>

quinta-feira, 1 de março de 2007

OpenLaszlo: exemplo de campo com Mascara

algo útil e que normalmente iremos nos deparar é com a necessidade de um campo com mascara para entrada de data, hora, CEP, CPF, entre outros tipos de entradas formatadas...

neste exemplo é um bem simples de como implementar um campo de mascara para CPF
onde a mascara é: xxx.xxx.xxx-xx, porém este exemplo não trata a entrada de teclado a qual também poderia ser incluída de modo simples



[Fonte]


<canvas width="200">
<view width="115" height="20" bgcolor="gray">
        <inputtext
            name="field"
            bgcolor="white"
              x="1" y="1"
              width="$once{parent.width-2}"
              height="$once{parent.height-2}" maxlength="14">
              
              <method name="init"><![CDATA[
                  super.init();
              ]]></method>
              <method event="onkeydown" args="akeycode"><![CDATA[
                Debug.write( String.fromCharCode(akeycode) + " : " + akeycode + " >> " + this.getText() );
                
                // tecla backspace
                if( akeycode != 8 ) {
                    
                    switch( this.getText().length ) {
                        case 3:
                            this.addText( "." );
                            break;
                        case 7:
                            this.addText( "." );
                            break;
                        case 11:
                            this.addText( "-" );
                            break    
                    }
                var lastP = this.getText().length;
                this.setSelection( lastP, (lastP+1) );                  
                }           
                ]]></method>
              <!-- @END: métodos do inputtext -->
          </inputtext>
</view>
</canvas>

quarta-feira, 14 de fevereiro de 2007

OpenLaszlo: como intergrar em um HTML ?

outra duvida que vejo o pessoal um pouco perdido é como integrar o OpenLaszlo com o HTML, sendo este gerado por um .jsp, .asp, .php ou qq outra tecnologia web...

lembrando que o OpenLaszlo na versão 3.x ele disponibiliza 2 formas de publicar uma aplicação desenvolvida com o OpenLaszlo:

- Proxied : a qual utiliza um suporte no server-side de libs e java
- SOLO : essa é similar, ou até digamos que a mesma modalidade utilizada pelo Flex, no qual você irá gerar um .SWF da aplicação e disponibilizar em qualquer servidor web de qualquer tecnologia de sua preferência...

* agora como fazer para integrar?

existem 2 formas de fazer isso, uma é utilizando a tag para integrar um .swf em um HTML, como no exemplo a seguir:

<object type="application/x-shockwave-flash"
      data="suaAplicacao.lzx?lzt=swf&debug=false&lzr=swf7"
      width="800" height="100%">
   <param name="movie" value="suaAplicacao.lzx?lzt=swf&debug=false&lzr=swf7" />
   <param name="quality" value="high" />
   <param name="scale" value="noscale" />
   <param name="salign" value="LT" />
   <param name="menu" value="false" />
</object>

ou então usando o suporte javascript da plataforma OpenLaszlo que irá gerar isso por trás e exibir sua aplicação dentro de um HTML, onde é necessário incluir o javascript:

<script src="/NomeAplicacao/lps/includes/embed.js" type="text/javascript"></script>

e no local onde for exibir a aplicação inserir o respectivo script:

<script type="text/javascript">
   lzEmbed({url: 'suaAplicacao.lzx?lzt=swf&debug=false&lzr=swf7', bgcolor: '#ffffff', width: '800', height: '100%', id: 'lzapp', accessible: 'false'});
</script>


outras informações podem ser vistas nesse [link]

ver capítulo 32 da documentação oficial: Integração com o Browser