quarta-feira, 22 de outubro de 2008

CRUD com JSF e JPA - parte3/3

Ola pessoa!!!...
Depois de muito tempo sem fazer nenhum post, aqui estou eu firme e forte para publicar a parte final deste tutorial!!!

A aplicação deste tutorial se encontra disponível na integra no link abaixo:

TUTORIAL_DAY_CRUD.zip


E vamos lá!!!...

As paginas JSP devem ser criadas no diretório /WebContent da aplicação web.


Página formCity.jsp

Esta página contém o formulário de Cadastro de Cidades.









Página formClient.jsp

Esta página contém o formulário de Clientes.












Página alterClient.jsp


Esta página contém o formulário de alteração de dados do cliente.











Página listCity.jsp

Esta página exibe uma lista de Cidades cadastradas tendo a opção de deletar as mesmas.






Página listClient.jsp

Esta página exibe uma lista de Clientes cadastrados e possibilita a alteração (chama outro formulário através do método do bean clientview) e/ou exclusão dos mesmos.









index.jsp

Esta página contém a entrada principal da nossa aplicação, nela possui chamadas para os demais formulários.









Espero que tenham gostado deste tutorial simples...
e qualder duvida é só deixar em comentários.

Valeuwww... =P

segunda-feira, 18 de fevereiro de 2008

CRUD com JSF e JPA - parte2/3

Agora iremos criar a classe ClientController no pacote com.tutorialday.controller , a mesma será o nosso FacesBean.

 

CLASSE ClientController

package com.tutorialday.controller;

import java.util.List;

import javax.faces.model.DataModel;

import javax.faces.model.ListDataModel;

import javax.faces.model.SelectItem;

import com.tutorialday.dao.BaseDao;

import com.tutorialday.model.City;

import com.tutorialday.model.Client;

public class ClientController {

private Client client;

private City city;

private DataModel model;

private String ccity;

public String getCcity() {

return ccity;

}

public void setCcity(String ccity) {

this.ccity = ccity;

}

public City getCity() {

return city;

}

public void setCity(City city) {

this.city = city;

}

public Client getClient() {

return client;

}

public void setClient(Client client) {

this.client = client;

}

// METODO QUE CRIA UM OBJETO CLIENT

public String newClient(){

this.client = new Client();

return "newClient";

}

// METODO QUE MANIPULA A PERSISTÊNCIA DO OBJETO CLIENT

public String create(){

BaseDao<City> cdao = new BaseDao<City>();

City city = cdao.findCityByName(ccity); // FAZENDO CONSULTA PELO NOME DA CIDADE

setCity(city); // "SETANDO" A CIDADE

BaseDao<Client> dao = new BaseDao<Client>();

client.setCity(city);

dao.create(client);

return "success_creCli";

}

// METODO QUE MANIPULA A EXCLUSÃO DO OBJETO CLIENT

public String delete(){

BaseDao<Client> dao = new BaseDao<Client>();

Client client = (Client) model.getRowData();

dao.delete(client);

return "success_delCli";

}

// METODO QUE CATA O OBJETO CLIENT DA DATATABLE (PAGINA)

public String edit(){

Client client = (Client) model.getRowData();

setClient(client);

return "editCli";

}

// METODO QUE MANIPULA A ALTERAÇÃO DO OBJETO CLIENT

public String update(){

BaseDao<City> cdao = new BaseDao<City>();

City city = cdao.findCityByName(ccity);

setCity(city);

BaseDao<Client> dao = new BaseDao<Client>();

client.setCity(city);

dao.update(client);

return "success_upd";

}

// METODO QUE CRIA UM OBJETO CITY

public String newCity(){

this.city = new City();

return "newCity";

}

// METODO QUE MANIPULA A PERSISTÊNCIA DO OBJETO CITY

public String createCity(){

BaseDao<City> cdao = new BaseDao<City>();

cdao.create(city);

return "success_creCity";

}

// METODO QUE MANIPULA A EXCLUSÃO DO OBJETO CITY

public String deleteCity(){

BaseDao<City> dao = new BaseDao<City>();

City city = (City) model.getRowData();

dao.delete(city);

return "success_delCity";

}

// METODO QUE CATA O OBJETO CITY DA DATATABLE (PAGINA)

public String editCity(){

City city = (City) model.getRowData();

setCity(city);

return "editCity";

}

// METODO QUE MANIPULA A ALTERAÇÃO DO OBJETO CITY

public String updateCity(){

BaseDao<City> dao = new BaseDao<City>();

dao.update(city);

return "success_upd";

}

// METODO QUE RETORNA UMA LISTA DE CLIENT PARA O

// DATATABLE

public DataModel getAllClient(){

BaseDao<Client> dao = new BaseDao<Client>();

model = new ListDataModel(dao.allClient());

return model;

}

// METODO QUE RETORNA UMA LISTA DE CITY PARA O DATATABLE

public DataModel getAllCity(){

BaseDao<City> dao = new BaseDao<City>();

model = new ListDataModel(dao.allCity());

return model;

}

// METODO QUE RETORNA UMA LISTA COM OS NOMES DAS CITYS

//PARA O SELECTITEMS (PAGINA)

public List getListNameCity(){

BaseDao<SelectItem> dao = new BaseDao<SelectItem>();

return dao.listCity();

}

}

Devemos agora criar um o arquivo persistence.xml no diretório META-INF que criamos, este arquivo mapeará nossas classes models e o banco de dados.

ARQUIVO persistence.xml

<persistence 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 persistence_1_0.xsd"

version="1.0">

<persistence-unit name="tutorial" transaction-type="RESOURCE_LOCAL">

<provider>

oracle.toplink.essentials.PersistenceProvider

</provider>

<class>com.tutorialday.model.Client</class>

<class>com.tutorialday.model.City</class>

<properties>

<property name="toplink.logging.level" value="FINE" />

<property name="toplink.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver" />

<property name="toplink.jdbc.url" value="jdbc:db2://localhost:50000/TUTORIAL" />

<property name="toplink.jdbc.password" value="SENHA AQUI" />

<property name="toplink.jdbc.user" value="USUARIO AQUI" />

</properties>

<!-- MySQL DataBase

<properties>

<property name="toplink.logging.level" value="FINE" />

<property name="toplink.jdbc.driver"

value="com.mysql.jdbc.Driver" />

<property name="toplink.jdbc.url"

value="jdbc:mysql://localhost:3306/TUTORIAL" />

<property name="toplink.jdbc.password" value="" />

<property name="toplink.jdbc.user" value="root" />

</properties>

-->

</persistence-unit>

</persistence>

Devemos observar que temos em comentário neste XML a configuração para o banco de dados MySQL(em fonte verde), não esqueça de colocar o usuário e a senha corretamente do seu banco de dados.

Para finalizarmos esta segunda etapa deste tutorial agora iremos mapear o nosso FacesBean e fazer a regra de navegação no arquivo faces-config.xml que se encontra dentro de ../WebContent/WEB-INF/ . Entre as tags <faces-config> </faces-config>  , devemos adicionar as tags abaixo:

 

<!-- Bean ClientController -->

<managed-bean>

<managed-bean-name>clientView</managed-bean-name>

<managed-bean-class>

com.tutorialday.controller.ClientController

</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>

</managed-bean>

<navigation-rule>

<display-name>newCity</display-name>

<from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>newCity</from-outcome>

<to-view-id>/formCity.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>newClient</display-name>

<from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>newClient</from-outcome>

<to-view-id>/formClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>listCity</display-name>

<from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>ListCity</from-outcome>

<to-view-id>/listCity.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>listClient</display-name>

<from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>ListClient</from-outcome>

<to-view-id>/listClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>successCreCity</display-name>

<from-view-id>/formCity.jsp</from-view-id>

<navigation-case>

<from-outcome>success_creCity</from-outcome>

<to-view-id>/listCity.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>successDelCity</display-name>

<from-view-id>/listCity.jsp</from-view-id>

<navigation-case>

<from-outcome>success_delCity</from-outcome>

<to-view-id>/listCity.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>successCreClient</display-name>

<from-view-id>/formClient.jsp</from-view-id>

<navigation-case>

<from-outcome>success_creCli</from-outcome>

<to-view-id>/listClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>successDelClient</display-name>

<from-view-id>/listClient.jsp</from-view-id>

<navigation-case>

<from-outcome>success_delCli</from-outcome>

<to-view-id>/listClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>editClient</display-name>

<from-view-id>/listClient.jsp</from-view-id>

<navigation-case>

<from-outcome>editCli</from-outcome>

<to-view-id>/alterClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

<navigation-rule>

<display-name>successUpdClient</display-name>

<from-view-id>/alterClient.jsp</from-view-id>

<navigation-case>

<from-outcome>success_upd</from-outcome>

<to-view-id>/listClient.jsp</to-view-id>

</navigation-case>

</navigation-rule>

Pronto! Temos nosso projeto configurado, não podemos esquecer de colocar as seguintes JARS dentro do diretório ../WebContent/WEB-INF/lib/ :

· Db2jcc.jar

· Db2jcc_license_cu.jar

· Ejb3-persistence.jar

· Mysql-connector-java-5.0.X-bin.jar (Caso use o MySQL)

· Toplink-essentials.jar

· JARS para o JSF

Obs: As JARS do framework JSF geralmente são adicionados automaticamente pela IDE, no caso da IDE Eclipse-Rational Software Architect é adicionado apenas a JAR jsf-ibm.jar .

 

No proximo post iremos finalizar este tutorial com a criação das páginas JSPs(View).

 

Até maissss...............

domingo, 20 de janeiro de 2008

CRUD com JSF e JPA - parte1/3

Neste Tutorial irei mostrar como fazer um CRUD (Create, Read, Update, Delete) utilizando os frameworks JSF(JavaServer Faces) e JPA(Java Persistence API).

Recursos necessários:
IDE de desenvolvimento Java (Netbeans ou Eclipse).
Banco de dados DB2 ou MySQL.
Oracle TopLink Essential (funcionalidades para o JPA), pode ser obtido em : www.oracle.com/technology/jpa

Primeiramente vamos criar o Banco de Dados, abaixo temos uma figura do modelo do banco TUTORIAL e suas SQLs.





Figura 1: TUTORIAL DATABASE






CREATE DATABASE TUTORIAL;
USE TUTORIAL;
CREATE TABLE CITY(
ID INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
CITY VARCHAR(30));



CREATE TABLE CLIENT(
ID INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
NAME VARCHAR(50),
ADDRESS VARCHAR(100),
ID_CITY INT,
CONSTRAINT CLI_CITY_FK FOREIGN KEY(ID_CITY) REFERENCES CITY(ID)
);






Agora Utilizando sua IDE preferida devemos criar um novo projeto Web utilizando o framework JSF.
Com o projeto iniciado devemos criar três pacotes e um diretório como mostra a figura 2:
· Pacote – com.tutorialday.controller
· Pacote – com.tutorialday.dao
· Pacote – com.tutorialday.model
· Diretório – META-INF









Figura 2: Estrutura do Projeto





Criaremos agora as classes Entitys (City, Client) no pacote com.tutorialday.model, abaixo segue o source das mesmas.





CLASSE City


package com.tutorialday.model;

import java.util.Collection;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name="city")
public class City {


@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Column(name="city")
private String city;

@OneToMany(cascade=CascadeType.ALL, mappedBy="city")
private Collection client;

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public Collection getClient() {
return client;
}

public void setClient(Collection client) {
this.client = client;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

}


CLASSE Client



package com.tutorialday.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;



@Entity
@Table(name="client")
public class Client {


@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Column(name="name")
private String name;

@Column(name="address")
private String address;

@ManyToOne
@JoinColumn(name="id_city", nullable = false)
private City city;

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public City getCity() {
return city;
}

public void setCity(City city) {
this.city = city;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}


Com nossas Classes Entitys pronta, vamos criar agora a classe BaseDao no pacote com.tutorialday.dao , a mesma é uma classe genérica que contém métodos genéricos e métodos específicos para persistência e manipulação dos nossos “objetos”.


CLASSE BaseDao


package com.tutorialday.dao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.tutorialday.model.City;

public class BaseDao {
private static EntityManagerFactory emf;

private EntityManager getEntityManager(){
return emf.createEntityManager();
}

public BaseDao(){
emf =
Persistence.createEntityManagerFactory("tutorial");
}


// METODO PARA PERSISTIR
public boolean create(T obj){
EntityManager em = getEntityManager();
try{
em.getTransaction().begin();
em.persist(obj);
em.getTransaction().commit();
return true;
}
catch (Exception ex){
ex.printStackTrace();
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
}


// METODO PARA ATUALIZAR
public boolean update(T obj){
EntityManager em = getEntityManager();
try{
em.getTransaction().begin();
em.merge(obj);
em.getTransaction().commit();
return true;
}
catch (Exception ex){
ex.printStackTrace();
em.getTransaction().rollback();
return false;
}
finally {
em.close();
}
}


// METODO PARA EXCLUIR
public boolean delete(T obj){
EntityManager em = getEntityManager();
try{
em.getTransaction().begin();
obj = em.merge(obj);
em.remove(obj);
em.getTransaction().commit();
return true;
}
catch (Exception ex){
ex.printStackTrace();
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
}


// METODO QUE RETORNA UMA LISTA DE CLIENT
public List allClient(){
EntityManager em = getEntityManager();
try{
Query usu = em.createQuery("select object(c) from Client as c");
return usu.getResultList();
}catch(Exception e){
return null;
}finally {
em.close();
}
}



// METODO QUE RETORNA UMA LISTA DE CITY
public List allCity(){
EntityManager em = getEntityManager();
try{
Query cty = em.createQuery("select object(ct) from City as ct");
return cty.getResultList();
}catch(Exception e){
return null;
}finally {
em.close();
}
}



// METODO QUE RETORNA UMA LISTA DE NOMES DE CIDADES
@SuppressWarnings("unchecked")
public List listCity(){
EntityManager em = getEntityManager();
try{
Query city = em.createQuery("select ct.city from City as ct");
List list0 = city.getResultList();
List list = new ArrayList();
int i;
for (i=0; i <>



// METODO QUE RETORNA UM OBJETO CITY PEGANDO COMO PARAMETO O NOME DA CIDADE
@SuppressWarnings("unchecked")
public T findCityByName(String cty){
EntityManager em = getEntityManager();
try{
Query city = em.createQuery("select object(ct) from City as ct where ct.city

like ?1" ).setParameter(1,cty+"%");
return (T) city.getSingleResult();
}catch(Exception e){
return null;
}finally {
em.close();
}
}
}


Na segunda parte iremos dar continuidade deste tutorial com a criação do FacesBean, mapeamento das classes Entitys e fazer a regra de navegação no arquivo faces-config.xml.


=) ...