Dicas para Struts 1.x

Como ainda vejo muitos desenvolvedores que utilizam de alguma forma o framework Struts 1.x em projetos pessoais ou profissionais, ou desenvolvedores que estão aprendendo Java e optam por aprender Struts. Resolvi deixar algumas dicas quem podem ajudar o desenvolvimento de aplicações que utilizam este framework.

Essas dicas não são novas e muito menos revolucionárias, até porque este framework já cumpriu o seu papel e hoje em dia já existem inúmeros outros framework que funcionam ou melhor ou de forma equivalente ao Struts 1.x!

Iniciando as dicas:

  1. Vou começar indicando o uso de DynaActionForm em substituição ao ActionForm, imagine ter uma classe Java para cada formulário de seu projeto? Teríamos inúmeras classes java que podem ser substituídas por mapeamento XML do formulário no arquivo de configuração do struts, o struts-config.xml.Exemplo de um formulário configurado no struts-config.xml utilizando DynaActionForm:
    1
    2
    3
    4
    5
    
    <form -bean name="UsuarioForm" type="org.apache.struts.action.DynaActionForm">
      <form -property name="Nome" type="java.lang.String"/>
      <form -property name="Login" type="java.lang.String"/>
      <form -property name="Senha" type="java.lang.String"/>
    </form>
    
  2. Uma outra dica para economizar classes em java é ao invés de estender suas Actions da classe Action e assim ter uma classe para cada ação executada, estender da classe DispatchAction, assim pode-se utilizar mais de uma ação dentro de uma classe java.Classes Java estendendo de Action:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    //arquivo  MinhaAction1.java
    public class IncluirUsuario extends Action {
    
      public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,                          HttpServletResponse response) throws Exception {
        // conteudo da action
        return mapping.findForward("listaUsuario");
      }
    }
    
    //arquivo  MinhaAction2.java
    public class AlterarUsuario extends Action {
    
      public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,                          HttpServletResponse response) throws Exception {
        // conteudo da action
        return mapping.findForward("listaUsuario");
      }
    }
    
    Agora uma classe Java estendendo de DispatchAction e contendo as mesmas duas ações:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public class Usuario extends DispatchAction {
    
      public ActionForward incluir(ActionMapping mapping, ActionForm form, HttpServletRequest request,                          HttpServletResponse response) throws Exception {
        // conteudo da action
        return mapping.findForward("listaUsuario");
    }
    
      public ActionForward alterar(ActionMapping mapping, ActionForm form, HttpServletRequest request,                          HttpServletResponse response) throws Exception {
        // conteudo da action
        return mapping.findForward("listaUsuario");
      }
    }
    
  3. Para colocar o foco em seu input quando o formulário carrega é bem simples basta fazer o seguinte:
    1
    2
    3
    
    <html :form action="UsuarioAcion" focus="Nome">
      <html :text property="Nome"/>
    </html>
    
  4. Precisa limpar os dados de seu DynaActionForm ou DynaValidatorForm? Simples faça assim dentro de sua Action:
    1
    2
    
      DynaActionForm formulario = (DynaActionForm) form;
      formulario.getMap().clear();
    
  5. Deixarei um alguns links interessantes de como utilizar a validação server-side do próprio Struts, como utilizar Tiles em conjunto com Struts para compor seu layout de páginas entre outras dicas. Documentação do Struts. Struts Validator Framework. Developing Simple Struts Tiles Application.

Comments »


Google Developer Day 2008, eu fui!

Nexta sexta-feira (27/06) participei do Google Developer Day 2008 que ocorreu no World Trade Center em São Paulo e contou com profissionais das mais diversas regiões do Brasil.

O evento estava com um público grande, com isso ficou um pouco difícil se locomover e pelo que vi este evento foi bem disputato. Felizmente consegui garantir minha presença.

A primeira palestra ocorreu as 10:00 com um overview da Google em relação aos seus planos de negócio e o mercado brasileiro.

Depois tivemos um pequeno overview sobre os produtos e tecnologias da Google.

Com isso fizemos uma pausa para o almoço, que por sinal foi muito bom, com direito a maça e chocolate.

Após o almoço iniciou-se as palestras técnicas em cada sessão que durava cerca de 1 hora, podia-se escolher entre quatro palestras e com isso ficava meio difícil fazer as escolhas.

A primeira palestra que vi foi sobre a arquitetura Android apresentada por Dick Wall, gostei muito do potencial desta tecnologia e do que ela está pretendendo atingir.

Em seguida fui ver a palestra sobre Google Gears aprensentada por Dion Almaer, também achei esta tecnologia bem interessante ainda mais depois do que vi na palestra.

Novamente outra pausa para coffe-break com direito a pão de queijo, bolo e até uma xícara de café com leite! rs

A penúltima paletra que vi foi sobre Static & Flash Maps aprensentada por Jacob Hoffman-Andrews, uma tecnologia que estou me aprofundando atualmente pois estou utilizando na empresa que trabalho.

E para finalizar vi a palestra denominada de State of AJAX aprensentada por Dion Almaer, achei bem interessante as idéias propostas nesta palestra.

Finalizando gostei muito do evento, das palestras que consegui assistir e dos palestrantes e ainda ganhei alguns presentinhos como caneta e camiseta. Nota 10 para o Google!!!

Comments »


Gerando arquivos PDF a partir de sua aplicação Java

Uma forma de se gerar aquivos PDF diretamente de sua aplicação Java é utilizando um projeto da Apache chamado FOP (Formatting Objects Processor), veja a seguir uma breve descriçao retirada do próprio site do projeto:

FOP (Formatting Objects Processor) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. The primary output target is PDF but other output formats currently supported include:
  • PDF (Portable Document Format)
  • PS (Adobe Postscript)
  • PCL (Printer Control Language)
  • AFP (MO:DCA)
  • SVG (Scalable Vector Graphics)
  • XML (area tree representation)
  • Print
  • AWT/Java2D
  • MIF
  • RTF (Rich Text Format)
  • TXT (text)

Vou demonstrar com um pequeno exemplo, como utilizar a conversão de um documento XML em um documento PDF por uma aplicação Java.

Para iniciar o exemplo vou baixar o arquivo binário no endereço:

http://linorg.usp.br/apache/xmlgraphics/fop/binaries/fop-0.94-bin-jdk1.4.zip

Agora criarei um projeto java e irei incluir os seguintes jar’s necessários para o exemplo que encontram-se no download feito:

Na raiz do projeto irei criar uma pasta chamada documentos e irei colocar um arquivo chamado projeto.xml com o seguinte conteúdo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
< ?xml version="1.0" encoding="UTF-8"?>
<!-- $Id$ -->
<projeto>
  <nomeprojeto>Teste de Aplicacao usando Apache FOP</nomeprojeto>
  <membro>
    <nome>Rodrigo</nome>
    <funcao>Desenvolvedor</funcao>
    <email>teste@teste.com</email>
  </membro>
  <membro>
    <nome>Administrador</nome>
    <funcao>Gerente</funcao>
    <email>admin.teste@teste.com</email>
  </membro>
  <membro>
    <nome>Usuario</nome>
    <funcao>user</funcao>
    <email>user.teste@teste.com</email>
  </membro>
</projeto>

E também irei criar um estilo XSL para o documento XML chamado projeto.xsl dentro da pasta documentos com o seguinte conteúdo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
< ?xml version="1.0" encoding="UTF-8"?>
<!-- $Id$ -->
<xsl :stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl :output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl :param name="versionParam" select="'1.0'"/>
  <!-- ========================= -->
  <!-- elemento principal: projeto           -->
  <!-- ========================= -->
</xsl>
<xsl :template match="projeto">
  <fo :root xmlns:fo="http://www.w3.org/1999/XSL/Format"></fo>
  <fo :layout-master-set></fo>
  <fo :simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
    <fo :region-body/>
  </fo>
  <fo :page-sequence master-reference="simpleA4"></fo>
  <fo :flow flow-name="xsl-region-body"></fo>
  <fo :block font-size="16pt" font-weight="bold" space-after="5mm">Projeto: <xsl :value-of select="nomeprojeto"/></fo>
  <fo :block font-size="12pt" space-after="5mm">Versão <xsl :value-of select="$versionParam"/></fo>
  <fo :block font-size="10pt"></fo>
  <fo :table table-layout="fixed" width="100%" border-collapse="separate">
    <fo :table-column column-width="4cm"/>
    <fo :table-column column-width="4cm"/>
    <fo :table-column column-width="5cm"/>
  </fo>
  <fo :table-body>
    <xsl :apply-templates select="membro"/>
  </fo>
</xsl>

<!-- ========================= -->
<!-- elemento filho: membro               -->
<!-- ========================= -->
<xsl :template match="membro">
  <fo :table-row>
    <xsl :if test="function = 'lead'"></xsl>
    <xsl :attribute name="font-weight">bold</xsl>
  </fo>
</xsl>

<fo :table-cell></fo>
<fo :block>
  <xsl :value-of select="nome"/>
</fo>

<fo :table-cell></fo>
<fo :block>
  <xsl :value-of select="funcao"/>
</fo>

<fo :table-cell></fo>
<fo :block>
  <xsl :value-of select="email"/>
</fo>

Finalmente uma pequena aplicação Java que irá gerar um documento PDF chamado projeto.pdf em uma pasta chamada saida.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package br.com.rodrigolazoti;

import java.io.File;
import java.io.OutputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

public class ExportXMLtoPDF {

  public static void main(String[] args) {
    try {
      File baseDir = new File(".");
      File outDir = new File(baseDir, "saida");
      outDir.mkdir();

      File xmlfile = new File(baseDir, "documentos/projeto.xml");
      File xsltfile = new File(baseDir, "documentos/projeto.xsl");
      File pdffile = new File(outDir, "projeto.pdf");

      FopFactory fopFactory = FopFactory.newInstance();
      FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
      OutputStream out = new java.io.FileOutputStream(pdffile);
      out = new java.io.BufferedOutputStream(out);

      try {
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
        transformer.setParameter("versionParam", "2.0");

        Source src = new StreamSource(xmlfile);
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(src, res);
      }
      finally {
        out.close();
      }
    }
    catch (Exception e) {
      e.printStackTrace(System.err);
      System.exit(-1);
    }
  }
}

Este exemplo foi baseado em um exemplo contido no download feito.

Comments »


Gerador de números aleatórios para megasena em Java

Algum tempo atrás resolvi criar um pequeno programa para gerar números aleatórios para jogos como a megasena, embora o programa esteja planejado para aceitar outros tipos de sorteios (jogos) eu só implementei a geração de números para Megasena.

Seu uso é simples, basta selecionar o tipo de loteria e clicar em sortear, também pode-se mudar o tipo de look and feel (tema).

RL LoteriaGen

Para executá-lo basta executar o comando:

1
java -jar RLLoteriaGen.jar

O projeto foi feito no Eclipse.

Disponibilizei o os fontes do projeto em um repositório no github. Clique aqui para acessar o repositório.

Para fazer o download do arquivo jar clique aqui.

Comments »


Controlando impressoras no Linux via web

Para quem está acostumado a utilizar o linux, provavelmente já deve conhecer o CUPS (Common Unix Printing System) o gerencinciador de impressão que pode ser controlado via web.

Na própria página inicial do gerenciador existe uma introdução, que é a seguinte:

CUPS provides a portable printing layer for UNIX®-based operating systems. It is developed and maintained by Apple Inc. to promote a standard printing solution. CUPS is the standard printing system used on MacOS® X and most Linux® distributions.

CUPS uses the Internet Printing Protocol (“IPP”) as the basis for managing print jobs and queues and adds network printer browsing and PostScript Printer Description (“PPD”) based printing options to support real-world printing.

Para acessar a interface de controle web do gerenciador de impressão, basta acessar o seguinte endereço de qualquer browser instalado no linux:

http://localhost:631/

Através desta interface web pode-se adicionar, alterar, configurar ou remover uma impressora, cancelar impressões entre outras configurações.

Comments »