Info Computação
Blog voltado para área de computação. Dicas, artigos, tutorias, notícias.

Olá, pretendo nesse post demonstrar a criação de Convert ou também chamados conversores em aplicações web JSF 1.2.
Os conversores nós auxiliam no desenvolvimento de aplicações web facilitando nosso trabalho no dia-à-dia. Um exemplo de conversor pode ser aplicado nos input (entrada de dados) que um usuário digita.
Imagine um formulário com cadastro de um cliente em que seja necessário entrar com o CPF do cliente, aplicando uma mascara javascript no browser do cliente conseguimos obter uma formatação comum como exemplo: CPF = 111.111.111-11. Só que temos um pequeno problema ao persistir esse dado quando o banco de dados só aceita 11111111111 por exemplo. Uma saída seria antes de gravar o dado retirar a formatação. Mas em todos os campos que tenha CPF deveremos nos preocupar com isso.
Uma solução bastante atraente é utilizar os conversores JSF. Nele podemos criar diversos conversores como desejarmos, exemplo: Conversores de CNPJ, CPF, Cartão de Crétido entre outros.
Por padrão aAPI JSF já nós dá alguns convert padrões como f:convertNumber, datatime entre diversos outros que podem ser visto aqui (exemplos completos muito bom):
http://www.ibm.com/developerworks/library/j-jsf3/

Criando um convert no JSF: CPFConvert

Os conversore implementam a interface Convert.


public class CPFConverter implements Converter {


Precisamos explicar a interface como queremos que nosso convert se comporte. Para isso devemos implementar os métodos:

@Override public Object getAsObject(FacesContext context, UIComponent component, String newvalue)
public Object getAsString(FacesContext context, UIComponent component, Object value)


No método getAsObject devemos pegar a string do componente de imput html e transformá-ló em um objeto (podendo ser String também).
O método getAsString deverá retorna o Object mas em um formato que possa ser convertido em uma String.

Abaixo segue a class utilizada pelo conversor


import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.convert.Converter;

import javax.faces.convert.ConverterException;



/**

 

 @author Thiago Fonseca Meneses

 *

 */

public class CPFConverter implements Converter {



  @Override

  public Object getAsObject(FacesContext context, UIComponent component, String newvalue) {

    StringBuilder builder = new StringBuilder(newvalue);

    //Caracteres permitidos '0..9 '.' e '-' 

    boolean encontrouCaracterInvalido = false;

    int i = 0;

    while i < builder.length() && !encontrouCaracterInvalido) {

      char c = builder.charAt(i);

      if (Character.isDigit(c))

        i++;

      else

        if (Character.isDefined('.'))

          builder.deleteCharAt(i);

        else

          if (Character.isDefined('-'))

            builder.deleteCharAt(i);

          else 

            encontrouCaracterInvalido = true;

            

    }

    if (encontrouCaracterInvalido) {

      FacesMessage message = new FacesMessage("Ocorreu um erro de conversão. ","CPF inválido");

      message.setSeverity(FacesMessage.SEVERITY_ERROR);

      throw new ConverterException(message);

    }

    return new CPF(builder.toString());

  }



  @Override

  public String getAsString(FacesContext context, UIComponent component, Object value) {

    //11111111111

    //111.111.111-11 - como será exibido

    String v = value.toString();

    StringBuilder builder = new StringBuilder();

    int tam = v.length();

    for(int i = 0; i < tam; i++) {

      if (i == || i== 6)

        builder.append(".");

      else

        if (i == 9)

          builder.append("-");

      if (i < 11)

        builder.append(v.charAt(i));

      else

        break;

    }

    return builder.toString();

  }



}


--------------------------- Class CPF --------------------------------


import java.io.Serializable;



public class CPF implements Serializable{

  private static final long serialVersionUID = 1L;

  private String numero;

  

  public CPF(String numero){

    this.numero = numero;

  }

  public String toString() {

    return numero;

  }

}

 

Olá, nesse post pretendo demonstrar como criar um ambiente de desenvolvimento JSF 1.2 utilizando alguns frameworks auxiliares como JBoss Richfaces que nós auxiliam com diversos componentes prontos e integração AJAX (ver Richfaces live demo) como também o Facelets para desenvolver a parte de template e reutilização das páginas.

Requisitos:

  • Bibliotecas JSF -
Download das lib JSF link1 ou link2
  • Biblioteca Commons
Download das lib Commons link1 ou link2
Download das lib Richfaces link1 ou link2
Instalando o Eclipse

Para instalar o eclipse escolha um diretório que será seu ambiente de desenvolvimento. Ex.: C:\Java-Desenv\ e nele descompacte o eclipse ficando C:\Java-Desenv\eclipse3.X . Eclipse não precisa de instalação, na hora que executá-lo defina um workspace dentro de seu ambiente como exemplo C:\Java-Desenv\workspace onde seus projetos irão ficar armazenados

Instalando o Apache Tomcat

O Tomcat que foi baixado não necessita de instalação sendo extraído na pasta de desenvolvimento C:\Java-Desenv\apache-tomcat-6.0.18.
Para integrar com o eclipse faça os seguintes passos:
  1. Execute o Eclipse

  2. Coloque na pespectiva JEE
  3. Depois click na aba Server e com o botão direito adicione um novo server
  4. Escolha a opção Apache Tomcat v6.0. Em Server Runtime click em ADD para adicionar um novo servidor. Na janela que aparecerá aponte para o local que encontra o tomcat como na foto abaixo abaixo



Para os próximos passos precisamos criar um projeto web para então adicionarmos o Richfaces e Facelets.

Criando um projeto web

No eclipse vá em File-New-Dynamic Web Project
  1. Insira um nome para o projeto
  2. Target-Runtime escolha o server Apache Tomcat
  3. Configuration - Escolha JavaServer Faces v1.2 ou click no botão modify e coloque as configurações como na imagem abaixo
  4. Next-Next
  5. Em JSF Capabilities deixaremos por padrão sem nenhuma biblioteca e as configurações padrão do JSF e clicaremos em Finish.


Por padrão o eclipse cria um projeto JSF mas não adiciona nenhuma biblioteca para que a gente possa executar o projeto JSF e as páginas JSF. Para adicionarmos as bibliotecas podemos escolher ela na tela Capabilities(tela acima) configurando em new e adicionar as bibliotecas para que sempre já estejam lá, ou adicionar as Jar's na pasta WebContent\WEB-INF\lib do projeto.

Para baixar as bibliotecas do JSF podemos ir no site Javaserverfaces.dev.java.net e fazer o download das bibliotecas JSF 1.2 (jsf-api.jar and jsf-impl.jar) e das bibliotecas JSTL (standard.jar e jstl.jar, Projeto Jakarta taglib).

Para baixar todas as bibliotecas JSF necessárias utilize um dos seguintes links (Download das lib JSF link1 ou link2)
Devemos também baixar as bibliotecas Commons necessárias utilize um dos seguintes links (Download das lib Commons link1 ou link2)

Vale ressaltar novamente em copiar as jar para pasta WebContent\WEB-INF\lib do projeto. Após copiar podemos criar uma nova página JSF no eclipse.
  1. Botão direito no projeto - New - JSP
  2. Inserir um nome - Ex.: index
  3. Finish
  4. Botão direito no index.jsp - Run As - Run on server
  5. Caso apareça para escolher um server, escolha o tomcat next ... next finish.


Instalando o Richfaces

Após baixar as bibliotecas do richfaces descompactar as lib (richfaces-api,richfaces-imp,richfaces-ui ,*.jar) na pasta WebContent\WEB-INF\lib do nosso projeto.

Depois devemos registrar o richfaces no web.xml da pasta WebContent\WEB-INF do nosso projeto. Para isso devemos copiar e colar no web.xml os seguintes comandos:

<!-- "Blue Sky" skin para o projeto -->
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>blueSky</param-value>
</context-param>
<!-- Making the RichFaces skin spread to standard HTML controls -->
<context-param>
<param-name>org.richfaces.CONTROL_SKINNING</param-name>
<param-value>enable</param-value>
</context-param>
<!-- Defining and mapping the RichFaces filter -->
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

Após salvar o web.xml, podemos atualizar nossa página index.jsp para o seguinte código

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<f:view>
<a4j:form>
<rich:panel header="RichFaces Greeter" style="width: 315px">
<h:outputText value="Your name: " />
<h:inputText value="#{user.name}" >
<f:validateLength minimum="1" maximum="30" />
</h:inputText>
<a4j:commandButton value="Get greeting" reRender="greeting" />
<h:panelGroup id="greeting" >
<h:outputText value="Hello, " rendered="#{not empty user.name}" />
<h:outputText value="#{user.name}" />
<h:outputText value="!" rendered="#{not empty user.name}" />
</h:panelGroup>
</rich:panel>
</a4j:form>
</f:view>
</body>
</html>

Após salvar devemos rodar no servidor, e então nossa página já estará configurada para utilizar o Richfaces finalmente =p



Espero que tenha ajudado,
Abraços Thiago

 

Converter TCHAR em char* C++

Posted In: . By Thiago Fonseca

Depois de algumas horas tentando converter TCHAR em char* encontrei uma solução bastante simples usando "wrapper function".

Ex.:

Código:

TCHAR infoBuf[255];
char AnsiBuffer[255];

Usando a função WideCharToMultiByte passando os parametros TCHAR e char*:

WideCharToMultiByte(CP_ACP, 0, infoBuf, wcslen(infoBuf)+1, AnsiBuffer , sizeof(AnsiBuffer), NULL, NULL);

O resultado vai ser um cha* do mesmo conteúdo do TCHAR.

Até + ;p

 

Criando um VNC em Java

Posted In: . By Thiago Fonseca

Olá, espero com esse post mostrar o funcionamento de um VNC VIEW básico em que um computador conecta à um outro computador remoto e então captura todas as telas que estão sendo visualizadas pelo computador host.

A idéia é bastante simples, basicamente transformar a imagem capturada pelo toolkit java, codificá-lá em um algoritmo (JPEG, GIF, PNG, etc...),transformá-lá em um array de bytes e enviar para rede. Do outro lado o computador que recebe as imagens só basta transformar o array de bytes em imagem e dá um repaint() na tela em um JFrame.

Essa ferramenta pode ser bem útil em aulas.

Apesar da simplicidade, vários outros aspectos podem ser levados em consideração tornando o projeto mais complexo como por exemplo capturar eventos do mouse e enviar para o computador que recebe as imagens como também criar agentes ativos que identifica computadores disponíveis para receber as imagens e então o computador host enviar para todos ao mesmo tempo em broadcast.

Imagem do funcionamento do programa


Palavras-chave: Java, VNC

Criando o projeto

  1. Vamos criar um JFrame bastante simples, cujo objetivo é mostrar a tela capturada no outro computador. A imagem a seguir demostra tal tela.



  2. Criando o núcleo da aplicação

  3. Vamos criar uma class Server. Usando um contexto que "server" será responsável por deixar a máquina disponível para receber imagens de um suposto "cliente" em que o "cliente" enviará as imagens para este "server". Um exemplo um computador A e um computador B, sendo o A o server então é nele que irá aparecer as imagens que estão sendo transmitida pelo computador B.

    Criando o Server


    Iremos criar a Class Server herdando de Thread, pois ela será responsável por abrir a conexão do socket de rede e esperar requisições. Quando uma requisição for enviada o método RUN da Thread é executado fazendo a operação de receber os Bytes enviado pelo "Client" e transformando em Image (BufferedImage).


    public class VirtualSchoolServer extends Thread {
    private Socket socket;
    private FmPrincipal fmChamado;

    public VirtualSchoolServer(Socket cliente) {
    setSocket(cliente);
    }

    No construtor enviamos um Socket responsável por abrir a conexão (Cliente). Esse FmPrincipal é o frame que exibirá a imagem. Ou seja, FmPrincipal e Server irão rodar juntos, quando o Server receber uma imagem enviará para o FmPrincipal e entao termina sua execução fechando a conexão e então abrimos uma nova Thread Server que espera indefinidamente até que o Client envi uma conexão.
    No método public void run() iremos transformar os bytes recebidos no socket e transformá-lo em BufferedImage. O código abaixo demostra como fazer isso.


  public void run(){

            try {

                System.out.println("Cliente conectado: " + socket.getInetAddress() " port " + socket.getLocalPort());

                InputStream is = socket.getInputStream();

                System.out.println("Download da imagem iniciado...");

                byte[] buffer = new byte[1024];

                int controle = 0;

                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                while ( (controle = is.read(buffer)) !=-) {

                    byte[] bufferReal = new byte[controle];

                    System.arraycopy(buffer, 0, bufferReal, 0, controle);

                    baos.write(bufferReal);

                }

                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

                BufferedImage bi = (BufferedImage)ImageIO.read(bais);

                if (bi != null) {

                    getFmChamado().setBi(bi);

                    System.out.println("Imagem recebida com sucesso... enviando para form");

                }

                else

                   System.out.println("Imagem recebida com falha... NULL")

 

            catch (Exception e) {

                    e.printStackTrace();

            }

            finally{

                    try {

                            socket.close();

                    catch (IOException e) {

                            e.printStackTrace();

                    }

            }


Criando a aplicação Cliente


Como explicado mais a cima, a aplicação cliente será responsável por enviar as imagens para o "server" para que este possa exibir as imagens recebidas. O código abaixo mostra como fazer isso.


public class VirtualSchoolClient {

   private static int i = 0;

   private static BufferedImage bi;

   private static Socket cliente;

   

   public static void main(String[] param) {

             while (true) {

                 try {

                    Toolkit ferramenta = Toolkit.getDefaultToolkit();

                    Rectangle tela = new Rectangle(ferramenta.getScreenSize());

                    Robot robot = new Robot();

                    bi = robot.createScreenCapture(tela);

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();

                    cliente = new Socket("localhost"8088);

                    cliente.getOutputStream().write(baos.toByteArray());



                    System.out.println("imagem enviada pelo cliente...");

                    ImageIO.write(bi, "JPG", cliente.getOutputStream());

                    cliente.getOutputStream().flush();

                    Thread.sleep(100);

                    catch (Exception e) {

                        e.printStackTrace();

                    }

                    finally{

                        try {

                                cliente.getOutputStream().close();

                                cliente.close();

                            catch (IOException e) {

                                    e.printStackTrace();

                            }

                    }

                }

   }



Criando a aplicação que dá um START no FmPrincipal e chama o "Server"





public class StartVirtualSchool {

    private static FmPrincipal jf = new FmPrincipal();

    @SuppressWarnings("static-access")

    public static void main(String[] args) {

        jf.setVisible(true);

        jf.capturaImage();

    }

}

Método capturaImage() FmPrincipal






    public void capturaImage(){

            try {

            ServerSocket ss = new ServerSocket(8088);

            while (true) {

                cliente = ss.accept();

                jlb_Status.setText("Conexao estabelecida");

                VirtualSchoolServer vs = new VirtualSchoolServer(cliente);

                vs.setFmChamado(this);

              vs.start();

                if (bi != null) {

                  double largura  = bi.getWidth();

                  largura -= largura * 0.2;

                  double altura = bi.getHeight();

                  Image imge = bi;

                  imge = imge.getScaledInstance(600400, Image.SCALE_FAST);

                  altura -= altura *0.2;

                  BufferedImage imt = new BufferedImage(600,400, BufferedImage.TYPE_INT_RGB);

                  imt.getGraphics().drawImage(imge, 00null);

                   ImageIcon icon = new ImageIcon(imt);

                  jImg.setSize(600400);

                  jImg.setIcon(icon);

                  System.out.println("Imagem diferente de NULL");

                   

                }else {

                    System.out.println("Imagem == NULL");

                }

                this.repaint();

            }

        catch (Exception e) {

            e.printStackTrace();

        }

    

    }

 

Deletando tabelas Oracle BIN$

Posted In: . By Thiago Fonseca

Usando o oracle 10g me deparei com um problema ao utilizar um gerador de class para Java a partir de um banco de dados e tive problema com um monte de tabelas que começava sempre com o nome BIN$ e terminava com ==0.
Pesquisando no velho google achei que se trata de uma opçao do oracle 10g servindo de proteção para os dados, ou seja, você drop uma tabela ela autimaticamente (caso esteja ativado) irá para o recycle bin.

Para deletar definitivamente do recycle bin utilizei o seguinte comando:

purge recyclebin;

Para saber mais sobre o recycle bin ver o o faq do site http://www.orafaq.com/node/968

Até mais

 

Criando um web services com eclipse

Posted In: , . By Thiago Fonseca

Nesse post vou demonstrar como criar um pequeno web services usando o eclipse.
O que são web services ?

Trata-se de pedaços de lógica de negócio localizada em algum local na web acessada através de padrões baseado em protocolos da Internet como HTTP/SMTP.
Usa três tipo de tecnologia: SOAP, WSDL, UDDI.

  • SOAP (Simple Object Access Protocolo) prover uma estrutura padrão para transportar XML, além de outros tipos de documentos. Assim com um padrão único de transporte heterogenos clientes e servidores podem ser interconectados como exemplo clientes .NET invocando métodos em servidores JAVA.
  • WSDL (Web Service Description Lenguage) trata-se de um XML que descreve a interface padronizada do webservice. Como exemplo o WSDL representa INPUTS e OUTPUTS invocadas externamente.
  • UDDI (Univesal Description, Descovery and Integration) provê um registro do webservice para que outros webservices descrevam, descubra e integre o webservice.
Os webservices são altamente distribuídos sendo Arquitetura Orientada a Serviços (SOA). Autores chamam de "O sonho" da computação distribuída.

Um exemplo prático disso imagine uma empresa A que aluga carros. Uma empresa B é responsável por vender pacotes de viagens. Ambas possuem um portal na internet que a empresa A aluga carros pela internet e a empresa B vende pacotes de viagens. Um cliente quer viajar para o exterior e de preferência queria alugar um carro para passar as férias. Nos dias atuais o site B vende a passagem e para alugar um carro o cliente deve procurar outros sites. Se o site que aluga carro implementar um webservice esse serviço pode ser oferecido para diversas outras empresas onde simplesmente chamariam um método (alugar carro) passando os dados que o cliente quer para que o carro seja alugado sem precisar sair do site B.

Usando o eclipse para implementar um webservices.

Vamos no eclipse -> New -> Dynamic web project. Criaremos um projeto dynamico básico.

Após criar o projeto vamos criar um class chamada Calculadora. Nosso pequeno webservice será o "Cara" para fazer operações de somar, subtrair hehe.

Implementamos os métodos básico na class Calculadora.

public double Somar(double a, double b) {
return a + b;
}
public double Subtrair(double a, double b) {
return a - b;
}

Com a Class gerada vamos novamente em New -> Others -> Web Services -> Web service e clicamos em NEXT.



Na próxima janela arrastaremos o split para test server e no botão browser vamos apontar para a class Calculadora. Observe que existe também a opção para o client mas isso será em um próximo post.



Depois disso clicamos em Finish. Nosso webservice já estará criado. Será apresentada uma janela para que possamos startar nosso webservice caso o tomcat não esteja start. Só clicar no botão start server.
Obs.: Para publicar imaginamos que você tenha configurado o tomcat apache corretamente no eclipse e que tenha as lib Axis do apache que vem com o Eclipse 3.3 adiante.



Após isso aparecerá a janela do Web Service Explorer. Click em Launch para abrir o navegado.


Em seguida aparecerá o Explorer. Nele visualizamos todos nossos serviços oferecido com na imagem abaixo.



Por enquanto nosso webservice só contém o serviço de calculadora. Para testarmos clicaremos em um dos métodos (Somar, Subtair) e entraremos com o Input. A tela é intuitiva.

Como resultado nosso webservice funcionando perfeitamente.



Abraço, até a próxima.