domingo, 15 de maio de 2011

Utilizando EJB2 com Client Servlet e Swing (Parte 2)

Olá Pessoal,


Continuando nosso projeto em EJB2, neste post, vamos criar dois tipos de Client, o primeiro será um projeto web, que vai usar Servlet, o segundo será uma aplicação em Swing, ambos os projetos irão acessar nosso EJB2 por meio do recurso de JNDI.
Uma das grandes vantagens do EJB, é o reuso do código, assim, nossa camada de negócio, poderá ser usada, em diversos tipo de Client.
Ao final deste post, deixarei o projeto completo para download.

1. Passo: Vamos criar um projeto web chamado ExemploEJB-web, nesse projeto, crie um Servlet chamado HelloServlet, lembrando que é necessário adicionar o projeto ExemploEJB2 em Project References, e não esqueça de adionar este projeto como módulo Web no arquivo application.xml que está no projeto EAR.


package com.blogpost.jabesfelipe.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.blogpost.jabesfelipe.service.Hello;
import com.blogpost.jabesfelipe.service.HelloHome;

public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Context initial = new InitialContext();
Object objref = initial.lookup("HelloBean");
HelloHome home = (HelloHome) PortableRemoteObject.narrow(objref,
HelloHome.class);
Hello remote = home.create();

PrintWriter out = response.getWriter();
out.println(remote.showName("Jabes Felipe"));

} catch (NamingException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
}
}
}
HelloServlet.java

Para poder testar nossa aplicação, digite a seguinte URL http://localhost:8080/ExemploEJB2-web/HelloServlet.

2. Passo: Vamos agora, criar um projeto java, chamado ExemploEJB2-swing, crie uma classe HelloSwing, nessa classe, temos um simples JFrame, composto por um campo Texto e Botão, na ação deste botão, vamos chamar nosso método no EJB e ele retornará um valor em String em um componente JOptionPane.
Lembrando que é necessário adicionar o projeto ExemploEJB2 em Project References.

package com.blogpost.jabesfelipe.swing;

import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import com.blogpost.jabesfelipe.service.Hello;
import com.blogpost.jabesfelipe.service.HelloHome;

public class HelloSwing extends JFrame {

public HelloSwing() {
initComponents();
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new HelloSwing().setVisible(true);
}
});
}

private void initService() {
try {

Properties t = new Properties();
t.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
t.put(Context.PROVIDER_URL, "jnp://localhost:1099");
Context context = new InitialContext(t);
Object objref = context.lookup("HelloBean");
HelloHome home = (HelloHome) PortableRemoteObject.narrow(objref,
HelloHome.class);
Hello remote = home.create();

JOptionPane.showMessageDialog(null,
remote.showName(jTxtFldName.getText().toString()));

} catch (NamingException e) {
e.printStackTrace();
} catch (CreateException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}

private void jBtOKActionPerformed(java.awt.event.ActionEvent evt) {
initService();
}

private void initComponents() {

jLblName = new javax.swing.JLabel();
jTxtFldName = new javax.swing.JTextField();
jBtOK = new javax.swing.JButton();
jLblTitle = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jLblName.setText("Informe seu Nome: ");

jBtOK.setText("OK");
jBtOK.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jBtOKActionPerformed(evt);
}
});

jLblTitle.setFont(new java.awt.Font("Courier 10 Pitch", 1, 18)); // NOI18N
jLblTitle.setText("Exemplo - Chamando Serviço EJB2 em Swing");

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addGap(25, 25,
25)
.addComponent(
jLblName)
.addGap(1, 1, 1)
.addComponent(
jTxtFldName,
javax.swing.GroupLayout.PREFERRED_SIZE,
153,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jBtOK))
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addComponent(
jLblTitle)))
.addContainerGap(
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)));
layout.setVerticalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLblTitle)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED,
32, Short.MAX_VALUE)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLblName)
.addComponent(
jTxtFldName,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jBtOK))
.addGap(24, 24, 24)));
pack();
}

private JButton jBtOK;
private JLabel jLblName;
private JLabel jLblTitle;
private JTextField jTxtFldName;

}

Agora só testar nosso projeto, veja como ficou:


Bom galera, enfim, terminamos nosso projeto, que na primeira parte, criamos nosso camada de EJB2 e na segunda criamos um projeto web e Swing para acessar o EJB.
Para quem quiser baixar todos os projeto desenvolvidos, clique aqui.
Qualque dúvida, crítica ou sugestão, fico à disposição.

domingo, 17 de abril de 2011

Utilizando EJB2 com Client Servlet e Swing (Parte 1)

Olá Pessoal,

Com a chegada do EJB3, ficou bem mais simples, desenvolver aplicações que usam Session Bean e Entity, devido a utilização das Annotations, evitando de ficar configurando arquivos XMLs. Entretanto, existe várias aplicações no mercado que utilizam o uso de EJB2, por este motivo, resolvi criar este post, que tem como objetivo, mostrar, como que desenvolve uma aplicação em EJB2 que servirá como nosso modelo, e para utilizar este serviço, iremos usar 2 maneiras, uma usando Servlet e a outra Swing para acessar o EJB2.
Este post terá 2 partes, essa primeira, será o desenvolvimento da camada EJB2 e a segunda parte, criaremos um Client Servlet e Swing. Para o desenvolvimento do projeto, irei utilizar Java 1.6, Eclipse e o JBoss 4.

1. Passo: Vejamos a estrutura da camada de EJB:



2. Passo: Crie um projeto chamado ExemploEJB2 do tipo EJB no Eclipse, neste projeto vamos criar duas Interfaces (Remote e Home) e um SessionBean.

Primeiro criamos a Interface Remote e declaramos nosso método de serviço, neste exemplo é bem simples, teremos um método para mostrar o nome de uma Pessoa.

package com.blogpost.jabesfelipe.service;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface Hello extends EJBObject {

public String showName(String name) throws RemoteException;

}
Hello.java

Criamos a Interface Home:

package com.blogpost.jabesfelipe.service;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome

public interface HelloHome extends EJBHome {

public Hello create() throws RemoteException, CreateException;

}
HelloHome.java

Agora criamos nosso SessionBean e iremos implementar nosso método que foi declarado na Interface:

package com.blogpost.jabesfelipe.service;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloBean implements SessionBean {

public String showName(String name) {
return "Meu nome é " + name + "!";
}

public void ejbCreate() throws CreateException {
System.out.println("Bean criado");
}

@Override
public void ejbActivate() throws EJBException, RemoteException {
System.out.println("Bean ativado");
}

@Override
public void ejbPassivate() throws EJBException, RemoteException {
System.out.println("Bean desativado");
}

@Override
public void ejbRemove() throws EJBException, RemoteException {
System.out.println("Bean removido");
}

@Override
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {}

}
HelloBean.java

3. Passo: Agora vamos configurar (name, state, etc...) do EJB no arquivo ejb-jar.xml que fica dentro da pasta META-INF.
O arquivo vai ficar conforme o modelo abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar id="ejb-jar_ID">
<display-name>ExemploEJB2</display-name>

<enterprise-beans>
<session>
<display-name>HelloBean</display-name>
<ejb-name>HelloBean</ejb-name>
<home>com.blogpost.jabesfelipe.service.HelloHome</home>
<remote>com.blogpost.jabesfelipe.service.Hello</remote>
<ejb-class>com.blogpost.jabesfelipe.service.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>

</ejb-jar>
ejb-jar.xml

4. Passo: Vamos criar um arquivo jboss.xml dentra da pasta META-INF, e neste arquivo definimos o nome da JNDI que irá acessar o EJB.

<?xml version='1.0' encoding='UTF-8' ?>
<jboss>

<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<jndi-name>HelloBean</jndi-name>
</session>
</enterprise-beans>

</jboss>
jboss.xml

5. Passo: O nosso EJB está pronto, agora crie um projeto chamado ExemploEJB2-ear do tipo EAR, e vamos configurar o módulo EJB no arquivo application.xml que fica dentro da pasta META-INF.

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" id="Application_ID" version="5">
<display-name>ExemploEJB2-ear</display-name>
<module>
<ejb>ExemploEJB2.jar</ejb>
</module>
</application>

Bom galera, nossa camada de EJB, está pronta, e na próxima parte do tutorial, vamos testa-lá, usando Servlet e Swing.
Qualquer dúvida, crítica ou segestão, fico à disposição.

sábado, 29 de janeiro de 2011

Revisar códigos Java com PMD

Olá Pessoal,

Quando terminamos de programar determinado código, as vezes, não fazemos uma revisão no código, seja, por falta de tempo, falta de hábito, enfim.... Por isso, resolvi criar este post, para mostrar uma solução para esses casos, simplesmente, vamos usar o PMD, o que é PMD?
PMD é um projeto OpenSource usado para verificar códigos e mostrar os determinados erros que ocorrem nos códigos.
Para facilitar ainda mais nossos testes, vamos baixar o plugin do PMD para o Eclipse, acesse o Menu -> Help -> Install New Software, depois adiciona um novo endereço, deixa o name como PMD e o location como http://pmd.sourceforge.net/eclipse, para este exemplo estou usando o plugin para o Eclipse 3.
Criei um novo Java Project, e depois criei uma Classe Dog.java, como descreve a imagem abaixo:

Essa é uma simples Classe, entretanto o código dela, tem uma redundância, vamos executar o PMD para testar o código.
Clique com o botão direito na Classe Dog.java -> PMD -> Check Code With PMD.


Como vemos na imagem, a guia Violations Overview, mostrou uma ocorrência, que está na linha 10, está dizendo que a variável de referência dog está recebendo dois novos objetos, o que está na linha 10 e na linha 17, simplesmente, poderia ter um apenas.
O PMD não restringe apenas como esse teste, pode ser feito vários tipos que verificação em códigos, e também pode configurar o PMD com regras especificas para determinados testes.
Qualquer dúvida, crítica ou sugestão, fico à disposição.

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.

Jabes Felipe RSS Feed Jabes Felipe