crud web jsf

Upload: bruno-chivalski

Post on 18-Jul-2015

514 views

Category:

Documents


4 download

TRANSCRIPT

Desenvolvendo um CRUD para Web com Java, PostgreSQL e NetbeansBom, neste tpico iremos direto ao assunto. Meu objetivo demonstrar a criao de um CRUD em poucos passos, utilizando Java com recursos de JPA, JSF na arquitetura MVC. Por que construir um CRUD? Em termos de desenvolvimento, um CRUD estabelece os procedimentos bsicos operacionais para um componente de um sistema. Por componente, utilizando orientao a objetos, entendemos como um objeto pertencente ao modelo (um Cliente, um Produto, por exemplo). Por procedimentos bsicos, entendemos como as operaes de incluso (create), seleo (read), atualizao (update) e excluso (destroy) associadas a um desses objetos. Todo sistema possui seus CRUDs. Ao mostrar um exemplo de criao de CRUD, temos base para a criao de vrias etapas de um sistema. Mais detalhes podem ser vistos em: http://pt.wikipedia.org/wiki/CRUD Por que utilizar a linguagem Java? Hoje, em grande maioria, quando se fala em sistemas, se fale em desenvolvimento web. Com a Web 2.0 o desenvolvimento de sistemas para Web se intensificou ao ponto de chegarmos a detalhes de produo e qualidade muito prximos aos sistemas cliente-servidor. Dentre as linguagens atuais, o Java se destaca pelo conjunto de Frameworks que oferecem um desenvolvimento sustentvel, com muitas facilidades de manuteno. O .Net (com o C#) tambm excelente para grandes projetos. O PHP tambm no pode ser esquecido, porm sua manuteno no to favorecida. Enfim, Java tambm livre e aberto, dando um ponto forte para minha escolha. Voc poder baixar o Java em: http://www.sun.com/ Por que utilizar JPA? O JPA, na verso 3 do EJB, indiscutivelmente o Framework mais poderoso da atualidade (em minha singela opinio). Atravs das diversas possibilidades oferecidas pelo JPA, utilizaremos um pequeno, mas fantstico escopo de persistncia. Em essncia, trabalha-se com anotaes JPA, integradas aos Beans. Essas caractersticas sero melhores discutidas nos exemplos apresentados. Mais detalhes em: http://java.sun.com/developer/technicalArticles/J2EE/jpa/ Por que trabalhar com JSF? O Java ServerFaces uma das mais atuais alternativas para se construir a camada view da aplicao web. Ela permite ao desenvolvedor utilizar tags especficas, sem nenhuma codificao nativa em Java (scriptles) no arquivo jsp. As pginas dinmicas ficam ligadas diretamente aos Beans. A produtividade favorecida e a manuteno facilitada, como veremos. Veja mais detalhes em: http://java.sun.com/javaee/javaserverfaces/ Por que utilizar a arquitetura MVC? A arquitetura MVC (tambm estendida para MVCP, sendo o P de persistence) amplamente utilizada como padro de desenvolvimento. O model (M) define o comportamento do sistema, implementando os Beans, tambm conhecidos como Pojo (Plain Old Java Object). O view (V) define a camada de visualizao (onde utilizaremos o JSF). O controller (C) define as regras de negcio da aplicao pode-se utilizar os Beans de Sesso fornecidos pelo EjB3. No trabalharemos com esses tpicos neste estudo. Vamos utilizar uma camada isolada do modelo e da apresentao.

Referncia: http://pt.wikipedia.org/wiki/MVC Por que utilizar o Netbeans? Deve-se atentar para a seguinte questo: Netbeans, Eclipse, JBuilder, JCompany, entre outras, so excelentes IDEs de desenvolvimento para aplicaes Java, mas a grande jogada no so as IDEs, e sim o Java. O que quero dizer o seguinte: cada desenvolvedor trabalha com a IDE que mais se adaptar, ou o que for estabelecido em sua empresa. Todos so bons, porm, possvel chegar aos mesmos resultados em todos eles. Uns fornecem algumas facilidades, mas podemos produzir os mesmos resultados com qualquer um deles. Escolhi o Netbeans neste estudo por sua facilidade em relao ao Java. No precisaremos instalar plugins. Alm do fato dele ser livre. Portanto, no tome esse tutorial como um modelo de produo onipresente. Podemos produzir o mesmo resultado na unha configurando os diretrios no container, bibliotecas e arquivos Java nos comandos do prompt, se a necessidade de ficarmos associados a nenhuma IDE. Pode-se baixar o Netbeans em: http://www.netbeans.org/ Por que utilizar o PostgreSQL? Todos os bancos livres so bons. Cada um com suas qualidades prprias. Fique vontade para trabalhar com outros bancos. O fato de se trabalhar com o JPA facilita ainda mais a transio de um banco para o outro. Precisamos apenas alterar a JAR e o arquivo de configurao persistence.xml. O SQL apresentado poder tambm ser facilmente adaptado, pois mantive uma certa flexibilidade no cdigo. Baixe o PostgreSQL em: http://www.postgresql.org/ Modelo a ser exemplificado Abaixo temos o modelo que ser abordado:

Faremos o sistema para Manter Telefones. A nica classe do modelo ser essa. Outras classes sero necessrias para compor a arquitetura. Ao final do desenvolvimento, teremos as classes de modelo (essa), as classes Data Access Object (para persistncia), as classes Business Object (para as regras de negcio) e as classes View (Beans para controle da interface com usurio e sesso). Entre elas, sero necessrias algumas interfaces Java para padres de projeto adequados ao exemplo. Para a criao deste diagrama, utilizei o Jude (http://jude.change-vision.com/judeweb/index.html ), que alm de facilitar a criao grfica do modelo, gera cdigo Java. Obs. Desconsidere a modelagem apresentada, pois o ideal seria termos um objeto Cliente relacionado com Telefone, mas como este um simples exemplo acadmico, temos s Telefone. Criao do banco de dados Os recursos de persistncia implementados pelo Toplink, oferecem um recurso de gerao automtica, porm, prefiro manter a implementao do banco manual. Desta forma, no futuro, quando mudarmos a linguagem, o paradigma, nosso banco estar ntegro. Em alguns casos, o modelo referencial gerado automaticamente no fica, digamos, totalmente relacional.

Abaixo temos o SQL de gerao da tabela. O nome do banco mycrud e a codificao UTF8.create table telefones ( id integer not null, ddd char(2) not null, numero char(8) not null, nome varchar(40) not null, constraint pk_telefones primary key (id) );

Observe que, por opo, no criaremos um auto-incremento no banco. Isto ser gerenciado pelo prprio Toplink. Portanto, ser necessria a criao da tabela e insero abaixo.CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME)); INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 1);

Essa tabela utilizada para controlar o auto-incremento, independente do banco. Criada essas duas tabelas, poderemos partir para o desenvolvimento. Alguns detalhes importantes so: o usurio e senha do meu banco so, respectivamente, pgadmin e pgadmin vamos precisar dessa informao para a criao do arquivo persistence.xml. Utilizei a ferramenta phpPgAdmin para a criao do banco e gerao das tabelas (http://phppgadmin.sourceforge.net/). Criao do Projeto no Netbeans Detalhes: Estamos trabalhando com a verso 6.1 do Netbeans, o container Tomcat 6.0.16 e o JEE 5. Em primeiro lugar, recomendo que todos os outros projetos que estejam abertos no Netbeans sejam fechados s por questo de organizao. Abaixo temos os passos necessrios para a criao do projeto.1. Clique em Arquivo, Novo Projeto... 2. Na janela Novo Projeto, dentro da aba Categorias, selecione a opo Web. Na aba Projetos, 3. 4. 5. 6. 7. 8. 9.

selecione a opo Aplicao Web Clique em Prximo Em Nome do projeto, defina o valor mycrud Clique em Prximo Em Servidor, selecione a opo Apache Tomcat 6.0.16 Clique em Prximo Na aba Frameworks, marque apenas a opo JavaServer Faces Clique em Finalizar

Neste ponto, teremos nosso projeto Web criado. Vamos acrescentar a opo de persistncia de dados JPA com a sequncia abaixo.1. Na aba Projetos ( esquerda da interface do Netbeans), clique com o boto direito no nome 2. 3. 4. 5. 6. 7. 8.

do projeto (mycrud), selecione a opo Novo, e o submenu Outro... Na aba Categorias, selecione Persistence Na aba Tipos de arquivos selecione a opo Unidade de persistncia Clique em Prximo Defina o valor de Nome da unidade de persistncia como default Em Conexo de banco de dados, selecione a opo Nova conexo com banco de dados... Em Nome, selecione a opo PostgreSQL Em URL do banco de dados, defina o valor jdbc:postgresql://localhost:5432/mycrud

9. Em Nome do usurio e Senha, defina respectivamente, pgadmin e pgadmin. Lembre-se que 10. 11. 12. 13. 14. 15.

meu banco est configurado com esse usurio. Faa suas adaptaes, se necessrio. Marque a opo Lembrar senha Clique em OK Em Selecione um esquema, selecione public Clique em OK Em Estratgia de gerao de tabela, marque a opo Nenhum Clique em Finalizar

Neste momento, o arquivo persistence.xml ser criado. Por enquanto, podemos fech-lo. Feche tambm o arquivo welcomeJSF.jsp. Posteriormente vamos exclu-lo. Vamos agora adicionar a biblioteca de conexo com o PostgreSQL.1. 2. 3. 4.

Na aba Projetos, clique com o boto direito em Bibliotecas Selecione a opo Adicionar biblioteca... Selecione a opo PostgreSQL JDBC Driver Clique em Adicionar biblioteca

Vamos agora criar os pacotes Java.1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.

Na aba Projetos, clique com o boto direito em Pacotes de cdigos-fonte Clique na opo Novo, e no submenu Outro... Na aba Categorias, selecione a opo Java Na aba Tipos de arquivos, selecione a opo Pacote Java Clique em Prximo Em Nome do pacote, defina o valor model Clique em Finalizar Repita a sequncia de 1 ao 5 Em Nome do pacote, defina o valor persistence Clique em Finalizar Repita a sequncia de 1 ao 5 Em Nome do pacote, defina o valor controller Clique em Finalizar Repita a sequncia de 1 ao 5 Em Nome do pacote, defina o valor view Clique em Finalizar Repita a sequncia de 1 ao 5 Em Nome do pacote, defina o valor util Clique em Finalizar

Observe que criamos cada uma das camadas do padro MVCP model, view, controller e persistence. Neste ponto, estamos prontos para comear a codificao Java (enfim...). Criao do Modelo camada Model O primeiro passo criar uma Inteface que ser implementada em todos os Pojos. Essa interface, alm de garantir a correta utilizao dos objetos nas prximas camadas, seria usado na gerao de componentes ComboBox. Neste projeto no criaremos nenhum, mas atravs dessa Interface isso seria possvel e facilitado (quem sabe em outros futuros artigos veremos tais detalhes...).1. Na aba Projetos, clique com o boto direito em Pacotes de cdigos-fonte 2. Clique na opo Novo, e no submenu Outro...

3. 4. 5. 6. 7. 8.

Na aba Categorias, selecione a opo Java Na aba Tipos de arquivos, selecione a opo Interface Java Clique em Prximo Em Nome da classe, digite InterfacePojo Em Pacote, selecione a opo model Clique em Finalizar

Substitua todo o contedo do arquivo pelo cdigo abaixo:// InterfacePojo.java

package model;public interface InterfacePojo { public int getCode(); public void setCode(int code); public String getDescribe(); public void setDescribe(String describe); }

Lembre-se sempre de salvar as alteraes (menu Arquivo, opo Salvar todos). Vamos agora criar o Pojo (model) do objeto Telefone.1. 2. 3. 4. 5. 6. 7. 8.

Na aba Projetos, clique com o boto direito em Pacotes de cdigos-fonte Clique na opo Novo, e no submenu Outro... Na aba Categorias, selecione a opo Java Na aba Tipos de arquivos, selecione a opo Classe Java Clique em Prximo Em Nome da classe, digite Telefone Em Pacote, selecione a opo model Clique em Finalizar

Substitua o contedo do arquivo pelo cdigo abaixo:// Telefone.java package model; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity(name = "Telefone") @Table(name = "telefones") @NamedQueries( { @NamedQuery( name="selectTelefone", query = "select obj from Telefone obj" ) } ) public class Telefone implements Serializable, InterfacePojo {

private static final long serialVersionUID = 1L; @Id @GeneratedValue @Column(name = "id") private int id; @Column(name = "ddd", nullable = false, length = 2) private String ddd; @Column(name = "numero", nullable = false, length = 8) private String numero; @Column(name = "nome", nullable = false, length = 40) private String nome; public void setId(int id) { this.id = id; } public int getId() { return id; } public String getDdd() { return ddd; } public String getNome() { return nome; } public String getNumero() { return numero; } public void setDdd(String ddd) { this.ddd = ddd; } public void setNome(String nome) { this.nome = nome; } public void setNumero(String numero) { this.numero = numero; } // Mtodos da InterfacePojo @Override public int getCode() { return this.getId(); } @Override public void setCode(int code) { this.setId( code ); } @Override public String getDescribe() { return this.getNome(); } @Override public void setDescribe(String describe) { this.setNome( describe ); } // Mtodos da InterfacePojo // Mtodos de formatao public String getNumeroFormatado() { return "(" + this.getDdd() + ") " + this.getNumero(); } // Mtodos de formatao }

Neste cdigo, devemos nos atentar nas anotaes EJB 3: @Entity usado para definir a entidade @Table usado para definir o nome da tabela no banco de dados @NamedQueries e @NamedQuery so usadas para definir a linguagem JPQL (Java Persistence Query Language) de acesso aos dados do banco. Observe que muito similar SQL, porm, aqui se trabalha com Orientao a Objetos. @Id Usado para definir que o atributo em questo, ser a chave primria na tabela @GeneratedValue Usado para definir automaticamente o valor do campo em questo @Column Usado para definir o nome do campo da tabela no qual este atributo est relacionado. Observe que existem as diretivas length e nullable que servem, respectivamente, para definir o tamanho mximo do campo e se o mesmo pode ser nulo.

@Override esta anotao usada para mostrar ao compilador que este mtodo dever ser utilizado ao invs do mtodo da Interface. Neste caso, obvio que estes mtodos sero usados (pois somos obrigados a implement-los por conta da InterfacePojo), mas mesmo assim, boa prtica de programao colocar o @Override nos casos em que um mtodo sobrescrito (polimorfismo). Atravs destes cdigos, o Objeto poder ser manipulado no banco pelo Toplink. O caso do @Override indiferente para o servio de persistncia. Observe tambm que, por se tratar de um Pojo, simples getters e setters so suficientes (e por padro, necessrios) para o cdigo. O modelo definido com classes neste design. O fato de o objeto ser Serializable e possuir o atributo serialVersionUID permite sua migrao entre Container's, com a aplicao de JNDI. No trabalharemos com esse recurso neste material. Veja mais em http://www.jspbrasil.com.br/mostrar/27 Salve as alteraes. Vamos agora alterar o arquivo de persistncia para que o objeto Telefone possa ser manipulado.1. Na aba Projetos, no item Arquivos de configurao 2. D um duplo clique em persistence.xml 3. Insira o cdigo read() throws MyCrudException; public List executeQuery(String ejbQL, String parameter[]) throws MyCrudException; public void update(InterfacePojo pojo) throws MyCrudException;

public void destroy(InterfacePojo pojo) throws MyCrudException; public Object searchObjectByCode(Class objectClass, Object id) throws MyCrudException; public void validate(InterfacePojo pojo) throws MyCrudException; }

Agora ser implementada a classe BO geral. Execute o procedimento abaixo:1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito

sobre o pacote controller 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite Bo 4. Clique em Finalizar Substitua o contedo do arquivo Bo pelo cdigo abaixo:// Bo.java package controller; import java.util.List; import javax.persistence.PersistenceException; import model.InterfacePojo; import persistence.Dao; import util.MyCrudException; public class Bo implements InterfaceBo { private String namedQuery; public Bo(String namedQuery) { this.namedQuery = namedQuery; }

@Override public void create(InterfacePojo pojo) throws MyCrudException { try { validate( pojo ); Dao.getDataAccessObject().create( pojo ); } catch (PersistenceException e) { throw new MyCrudException( e.getMessage() ); } } @Override public List read() throws MyCrudException { try { return Dao.getDataAccessObject().read( this.namedQuery ); } catch (PersistenceException e) { throw new MyCrudException( e.getMessage() ); } } @Override public List executeQuery(String ejbQL, String parameter[]) throws MyCrudException { try { return Dao.getDataAccessObject().executeQuery(ejbQL, parameter); } catch (Exception e) { throw new MyCrudException( e.getMessage() ); } }

@Override public void update(InterfacePojo pojo) throws MyCrudException { try { validate( pojo ); Dao.getDataAccessObject().update( pojo ); } catch (PersistenceException e) { throw new MyCrudException( e.getMessage() ); } } @Override public void destroy(InterfacePojo pojo) throws MyCrudException { try { Dao.getDataAccessObject().destroy( pojo ); } catch (PersistenceException e) { throw new MyCrudException( e.getMessage() ); } } @Override public Object searchObjectByCode(Class objectClass, Object id) throws MyCrudException { try { return Dao.getDataAccessObject().searchObjectByCode( objectClass , id ); } catch (PersistenceException e) { throw new MyCrudException( e.getMessage() ); } } @Override public void validate(InterfacePojo pojo) throws MyCrudException {} }

Este cdigo implementa a captura das Exceptions geradas pelo DAO, alm de implementar um mtodo de validao (ainda sem qualquer procedimento). O prximo objeto a ser implementado ser o objeto mais importante do cdigo, pois ser atravs dele que as regras de negcio sero implementadas. Se voc observou o cdigo at o momento, pode reparar que foram utilizadas poucas condies (if). Dentro do possvel controlamos as regras de desenvolvimento com opes de orientao a objetos. A grande massa de condies estruturadas ocorrer no cdigo de regras de negcio. A princpio, vamos implementar apenas os cdigos bsicos de validao campos em branco ou com valor no compatvel com o banco. Vamos colocar outras regras de negcio no final deste estudo, para mostrar simulaes mais prticas.1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito

sobre o pacote controller 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite TelefoneBo 4. Clique em Finalizar

Substitua a implementao default do Netbeans do arquivo criado pelo cdigo abaixo:// TelefoneBo.java package controller; import model.InterfacePojo; import model.Telefone; import util.Number; import util.MyCrudException;

public class TelefoneBo extends Bo { public TelefoneBo() { super( "selectTelefone" ); } @Override public void validate(InterfacePojo pojo) throws MyCrudException { Telefone telefone = (Telefone) pojo; // Validao do DDD Number ddd = new Number( 2 , telefone.getDdd() ); if ( !ddd.validate() ) throw new MyCrudException( "Valor do DDD invlido!" ); // Validao do DDD // Validao do N mero Number numero = new Number( 8 , telefone.getNumero() ); if ( !numero.validate() ) throw new MyCrudException( "Valor do N mero invlido!" ); // Validao do N mero // Validao do Nome if ( telefone.getNome() == null ) throw new MyCrudException( "Valor do Nome invlido!" ); if ( ( telefone.getNome().length() < 1 ) || ( telefone.getNome().length() > 40 ) ) throw new MyCrudException( "Valor do Nome invlido!" ); // Validao do Nome } }

Vamos observar alguns fatores: como voc observou, a maior parte da programao ocorre no objeto Bo. Essas funes sero herdadas pelo TelefoneBo, sendo que, como sobrescrevemos o mtodo validate (e inclumos o @Override), quando um TelefoneBo estiver no Run Time, o mtodo sobrescrito ser utilizado no lugar do escrito no Bo. Isso significa que, quando for utilizada o mtodo create (por exemplo), sua chamada validate far referncia ao mtodo de TelefoneBo. No final deste projeto, mostraremos outras validaes. Agora entraremos na ltima camada. Criao da interface com Usurio camada View A camada View ter alguns detalhes a serem descritos. Durante a apresentao das classes e dos JSP's, falaremos mais sobre o desenvolvimento. O primeiro passo ser implementar o objeto ViewManager, responsvel pelo gerenciamento da tela. Ele simplesmente controlar o desenvolvimento dos processos realizados pelo usurio.1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite ViewManager 4. Clique em Finalizar

sobre o pacote view

Substitua o cdigo pelo fragmento abaixo:

// ViewM anager.java package view; import import import import import javax.faces.application.FacesM essage; javax.faces.application.FacesM essage.Severity; javax.faces.context.FacesContext; javax.faces.event.ActionEvent; model.InterfacePojo;

public abstract class ViewM anager { private boolean formView; private boolean formCreate; private boolean formRead; private boolean formUpdate; private boolean formDestroy; private String titleForm; public ViewM anager(String titleForm) { this.titleForm = ( titleForm == null ) ? "CRUD" : titleForm; this.clearForm(); this.formRead = true; } public String getTitleForm() { if ( this.formView ) return titleForm + " - Visualizar"; if ( this.formCreate ) return titleForm + " - Inserir"; if ( this.formRead ) return titleForm + " - Consultar"; if ( this.formUpdate ) return titleForm + " - Atualizar"; if ( this.formDestroy ) return titleForm + " - Excluir"; return titleForm; } public boolean isFormView() { return this.formView; } public boolean isFormCreate() { return this.formCreate; } public boolean isFormRead() { return this.formRead; } public boolean isFormUpdate() { return this.formUpdate; } public boolean isFormDestroy() { return this.formDestroy; } private void clearForm() { this.formView = false; this.formCreate = false; this.formRead = false; this.formUpdate = false; this.formDestroy = false; } public void setFormView(ActionEvent event) { this.clearForm(); this.formView = true; setPojo( getObjectBySession() ); } public void setFormCreate(ActionEvent event) { this.clearForm(); this.formCreate = true; createNewPojo(); } public void setFormRead(ActionEvent event) { this.clearForm();

this.formRead = true; } public void setFormUpdate(ActionEvent event) { this.clearForm(); this.formUpdate = true; setPojo( getObjectBySession() ); } public void setFormDestroy(ActionEvent event) { this.clearForm(); this.formDestroy = true; setPojo( getObjectBySession() ); } protected void showM essage(Severity severity, String resume, String detail) { FacesContext.getCurrentInstance().addM essage ( null , new FacesM essage( severity , resume , detail ) ); } public void createNewPojo() {} public InterfacePojo getObjectBySession() { return null; } public void setPojo(InterfacePojo pojo) {} }

Este cdigo contm os procedimentos que indicam quais partes da pgina JSP ser exibida para os usurios. Por exemplo, a pgina de leitura dos dados (consulta) mostrar uma tabela (DataTable) contendo os dados e esta s ser exibida quando isFormRead retornar true (o que ocorre, neste caso). Agora vamos construir o objeto de controle do objeto POJO. Ela tambm possui alguns mtodos que precisam ser sobrescritos (createNewPojo(), getObjectBySession() e setPojo()). Vamos observ-los adiante.1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito

sobre o pacote view 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite PojoManager 4. Clique em Finalizar Substitua o cdigo pelo fragmento abaixo:// PojoM anager.java package view; import import import import import import import import controller.Bo; java.util.List; javax.faces.application.FacesM essage; javax.faces.context.FacesContext; javax.faces.event.ActionEvent; javax.servlet.ServletRequest; model.InterfacePojo; util.M yCrudException;

public abstract class PojoM anager extends ViewM anager { private Bo bo; private InterfacePojo pojo;

public PojoM anager(String titleForm, Bo bo, InterfacePojo pojo) { super(titleForm); this.bo = bo; this.pojo = pojo; } @Override public void setPojo(InterfacePojo pojo) { this.pojo = pojo; } public InterfacePojo getPojo() { return this.pojo; } public void setBo(Bo bo) { this.bo = bo; } public Bo getBo() { return this.bo; } public void create(ActionEvent event) { try { this.bo.create(this.pojo); super.setFormCreate(event); super.showM essage(FacesM essage.SEVERITY_INFO, null, "Objeto inserido com sucesso!"); } catch (M yCrudException e) { super.showM essage(FacesM essage.SEVERITY_WARN, null, e.getM essage()); } } public void destroy(ActionEvent event) { try { this.bo.destroy(this.pojo); super.setFormRead(event); super.showM essage(FacesM essage.SEVERITY_INFO, null, "Objeto excludo com sucesso!"); } catch (M yCrudException e) { super.showM essage(FacesM essage.SEVERITY_WARN, null, e.getM essage()); } } public void update(ActionEvent event) { try { this.bo.update(this.pojo); super.setFormRead(event); super.showM essage(FacesM essage.SEVERITY_INFO, null, "Objeto alterado com sucesso!"); } catch (M yCrudException e) { super.showM essage(FacesM essage.SEVERITY_WARN, null, e.getM essage()); } } public List getList() { List list = null;

try { list = this.bo.read(); } catch (M yCrudException e) { super.showM essage(FacesM essage.SEVERITY_WARN, null, e.getM essage()); } finally { return list; } } @Override public InterfacePojo getObjectBySession() { InterfacePojo value = null; try { value = FacesContext.getCurrentInstance().getExternalContext().getRequest()).getAttribute("pojo"); } catch (IllegalStateException e) { this.showM essage(FacesM essage.SEVERITY_WARN, null, "No foi possvel obter o objeto!" ); } finally { return value; } } public Object searchObjectByCode() { Object value = null; try { value = this.bo.searchObjectByCode( this.pojo.getClass(), new Integer(this.pojo.getCode())); if (value == null) { super.showM essage(FacesM essage.SEVERITY_WARN, null, "Objeto no encontrado!"); } } catch (M yCrudException e) { super.showM essage(FacesM essage.SEVERITY_WARN, null, e.getM essage()); } finally { return value; } } } (InterfacePojo) ((ServletRequest)

Esta , provavelmente, a classe mais complexa do projeto. Porm, depois de implementada, o ganho de produo para outros CRUDs fantstico. Antes de tudo, vamos observar os principais comportamentos: atravs dos getters e setters de Pojo e Bo, poderemos gerenciar as respectivas classes. Outro comportamento importante realizado pelos mtodos comuns do CRUD (create, destroy, update e read), pois eles realizam o procedimento (atravs do Bo) e, caso ocorra, capturam as excees geradas nas camadas inferiores. Atravs do showMessage (implementado no ViewManager.java) as mensagens sero enviadas para a tela (navegador). Outro mtodo importante definido em getObjectBySession(), que retorna o objeto selecionado na JSP. Quando isso ocorre? Na listagem de telefones, havero campos de opes (links para visualizar, alterar e excluir) no qual o usurio poder clicar. Neste momento, o objeto da linha selecionada (onde o link foi clicado), ser enviado para o servidor. O cdigo de getObjectBySession() obtm esse objeto (que, inclusive, possui o nome de pojo). Por padro, no vamos implementar em PojoManager uma chamada ao mtodo executeQuery() de Bo, pois caso haja necessidade de executar uma Query que no esteja especificada no Model, somente o Bo teria essa permisso (ou melhor, a princpio, somente ele deveria ter essa necessidade). Como voc pode observar, as duas ltimas classes so

abstratas (no podem ser instanciadas). Isso deve ser assim pelo fato delas serem genricas. Vamos implementar agora, uma classe especfica para Telefone que herdar todo o comportamento de PojoManager (e por consequncia, ViewManager).1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite TelefoneManager 4. Clique em Finalizar

sobre o pacote view

Substitua o contexto abaixo pelo cdigo da classe criada:// TelefoneManager.java package view; import controller.TelefoneBo; import model.Telefone; public class TelefoneManager extends PojoManager { public TelefoneManager() { super( "Telefone" , new TelefoneBo() , new Telefone() ); } @Override public void createNewPojo() { Telefone telefone = new Telefone(); super.setPojo( telefone ); } }

Como voc pode observar, esta uma simples classe que apenas sobrescreve o constructor para definir as variveis de instncia para o ViewManager e o createNewPojo() - utilizado para criar um novo pojo Telefone. Esta classe ser nosso Bean de Sesso, porm, no ser acessada diretamente. Criaremos uma classe chamada SessionBean que controlar todos os Beans da aplicao. Neste caso, como s temos um Bean, o TelefoneManager, que por sua vez, possui acesso direto ao Telefone, este ser gerenciado pela SessionBean.1. Aps expandir o item Pacotes de cdigos-fonte da aba Projetos, clique com o boto direito

sobre o pacote view 2. Selecione a opo Novo e o submenu Classe java... 3. Em Nome da classe digite SessionBean 4. Clique em Finalizar O cdigo da classe mostrado abaixo:// SessionBean.java package view; public class SessionBean { private TelefoneManager telefoneBean; public SessionBean() { this.telefoneBean = new TelefoneManager();

} public TelefoneManager getTelefoneBean() { return this.telefoneBean; } }

Para torn-la acessvel pelos JSP's, precisamos adicion-la ao faces-config.xml. Para trabalhar com esse arquivo, execute:1. Aps expandir o item Arquivos de configurao da aba Projetos, d dois cliques sobre o

arquivo faces-config.xml

No incio, ser mostrada a IDE de organizao dos JSP e navegao, porm, vamos trabalhar diretamente com o cdigo. Clique (na parte superior do editor) na aba XML. O contedo do arquivo dever ficar igual ao cdigo mostrado abaixo: SessionBean view.SessionBean session

Observe que foi acrescentado uma diretiva