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

quarta-feira, 15 de outubro de 2014

Tutorial Struts 2 + JasperReports

Caros leitores, foi muito difícil encontrar um tutorial ou manual de Struts 2 + Jasper Reports que fosse rico em detalhes. Encontrei uns tutoriais que explicavam como eu podia fazer mas, não diziam quais eram as versões de libs utilizadas. Isso causou horas e horas de tentativas e erros. Então, para solucionar eu tive que testar as várias combinações de versões de libs mas, enfim cheguei a combinação correta.

Caso você seja aquele tipo de pessoa apressada, disponibilizo aqui o projeto pronto para estudo. Clique aqui para baixar o projeto e, aqui para baixar o tomcat.

Então, sem mais firulas, vamos à lista de ingredientes.

  • Eclipse Luna (4.4.0)
  • Maven
  • Struts 2.3.1.2
  • Jasper Reports 5.1.0
  • Struts2 Jasper Reports plugin 2.3.16.3
  • Javax Servlet 2.5
  • Tomcat 7.0.54
Neste post não irei abordar como confeccionar o jrxml. No projeto já existem um jrxml e um jasper prontos. Logo, não se preocupe.

Mãos à massa !!!

Crie uma action chamada JasperAction e faça essa classe herdar de ActionSupport. Crie um atributo do tipo ArrayList com o nome de myList, crie seus métodos get e set; e um método execute, com essa assinatura.

public String execute() throws Exception {}

O atributo myList representa o datasource do nosso relatório. Datasource é a fonte de dados usada para o relatório. Essa fonte pode ser expressa de algumas formas, dentre as quais temos:uma conexão de banco, uma lista de objetos ou um data source vazio (JREmptyDataSource). No nosso exemplo será uma lista de objetos do tipo Person.

Crie a classe Person. Essa classe possuirá os atributos:
  • id - Long
  • name - String
  • lastName - String
Crie os gets e sets e os seguintes construtores:


    public Person() {
    }
    public Person(String name, String lastName) {
        this.name = name;
        this.lastName = lastName;
    }
    public Person(Long id, String name, String lastName) {
        this.id = id;
        this.name = name;
        this.lastName = lastName;
    }

Agora basta criar objetos do tipo Person e adicioná-los à lista. Feito isso, pronto !! Nossa action já está terminada. Agora você se pergunta:

"Mas, eu sei que no struts 1 eu precisava invocar as classes do Jasper, passando como parâmetro o caminho do jrxml, o datasource e os possíveis parâmetros o qual, é um HashMap. Depois disso, gero um array de bytes e passo isso para o response, defino um content type, um content disposition (habilitar para download), realizo o write, faço o flush e o close do response. Aonde está tudo isso aí !?"

Bem, vamos as respostas. De fato ainda é necessário definir os parâmetros dentro de um HashMap mas, isso foi melhorado. Mas, essa melhora não só afeta a passagem de parâmetros do relatório mas, como afeta toda a forma de se utilizar Jasper Reports com Struts 2. Agora, não é mais necessário executar todos esses passos que eram feitos no Struts 1 basta, eu definir meu datasource e parâmetros. Feito isso, o Struts 2 lida com o resto. Mas, como ele lida ?

Vá ao struts.xml e mapeie sua action desta forma.

<package name="jasper" namespace="/Jasper" extends="jasperreports-default">
   <action name="myJasperTest" class="action.JasperAction">
       <result name="success" type="jasper">
           <param name="location">/WEB-INF/jasper/template.jasper</param>
           <param name="contentDisposition">attachment;filename="arq.pdf"</param>
           <param name="dataSource">myList</param>
           <param name="format">PDF</param>
       </result>
   </action>
</package>

Não irei explicar aqui o que significa as tags <package>, <action>, <result>, <param>. Caso queira maiores explicações, acesse os links abaixo:


Quero que neste momento você note em duas coisas. A primeira é o extends do meu package e a segunda é o type="jasper" do meu result. Tanto o extends quanto o type estão definidos no plugin Struts 2 Jasper Reports. Lá é definido que os parâmetros (<param>) definidos no mapeamento irão para uma classe específica do plugin (JasperReportsResult) e ela irá fazer todo aquele processamento de geração do relatório.

Note a inversão de controle (IoC) acontecendo de forma linda. S2 S2 S2

O parâmetro location simboliza aonde está o arquivo jasper, o parâmetro contentDisposition simboliza como o arquivo será disponibilizado. No nosso caso, será um download. O parâmetro de dataSource é o que foi falado no início do tópico. Porém, repare que o mesmo nome escrito aí, é o mesmo nome do atributo da nossa action. Isto é necessário pois, um "get" será realizado. Por último, temos o parâmetro format que, como o nome já diz é o formato do arquivo.

Agora, é só abrir o browser e acessar essa url.


Gostou ? Não gostou ? Achou coisa errada ? Comente abaixo que iremos resolver juntos.

OBSERVAÇÃO: Caso você tenha alguma curiosidade de saber como o plugin funciona ou ver como funciona a questão do extends e do type, baixe o JAR do plugin, descompacte-o com o WinRar e veja o arquivo struts-plugin.xml.
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 ››

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 ››

segunda-feira, 10 de dezembro de 2012

Ireport corta texto

Mais uma vez desenvolvendo um relatório me deparei com um problemão, quando mandava uma string muito grande para ser exibida no report, a string vinha cortada, o texto não vinha completo. Pesquisando que nem um doido, descobri que isso era causado pela fonte que estava usando e pelo fato de uma propriedade não estar marcada.

A configuração de fonte que estava usando era: Tahoma - 8pt no report e no pdf era Sans-Serif - 8pt e isso era parte do problema. Para que funcionasse perfeitamente a exibição dos dados, tinha de mudar a fonte do report para Arial. Existe uma compatibilidade entre fontes por causa do espaçamento delas.

Um outro ponto que foi chave na solução do problema, foi marcar a seguinte propriedade:

"net.sf.jasperreports.print.keep.full.text

Property used to determine whether the fill process must preserve the original text for text elements that are not able to fit their entire contents. When this property is set, the engine saves the original text in the JRPrintText print text object, along with the index at which the text is to be truncated by the print object."


Essa propriedade está disponibilizada quando você dá um duplo clique em cima de seu parâmetro, field ou variável que representa a string. Existe um espaço para propriedades especiais que nem essa, clique no botão "Edit parameter properties" ou "Edit field properties, uma janela abrirá e nela você verá uma lista de propriedade e dois campos. Clique na propriedade descrita acima, automaticamente o primeiro campo será preenchido e no segundo campo informe que o valor dela será true.

Pronto, isso soluciona o problema. Espero ter ajudado.

http://www.guj.com.br/java/129174-jasper--ireport-cortando-texto
Leia Mais ››