sábado, 27 de novembro de 2010

Simples Exemplo Struts

Olá Pessoal,

Depois de um bom tempo, sem publicar um post, irei mostrar, como criar uma simples aplicação web, usando o FrameWork Struts 1.3. Para quem não conhece, o Struts é um framework open-source do projeto Jakarta, ele possibilita o desenvolvimento de aplicacões web, atuando como um Controller no padrão MVC e também oferece suporte na camada View, para a construção de páginas JSP através de custom tags.
O exemplo deste post é simples, teremos um formulário para preencher os dados de uma Pessoa, se a idade desta pessoa for maior de 18 anos, encaminhamos para uma página de sucesso, caso contrário, encaminhamos para uma página de falha. O projeto foi desenvolvido, usando o Eclipse + JBoss.
O Struts pode ser baixado no site http://struts.apache.org/download.cgi.
Ao final do post, o projeto será disponibilizado para download, com as libs, já inclusa.
1. Passo: Estrutura do projeto:


2. Passo: Crie uma Classe, chamada Pessoa:
package com.blogspot.jabesfelipe.struts.bean;

public class Pessoa {

private String nome;
private int idade;
private float altura;
private char sexo;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public int getIdade() {
return idade;
}

public void setIdade(int idade) {
this.idade = idade;
}

public float getAltura() {
return altura;
}

public void setAltura(float altura) {
this.altura = altura;
}

public char getSexo() {
return sexo;
}

public void setSexo(char sexo) {
this.sexo = sexo;
}

}
Pessoa.java

3. Passo: Crie uma Classe, chamada PessoaFormBean, ela vai extender da Classe ActionForm, os form-beans se integram a um formulário de entrada de dados.
package com.blogspot.jabesfelipe.struts.formbean;

import org.apache.struts.action.ActionForm;
import com.blogspot.jabesfelipe.struts.bean.Pessoa;

public class PessoaFormBean extends ActionForm {

/**
*
*/
private static final long serialVersionUID = -759773695806534156L;
private Pessoa pessoa = new Pessoa();

public Pessoa getPessoa() {
return pessoa;
}

}
PessoaFormBean.java

4. Passo: Crie uma Classe, chamada PessoaAction, ela vai extender da Classe Action, e vamos sobrescrever o método execute, que funciona como um método main, esta Classe irá funcionar como o nosso Controller, o método execute, irá retornar um ActionForward, o mapeamento, será configurado no arquivo struts-config.xml.
package com.blogspot.jabesfelipe.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.blogspot.jabesfelipe.struts.bean.Pessoa;
import com.blogspot.jabesfelipe.struts.formbean.PessoaFormBean;

public class PessoaAction extends Action {

public static final String SUCESSO = "sucesso";
public static final String FALHA = "falha";
public static final String PESSOA = "pessoa";

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

Pessoa pessoa = ((Pessoa) ((PessoaFormBean) form).getPessoa());
boolean podeEntrar = false;

if (pessoa.getIdade() >= 18) {
podeEntrar = true;
}
request.setAttribute(PESSOA, pessoa);

return podeEntrar ? mapping.findForward(SUCESSO) : mapping.findForward(FALHA);
}

}
PessoaAction.java

5. Passo: Vamos criar nossas páginas JSPs, crie uma página index.jsp:
<%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<logic:forward name="index" />
index.jsp

6. Passo: Crie um JSP, para o formulário:
<%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<html:base/>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Simples Exemplo Struts</title>
</head>
<body>
<html:form focus="pessoa.nome" action="/PessoaAction.do" method="POST">
Nome: <html:text property="pessoa.nome" /><br />
Idade: <html:text property="pessoa.idade" /><br />
Altura: <html:text property="pessoa.altura" /><br />
Sexo: <html:radio property="pessoa.sexo" value="M" />Masculino
<html:radio property="pessoa.sexo" value="F" />Feminino<br /><br />
<html:submit value="Ok"/>
</html:form>
</body>
</html:html>
formulario.jsp

7. Passo: Crie, agora a página de sucesso:
<%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<html:base/>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Simples Exemplo Struts</title>
</head>
<body>
<bean:define id="pessoa" name="pessoa" scope="request" />
Olá <bean:write name="pessoa" property="nome"/>, SEJA BEM VINDO!!! <br />
Sexo:
<logic:equal value="M" name="pessoa" property="sexo">Masculino</logic:equal>
<logic:equal value="F" name="pessoa" property="sexo">Feminino</logic:equal>
<br /><br />
<br />
<html:link action="/Index.do">sair...</html:link>
</body>
</html:html>
sucesso.jsp

8. Passo: Crie, agora a página de falha:
<%@taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<html:base />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Simples Exemplo Struts</title>
</head>
<body>
<bean:define id="pessoa" scope="request" name="pessoa" />
Olá <bean:write name="pessoa" property="nome" />.
<br />
<br />
VOCÊ É MENOR DE IDADE E NÃO PODE ENTRAR!!!
<br />
<html:link action="/Index.do">voltar...</html:link>
</body>
</html:html>
falha.jsp

9. Passo: Agora, precisamos configurar o struts no arquivo web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>struts-exemplo</display-name>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

</web-app>
web.xml

10. Passo: A configuração do arquivo struts-config, incluindo as as definições dos beans,
e os mapeamento das actions:
<?xml version="1.0" encoding="UTF-8"?>

<struts-config>
<!-- FORWARDS GLOBAL -->
<global-forwards>
<forward name="index" path="/Index.do" />
</global-forwards>

<form-beans>

<!-- FORM PESSOA -->
<form-bean name="PessoaFormBean" type="com.blogspot.jabesfelipe.struts.formbean.PessoaFormBean" />

</form-beans>


<action-mappings>

<!-- PAGINA INICIAL -->
<action path="/Index" include="/formulario.jsp" scope="request" />
<action name="PessoaFormBean" type="com.blogspot.jabesfelipe.struts.action.PessoaAction"
path="/PessoaAction" scope="request">
<forward name="sucesso" path="/sucesso.jsp"/>
<forward name="falha" path="/falha.jsp"/>
</action>

</action-mappings>

</struts-config>
struts-config.xml

11. Passo: A aplicação rodando, preenchendo o formulário:

Caso seja sucesso:
Se for falha:

Bom galera, este foi um exemplo de como criar uma simples aplicação web com FrameWork Struts.
Para quem quiser baixar o exemplo, clique aqui.
Qualquer dúvida, crítica ou sugestão, fico à disposição.

quinta-feira, 30 de setembro de 2010

Loop Map

Olá Pessoal,


A Interface Map é bem útil, pois permite que criamos mapas de chaves/valor. O Map possibilita que uma chave única seja criada, que pode ser um tipo primitivo ou um objeto, cada chave poderá apontar para um valor que também pode ser um primitivo ou objeto.
Neste exemplo temos um Map de números, e para percorre-lô, usaremos a Interface Set, que irá obter as Keys do Map, e depois iremos interar usando o Foreach.
Segue um exemplo para fazer um loop em Map:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class LoopMap {

public static void main(String[] args) {

Map mapa = new HashMap();
mapa.put(1, "UM");
mapa.put(2, "DOIS");
mapa.put(3, "TRES");
mapa.put(4, "QUATRO");
mapa.put(5, "CINCO");

Set conjunto = mapa.keySet();
for (Integer key : conjunto) {
System.out.println("Key: " + key + " - Valor: " + mapa.get(key));

}
}
}
LoopMap.java


Resultado:
Key: 1 - Valor: UM
Key: 2 - Valor: DOIS
Key: 3 - Valor: TRES
Key: 4 - Valor: QUATRO
Key: 5 - Valor: CINCO

segunda-feira, 6 de setembro de 2010

Exemplo DataSource JBoss

Olá Pessoal,


Afinal, o que é um DataSource?
DataSource é uma forma de guardar as configurações de conexão com o banco de dados, como por exemplo, deixá-las em um arquivo xml, evitando assim, que as mesmas não ficam fixas no seu código Java.
Neste exemplo, será criado um DataSource que será usado no servidor JBoss 4, a vantagem de usar o JBoss, é que o DS pode ser criado diretamente na pasta de deploy, proporcionando mais liberdade para o desenvolvedor.

A estrutura do arquivo xml do DS, é definida logo abaixo:
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/CLIENTEDS</jndi-name>
<connection-url>URL</connection-url>
<driver-class>DRIVER_CLASSE</driver-class>
<user-name>USUARIO</user-name>
<password>SENHA</password>
</local-tx-datasource>
</datasources>

Legenda:
CLIENTEDS = Nome da datasource que será configurada em sua aplicação
URL = Endereço de sua base
DRIVER_CLASSE = Driver de acesso ao banco de dados
USUARIO = Usuário de acesso base de dados
SENHA = Senha de acesso a base de dados

Por exemplo, vamos configurar, para acessar o banco de dados MySQL:
Crie um arquivo xml, com o nome de database-ds.xml, salve este arquivo no seguinte diretório:
DIRETORIO_DO_SEU_JBOSS/server/default/deploy

No conteúdo do arquivo, deixei configurado assim:
<?xml version="1.0" encoding="UTF-8" ?>

<datasources>
<local-tx-datasource>
<jndi-name>jdbc/databaseDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/java</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<min-pool-size>5</min-pool-size>
<max-pool-size>30</max-pool-size>
<idle-timeout-minutes>1</idle-timeout-minutes>
<prepared-statement-cache-size>32</prepared-statement-cache-size>
</local-tx-datasource>
</datasources>
database-ds.xml

Obs.: Não esqueça de colocar o jar do driver do MySQL, no seguinte diretório:
DIRETORIO_DO_SEU_JBOSS/server/default/lib

Bom, para testar o DataSource, vamos criar um novo projeto web no Eclipse, chamado ExemploDataSource.
Crie um novo file, chamado persistence.xml, dentro da pasta WebContent/META-INF.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="PessoaJPAData" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/jdbc/databaseDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
persistence.xml

Definimos o nome do persistence-unit;
Usamos o Hibernate como provedor JPA;
Colocamos o nome do DS no jta-data-source;
E, por fim, defiminos, que o Hibernate crie automaticamente nossas tabelas do BD.

Agora, vamos criar um Servlet, chamado ServletDS.
package com.blogspot.jabesfelipe.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ServletDS extends HttpServlet {
private static final long serialVersionUID = 1L;

private void processarRequisicao(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
try {
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:jdbc/databaseDS");
Connection connection = dataSource.getConnection();
out.println("Conectado, através da JNDI!");
connection.close();
} catch(Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processarRequisicao(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processarRequisicao(request, response);
}

}
ServletDS.java

Através da JNDI, acessamos nosso DataSource, para testar, inicialize seu JBoss, e digite o endereço: http://localhost:8080/ExemploDataSource/ServletDS

Bom galera, este foi um exemplo de como criar um DataSource no JBoss, e usá-lo em uma aplicação.
Para quem quiser baixar o exemplo, clique aqui.
Qualquer dúvida, crítica ou sugestão, fico à disposição.

sábado, 28 de agosto de 2010

Exemplo de Relatório em Java para web

Olá Pessoal,

Neste post, irei mostrar um exemplo de como fazer um simples relatório em Java para aplicações web, para a geração do relatório usaremos o Jasper Reports que é um Framework open-source, para a criação do layout usaremos o Framework iReport, para testarmos a aplicação, criamos um Servlet, que será executado no servidor JBoss4 usando o Eclipse.
Ao final do post o projeto será disponibilizado para download com todas bibliotecas usadas e os arquivos do relatório.

1. Passo: Estrutura do projeto:



2. Passo: Vamos criar a estrutura do relatório do iReport, crie um relatório com o nome clientes, com o seguinte arquivo xml:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="clientes" language="groovy" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<style name="efeitoZebra">
<conditionalStyle>
<conditionExpression><![CDATA[new Boolean(($V{COLUMN_COUNT}.intValue() % 2) != 0)]]></conditionExpression>
<style mode="Opaque" backcolor="#BAB8B8"/>
</conditionalStyle>
</style>
<parameter name="clientesLista" class="java.util.List"/>
<parameter name="titulo" class="java.lang.String"/>
<parameter name="total" class="java.lang.String"/>
<field name="nome" class="java.lang.String"/>
<field name="endereco" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<field name="cidade" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="38" splitType="Stretch">
<textField>
<reportElement x="109" y="0" width="349" height="35"/>
<textElement lineSpacing="1_1_2">
<font size="20" isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{titulo}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="17" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="34" splitType="Stretch">
<staticText>
<reportElement x="0" y="14" width="137" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Nome]]></text>
</staticText>
<staticText>
<reportElement x="137" y="14" width="149" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Endereço]]></text>
</staticText>
<staticText>
<reportElement x="286" y="14" width="153" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[E-mail]]></text>
</staticText>
<staticText>
<reportElement x="439" y="14" width="133" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Cidade]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="22" splitType="Stretch">
<textField>
<reportElement style="efeitoZebra" x="137" y="0" width="149" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{endereco}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="efeitoZebra" x="439" y="0" width="133" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{cidade}]]></textFieldExpression>
</textField>
<line>
<reportElement x="0" y="20" width="572" height="1"/>
</line>
<textField>
<reportElement style="efeitoZebra" x="0" y="0" width="137" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{nome}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="efeitoZebra" x="286" y="0" width="153" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{email}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="391" y="0" width="181" height="20"/>
<textElement>
<font size="12" isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{total}]]></textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch">
<textField>
<reportElement x="225" y="17" width="80" height="20"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="305" y="17" width="40" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
</band>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
clientes.jrxml

3. Passo: Vamos criar um Servlet, chamado RelatorioServlet, o foco do post é mostrar como fazer relatório em Java, para isto, deixarei toda lógica no Servlet, deixando o projeto com uma baixa coesão, fique a vontade para fazer o projeto com a separação das camadas. Crie também uma JavaBean chamado Cliente, para carregar as informações dos Clientes, criaremos um List de Clientes no próprio Servlet. O exemplo terá uma opção que visualizará o Relatório, usando o método estático viewReport da Classe JasperViewer, a outra opção será o pdf do Relatório usando o método estático printReportToPdfFile da Classe JasperPrintManager.

package modelo;

public class Cliente {
private String nome;
private String endereco;
private String email;
private String cidade;
public Cliente() {
super();
}
public Cliente(String nome, String endereco, String email, String cidade) {
super();
this.nome = nome;
this.endereco = endereco;
this.email = email;
this.cidade = cidade;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}

}
Cliente.java

package relatorio;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import modelo.Cliente;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

public class RelatorioServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public RelatorioServlet() {
super();
}
public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List clientesLista = new ArrayList();
clientesLista.add(new Cliente("Jabes Felipe", "Copacabana, 54", "jabesfelipe@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Camila Ribeiro", "Ipanema,324", "camilarib@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Jaque Silva", "Lapa, 44", "jaquesilva@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Bruna Lira", "Centro, 32", "brunalira@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Amanda Alves", "Lapa, 342", "amandaa@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Priscila Ratina", "Barra Tijuca, 86", "priscilaratina@gmail.com", "Rio de Janeiro"));
clientesLista.add(new Cliente("Carolina Marques", "Copacabana, 234", "carolinamarques@gmail.com", "Rio de Janeiro"));
try {
String acao = request.getParameter("acao") == null ? "" : request.getParameter("acao");
String caminhoJasper = getServletContext().getRealPath("/WEB-INF/classes/relatorio/") + "/";
String caminho = getServletContext().getRealPath("/");
JRBeanCollectionDataSource jrDT = new JRBeanCollectionDataSource(clientesLista);
Map parametros = new HashMap();
parametros.put("titulo", "Relatórios de Clientes");
parametros.put(clientesLista, jrDT);
parametros.put("total", "Total de Clientes: " + clientesLista.size());
JasperPrint jasperPrint = JasperFillManager.fillReport(caminhoJasper + "clientes.jasper", parametros, jrDT);
if("visualizar".equals(acao)) {
JasperViewer.viewReport(jasperPrint, false);
} else if("pdf".equals(acao)) {
JasperPrintManager.printReportToPdfFile(jasperPrint, caminho + "/RelatorioCliente.pdf");
response.sendRedirect("RelatorioCliente.pdf");
} else {
response.sendRedirect("index.jsp");
}
} catch (JRException e) {
e.printStackTrace();
}

}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}

}
RelatorioServlet.java

3. Passo: Para testar, crie um index.jsp, como o do exemplo abaixo:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Relatório em Java</title>
<script type="text/javascript">
function visualizarRelatorio() {
enviar("visualizar");
}

function gerarRelatorioPDF() {
enviar("pdf");
}

function enviar(acao) {
document.forms[0].acao.value = acao;
document.forms[0].target = "_blank";
document.forms[0].action = "./RelatorioServlet";
document.forms[0].submit();
}
</script>
</head>
<body>
<h1>Relatório de Clientes</h1>
<form action="./RelatorioServlet" method="post" onsubmit="return false;">
<input type="hidden" name="acao" />
<input type="submit" value="Visualizar Relatorio" onclick="javascript:visualizarRelatorio();">
<input type="submit" value="Gerar Relatório PDF" onclick="javascript:gerarRelatorioPDF();">
</form>
</body>
</html>
index.jsp

Exemplo: Index
Vizualizando o Relatório:

PDF do Relatório:

Bom galera, este foi um exemplo de como criar relatórios em Java, usando o JasperReport e o iReport,
Para quem quiser baixar o exemplo, clique aqui.
Qualquer dúvida, crítica ou sugestão, fico à disposição.

sexta-feira, 30 de julho de 2010

Exemplo de Facelets com Eclipse e JBoss

Olá Pessoal,


Neste post, irei mostrar um exemplo de como desenvolver aplicações web usando o Framework de template Facelets que é facilmente integrado no JSF. O Facelets oferece alguns vantagens:
Facilidade na criação de templates;
Elimina o "JSP Compiler to Servlet" incrementando de 30% a 50% a performance da aplicação;
Facilidade para criar componentes reutilizáveis;
Usa XHTML como tecnologia de view do JSF;
Precisão para reportar erros.
Quando se desenvolve aplicações em JSF, é recomendável o uso Facelets, em vez de usar include nas subview no JSF.
O exemplo a ser mostrado será desenvolvido usando JSF 1.2, IDE Eclipse e o servidor JBoss.
Antes de começar, precisamos baixar o Facelets, acesse o site: https://www.dev.java.net/files/documents/3448/99102/facelets-1.1.15.B1.zip, recomendo a usar a versão 1.1.15 no JBoss, depois de baixar, descompacta o arquivo e copia os seguintes jar:
el-api-1.0.jar
el-impl-1.0.jar
jsf-facelets.jar

Cole este jars no seguinte diretório do JBoss:
jboss-4.2.3.GA/server/default/deploy/jboss-web.deployer/jsf-libs/

Precisamos baixar apenas o Facelets, as bibliotecas do JSF não precisa baixar, pois no diretório jsf-libs do JBoss, já contêm as bibliotecas do JSF.
A versão do JBoss que estou usando é 4.2.3.

Ao final do post, o projeto será disponibilizado para download, para quem quiser baixar.

O projeto final terá um layout de acordo com a imagem abaixo:



1. Passo: Estrutura do projeto web:


2. Passo: Antes de começar a criar as páginas é necessário fazer algumas configurações tanto no arquivo web.xml quanto no faces-config.xml, primeiro iremos configurar o arquivo web.xml, adicionando alguns parâmetros de contexto.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>facelets</display-name>
<!-- Use Documents Saved as *.xhtml -->
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>

<!-- Special Debug Output for Development -->
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>

<!-- Optional JSF-RI Parameters to Help Debug -->
<context-param>
<param-name>com.sun.faces.validateXml</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.verifyObjects</param-name>
<param-value>true</param-value>
</context-param>

<!-- Servlet JSF -->
<servlet>
<servlet-name>javax.faces.FacesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>javax.faces.FacesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>
web.xml

Agora vamos adicionar o FaceletViewHandler no arquivo faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">

<application>
<!-- Facelets -->
<view-handler>
com.sun.facelets.FaceletViewHandler
</view-handler>
</application>

</faces-config>
faces-config.xml

3. Passo: Agora vamos criar as páginas para ser usadas no Facelets, do tipo .xhtml, para criar com estas extensões no Eclipse, basta criar um novo arquivo file e colocar o nome + a extensão .xhtml.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<head>
<title>Facelets com Eclipse e JBoss Application Server</title>
<link href="css.css" rel="stylesheet" type="text/css" />
</head>

<body>

<div id="tudo">
<div id="topo">
<ui:insert name="topo">
<ui:include src="topo.xhtml" />
</ui:insert>
</div>
<div id="centro">
<div id="menu">
<ui:insert name="menu">
<ui:include src="menu.xhtml" />
</ui:insert>
</div>
<div id="principal">
<ui:insert name="principal">
</ui:insert>
</div>
</div>
<div id="rodape">
<ui:insert name="rodape">
<ui:include src="rodape.xhtml" />
</ui:insert>
</div>
</div>

</body>

</html>
template.xhtml

No código acima, temos algumas tags do Facelets, o ui:insert serve para definirmos um ponto de substituição no template, o ui:include serve para incluir um fragmento.


Agora vamor criar as páginas de fragmentos.
Página topo:
<ui:fragment xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
TOPO
</ui:fragment>
topo.xhtml

A tag ui.fragment é usada para definir um bloco de conteúdo.

Página de menu:
<ui:fragment xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<ul>
<li><h:outputLink value="index.faces">LINK1</h:outputLink></li>
<li><h:outputLink value="index.faces">LINK2</h:outputLink></li>
<li><h:outputLink value="index.faces">LINK3</h:outputLink></li>
<li><h:outputLink value="index.faces">LINK4</h:outputLink></li>
</ul>
</h:form>
</ui:fragment>
menu.xhtml

Página do rodapé:
<ui:fragment xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
RODAPE
</ui:fragment>
rodape.xhtml

Agora vamos criar uma página que irá fazer o relacionamento de composição com o template.
Página index do Facelets:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/template.xhtml">

<ui:define name="principal">
<h1><h:outputText value="Exemplo de Facelets usando Eclipse e JBoss Application Server" /></h1>
<br /><br /><br />
<h:outputText value="Àrea para o conteúdo principal." />
</ui:define>

</ui:composition>

</html>
index.xhtml

A tag ui:composition serve para definir o relacionamento de composição entre esta tela e o template, a tag ui:define serve para substituir a definição da tag ui:insert, nesta tela a única parte que está sendo sobrepondo é a àrea principal.
Crie uma página index.jsp para abertura da aplicação:
<jsp:forward page="index.faces" />
index.jsp

Arquivo css para definir a estrutura e aparência do projeto
* {
padding: 0;
margin: 0;
font-size: 12pt;
}

ul {
list-style: none;
}

body {
text-align: center;
}

#tudo {
width: 800px;
margin: 0 auto;
}

#topo {
width: 100%;
height: 80px;
float: left;
border: 2px solid;
margin-top: 0.5em;
background: red;
}

#centro {
width: 100%;
height: 300px;
float: left;
margin-top: 0.5em;
}

#menu {
width: 20%;
height: 100%;
float: left;
overflow: auto;
border: 2px solid;
background: yellow;
}

#menu li{
display: block;
text-align: center;
}

#principal {
width: 78%;
height: 100%;
float: right;
overflow: auto;
border: 2px solid;
background: silver;
}

#rodape {
width: 100%;
height: 30px;
float: left;
border: 2px solid;
margin-top: 0.5em;
background: lime;
}
css.css

Bom galera, este foi um exemplo de como usar o Facelets nas aplicações JSF,
Para quem quiser baixar o exemplo, clique aqui.
Qualquer dúvida, crítica ou sugestão, fico à disposição.

Jabes Felipe RSS Feed Jabes Felipe