segunda-feira, 29 de setembro de 2014

Processamento de texto com JFileHelper

Caros leitores, resolvi escrever esse post porque não achei muito material referente a essa tecnologia. Logo, espero ajudar e contribuir a todas as pessoas que precisam de uma ajuda e não conseguiu encontrar.

A API JFileHelper serve para processamentos de texto e no meu caso foi usado para processar arquivos do formato txt mas, não sei, se é possível processar arquivos em outros formatos. Acredito que não pois, no site da API não diz nada sobre isso.

Nesse post serão usados os exemplos do site da API, a fim de facilitar o processo de aprendizagem. É possível processar texto com diferentes formatos. Quando digo formatos, quero dizer que a API suporta arquivos em que seus campos estão separados por algum caracter (, | . ; -) ou espaçamento.

Não irei abordar aqui todo o poderio que a API possui. Caso queira tal conhecimento, aconselho que visite o site oficial:

http://jfilehelpers.com/

No nosso exemplo, usaremos um arquivo em que seus campos possuem tamanho fixo. Segue abaixo:


Os pontinhos representam a quantidade de posições que cada campo possui. Para tal arquivo de texto, precisaremos construir uma classe com a seguinte estrutura.


Agora vamos às explicações e curiosidades.

@FixedLengthRecord() -> Determina que está classe irá lidar com arquivos de tamanho fixo.

@FieldFixedLength(inteiro) -> Determina que o atributo marcado terá somente o número de posições especificadas na anotação.

@FieldAlign(alignMode=AlignMode.Right) -> Determina que o campo marcado será alinhado à direita quando for retirado do texto. Para mais informações, visitar o seguinte site:

https://github.com/fcoury/jfilehelpers/blob/master/Source/src/org/coury/jfilehelpers/enums/AlignMode.java

@FieldTrim(trimMode=TrimMode.Right) -> Determina que o campo marcado terá seus espaços em branco retirados à direita. Para mais informações, visitar o seguinte site:

https://github.com/fcoury/jfilehelpers/blob/master/Source/src/org/coury/jfilehelpers/enums/TrimMode.java

@FieldConverter(converter = ConverterKind.Date, format = "dd-MM-yyyy") -> Determina que o campo será convertido para a classe especificada no atributo converter e no formato especificado no atributo format. Para mais informações, visitar o seguinte site:

https://github.com/fcoury/jfilehelpers/blob/master/Source/src/org/coury/jfilehelpers/annotations/FieldConverter.java

https://github.com/fcoury/jfilehelpers/blob/master/Source/src/org/coury/jfilehelpers/enums/ConverterKind.java

@FieldOptional -> Determina que o campo será opcional.

@FieldIgnored -> Determina que o atributo marcado será ignorado no processamento do texto.

CURIOSIDADE: A API funciona de forma posicional, ou seja, a ordem dos atributos é importante. No nosso exemplo, possuíamos o atributo name, o qual era precedido pelo atributo custId. No arquivo esta ordem deve ser mantida e vice-versa.

Caro leitor, se você possuir algum conhecimento sobre tal tecnologia ou, notar que cometi algum erro, sendo primário ou não, enriqueça-nos com seu comentário abaixo.
Leia Mais ››

segunda-feira, 8 de setembro de 2014

Projeto Spring MVC para estudos

Pessoal vou por aqui zipado um projeto pronto para fins de estudo. O projeto possui as seguintes tecnologias:


  • Spring MVC , Core, ORM e AOP 3.1.2
  • JPA
  • Hibernate 4.1.7
  • JSP e JSTL 1.2
  • JasperReports 5.1.0
  • MySQL 5.1.18
  • Servlet 1.0.1
  • Tiles 2.2.2
  • Gson 2.2.4
  • Javax Mail 1.4.3
  • Tomcat v7.0.54

Leia Mais ››

terça-feira, 2 de setembro de 2014

Máscara para RG e CPF

Seguem abaixo máscaras para RG e CPF, aceitando pontos e traços. A solução foi construída com regex na linguagem javascript.

RG (99.999.999-0): /^[0-9]{2}\.[0-9]{3}\.[0-9]{3}\-[0-9]{1}$/


CPF (999.999.999-99): /^[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}$/
Leia Mais ››

sexta-feira, 18 de julho de 2014

Como criar um projeto no Eclipse com webapp, src/main/java e etc.

Este post é sobre uma questão que eu já vinha pesquisando já tem um tempo e que me deu uma bela dor de cabeça. Porém, não vamos perder mais tempo. Mão na massa.

O meu problema era: precisava criar um simples HelloWorld com Spring MVC com a estrutura de projeto do maven. Quando digo "estrutura de projeto do maven", quero dizer um projeto web com a pasta webapp, src/main/java, entre outras.

Depois de muita dor de cabeça e muita pesquisa, achei a solução. Abaixo, a minha lista de ferramentas:

  • Eclipse Kepler
  • Maven 3.0.4 (Esse maven já veio no Eclipse)
Abra o eclipse com o seu workspace. Crie um projeto Maven seguindo os passos do vídeo abaixo.

Vídeo nº1

Se você seguiu os mesmos passos vídeo nº 1, irá notar que o container web criado foi na versão 2.3 e que não foram criados os packages src/main/java e src/test/java. Não se espante, isso é normal. Um bug acabou de acontecer.

UMMMM BUUGGGG !!!!

Como fazemos para corrigir esse bug ? Siga os passos do vídeo nº 2.

Vídeo nº 2

Nossa, nesse momento você deve estar se sentindo perdido porque, nesse vídeo realizamos vários passos.

Primeiro, vamos entender o que aconteceu. Quando o projeto foi criado, ele teve o seu arquivo de classpath gerado e nele foi especificado que outras pastas além, da pasta resources também teriam arquivos. Essas pastas são: test e java. No vídeo é possível notar que, quando abrimos o Build Path do projeto, existem duas pastas que estão faltando, justamente as pastas que citamos acima. Para resolver esse bug, ou removemos alguma das pastas do Build Path e apertamos o botão Ok ou, adicionamos uma pasta nova no File System(Windows Explorer) do projeto, adicionamos a mesma no Build Path, apertamos Ok, e depois removemos a mesma.

A segunda solução foi a usada no vídeo. Como disse acima, o que aconteceu foi um bug. Uma escrita no arquivo de classpath foi feita mas, as pastas não foram criadas. Logo, precisamos realizar alguma ação que dê um "refresh" no projeto e assim, o Eclipse irá criar as pastas corretas com as configurações corretas.

Pronto, já temos um projeto criado de forma funcional. No início do nosso post, comentei que o projeto gerado com base no archtype do Maven tem o container web na versão 2.3. Existe aí, um outro problema. A versão 2.3 é um pouco limitada, por exemplo: caso seja necessário usar EL, será necessário adicionar a declaração abaixo:

<%@ page isELIgnored="false" %>
Recomendo a leitura do post do blog do Mkyong que, explica isso e foi de lá que, consegui esta explicação.

http://www.mkyong.com/spring-mvc/modelandviews-model-value-is-not-displayed-in-jsp-via-el/

Agora imagine que, em todas as suas páginas você tenha que adicionar essa declaração. Cansativo, né ? A chance de cometer erros aumenta muito. Na versão 2.5 do container web, o uso de EL é automático e o arquivo web.xml é escrito de forma diferente. Neste momento, o caro leitor deve pensar: "Ahh !! Isso é mole, é só eu ir no Project Facets do projeto e mudar para 2.5 o web module" e eu respondo em seguida: "Você está completamente errado".

Caso alguém tente fazer o que foi pensado acima, não conseguirá pois, o Eclipse acusa um conflito. Então, mais uma vez teremos de dar nosso jeito. Siga os passos do vídeo nº 3 para mudar o web module do projeto de 2.3 para 2.5.

Vídeo nº 3

No vídeo 3 mudamos um arquivo de configuração do próprio Eclipse. Desta forma, forçamos a mudança de versão do web module mas, o arquivo web.xml também precisa ser modificado conforme é mostrado no blog do Mkyong. Com o arquivo web.xml regerado, é necessário mudar o Java Compiler do projeto pois, mexemos na versão do Java usado.

Feito isso tudo, é só começar a programar e ser feliz.

Espero que esta minha contribuição ajude a muitos pois, foi muito difícil chegar a essa solução. Caso alguma outra pessoa consiga outras soluções, diferentes das minhas, para o mesmo problema, deixe sua contribuição nos comentários.

Até a próxima.

Leia Mais ››

quarta-feira, 9 de julho de 2014

Gravar ano(Year) em banco MySQL usando Java

Caros leitores, a ajuda de hoje vai ser rápida. Vamos supor que temos a tabela abaixo:


A coluna id é do tipo Integer, a coluna nome é do tipo Varchar e a coluna data_aniversario é do tipo Year. Quando estamos lidando com uma tabela e usando Hibernate, as coisas se tornam mais fáceis porque, o hibernate grava o registro para o desenvolvedor e não é necessário montar query de INSERT e atribuir os valores a mesma. Porém, quando estamos usando JDBC puro e quando digo puro estou falando do pacote java.sql, precisamos lidar com a atribuição de valores à query e essa atribuição, às vezes, pode ser um pouco complicada.

Para tratarmos a gravação de dados com colunas do tipo Year, fazemos da seguinte forma:

String query = "INSERT .....";
...
preparedStatement.setInt(1, obj.getId());
preparedStatement.setString(2, obj.getNome());

Calendar c = Calendar.getInstance();
c.setTime(obj.getAnoNascimento());
preparedStatement.setInt(3, c.get(c.YEAR));

preparedStatement.execute();

É isso galera, espero ter ajudado. Ficamos por aqui hoje.
Leia Mais ››

Focus no JInternalFrame

E quando eu penso que, não terei de mexer mais com algum projeto em Swing, me engano e lá vamos nós...

Nesse projeto que estava desenvolvendo, estava usando JInternalFrame para confecção de telas. Quando uma tela era aberta, eu queria que ela fosse aberta com o focus. Depois de muito pesquisar, achei a solução na própria documentação.

Segue solução para o problema:

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

Também descrevo abaixo algumas boas práticas no uso de JInternalFrame, retiradas da documentação da API.

Rules of Using Internal Frames

If you have built any programs using JFrame and the other Swing components, then you already know a lot about how to use internal frames. The following list summarizes the rules for using internal frames. For additional information, see How to Make Frames and The JComponent Class.
You must set the size of the internal frame.
If you do not set the size of the internal frame, it will have zero size and thus never be visible. You can set the size using one of the following methods: setSizepack, orsetBounds.
As a rule, you should set the location of the internal frame.
If you do not set the location of the internal frame, it will come up at 0,0 (the upper left of its container). You can use the setLocation or setBounds method to specify the upper left point of the internal frame, relative to its container.
To add components to an internal frame, you add them to the internal frame's content pane.
This is exactly like the JFrame situation. See Adding Components to the Content Pane for details.
Dialogs that are internal frames should be implemented using JOptionPane or JInternalFrame, not JDialog.
To create a simple dialog, you can use the JOptionPane showInternalXxxDialog methods, as described in How to Make Dialogs.
You must add an internal frame to a container.
If you do not add the internal frame to a container (usually a JDesktopPane), the internal frame will not appear.
You need to call show or setVisible on internal frames.
Internal frames are invisible by default. You must invoke setVisible(true) or show() to make them visible.
Internal frames fire internal frame events, not window events.
Handling internal frame events is almost identical to handling window events. See How to Write an Internal Frame Listener for more information.
Se alguém precisar de alguma ajuda no inglês, deixe um comentário, que eu dou uma forçinha.

Referência:
http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html
Leia Mais ››

quarta-feira, 21 de maio de 2014

Passar lista de string como datasource - ireport

Olá amigos,

esse post aqui será bem breve. Vamos supor que temos um relatório no ireport (independente da versão) com o seguinte layout:


Note, que na listagem de carros só existem seus respectivos nomes e o texto do título do estático. A paginação realizada foi feita usando variável nativa do ireport. Neste exemplo, não será necessário construir uma lista de objetos Carro ou Automovel para exibir os carros no relatório, basta somente criar uma lista de strings e adicionar os nomes dos carros nela. Porém, agora um problema surge. Como fazemos para que o jasperreport itere esse lista, já que ele espera que um Field ($F), sendo esse o dado que está dentro de cada posição da lista ?

A resposta é simples !! Depois de muito pesquisar, achei no link abaixo a solução.

http://www.guj.com.br/java/240613-array-de-string-no-ireport-resolvido

Para iterar uma lista de objetos simples (String, Integer, Long, etc.) que, foi passada como datasource, basta somente criar um Field com o nome de _THIS, tendo o tipo o mesmo do objeto. Exemplo:

Se temos uma lista de Integer, criamos o Field _THIS do tipo Integer
Se temos uma lista de String, criamos o Field _THIS do tipo String

Depois de ter criado o Field, clique e arraste-o para a banda detail e pronto, é só compilar e executar seu relatório que, os dados aparecerão iterados.
Leia Mais ››