The Factory Esclarecendo a arquitetura utilizada no projeto Piloto Autor: Wabber Filho Objetivo Disseminar o conhecimento prático de desenvolvimento na fábrica Resumo Como rodar o sistema ? O que é uma classe básica (Entidade) ? O que é uma classe RepositorioXxxBDR ? PreparedStatament Pra que serve a interface Repositório ? O que é uma classe Cadastro? Resumo Por que usar Fachada? O que é um Servlet ? O que freemarker faz ? Como é o nosso Servlet ? Para que servem os Handlers ? Como são os nossos Handlers ? Como rodar o sistema ? Modificar os parâmetros: arquivo_config e templatePath do arquivo factprocess/piloto/Projeto/piloto/WEB-INF/web.xml Isso pode ser feito em qualquer editor de texto Como rodar o sistema ? Modificar o parâmetro HOME do arquivo factprocess/piloto/Projeto/conf/piloto.properties Clicar no botão Run Project do JBuilder O que é uma classe básica? A classe básica representa as principais entidades de um sistema. package thefactory.piloto.studant; public class Studant { private String name; private String password; public Studant( String name, String password ){ setName( name ); setPassword( password ); } public String getName() { return name; } public void setName( String name ) { this.name = name; } } O que é uma classe RepositorioXxxBDR ? É classe responsável por fazer acesso ao SGBD-Relacional public class RepositoryStudantDB implements RepositoryStudant { private static final String sqlRemove = "delete from fabrica2_studant where cpf = ?"; public void remove( String cpf ) throws RepositoryException { // Envia comando sql de remover estudante do BD substituindo a “?” pelo “cpf” } PreparedStatament Usa-se PreparedStatament para que a aplicação fique “independente” do SGBD utilizado. Connection connection; try {// recupera connection, cria e executa o statement connection = TransactionControl.getConnection(); PreparedStatement preStmt = connection.prepareStatement( this. sqlRemove ); preStmt.setString( 1, cpf ); preStmt.executeUpdate(); } catch ( Exception e ) { throw new RepositoryException( e ); } Pra que serve a interface Repositório ? Uma interface em Java serve para que possa haver vários tipos de implementação diferente para o mesmo serviço. RepositorioXx RepositorioXxBDR RepositorioXxList RepositorioXxFile O que é uma classe Cadastro? É uma classe de negócios que contem um Repositório e pode acrescentar lógica de negócios nos métodos CadastroXx RepositorioXx O que é uma classe Cadastro? public class StudantBusiness { private RepositoryStudant repository; public StudantBusiness( RepositoryStudant rep ) { this.repository = rep; } public void remove( String cpf ) throws RepositoryException { if ( ( cpf != null ) && ( cpf.length() == 11 ) ) { repository.remove( cpf ); } else { throw new IllegalArgumentException( "CPF invalid." ); } } } Por que usar Fachada? O sistema segue o padrão de projeto “Facade” A fachada serve como ponto único de acesso ao sistema. Isso possibilita a construção de n GUI (Graphic User Interface) A Fachada deve implementar o padrão de projeto singleton. Fachada CadastroXx Por que usar Fachada? public class Facade { private static Facade instance; private Facade() { this.studants = new StudantBusiness( new RepositoryStudantDB() ); } public synchronized static Facade getInstance() { if ( instance == null ) { instance = new Facade(); } return instance; } Por que usar Fachada? public void removeStudant( String cpf ) throws RepositoryException, Exception { Transaction transaction = null; boolean ok = false; try { // criar transaction transaction = TransactionControl.beginTransaction(); studants.remove( cpf ); TransactionControl.commitTransaction( transaction ); ok = true; } finally { if ( !ok ) { TransactionControl.rollBackTransaction( transaction ); } TransactionControl.endTransaction( transaction ); } } O que é um Servlet ? Servelt é uma classe Java que serve para atender requisições do usuário através de algum protocolo. No nosso sistema protocolo HTTP O Servlet gera uma Thread para cada requisição Servlet HttpServlet Nosso Servlet O que é um Servlet ? public class ServletBroker extends HttpServlet { public void init( ServletConfig servletConfig ) throws ServletException { super.init( servletConfig ); } public void service( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { // Request é a requisição do usuário // Response é a resposta que o servlet deverá prover } } O que freemarker faz ? O freemarker possibilita isolar código HTML de código Java Para isso o freemarker utiliza Tags e variáveis na página HTML <select name="cpf" onLoad="this.focus()"> <list studants as s> <option value="${s.cpf}">${s.cpf} - ${s.name}</option> </list> </select> O que freemarker faz ? SimpleHash modelRoot = new SimpleHash(); SimpleSequence seq = new SimpleSequence(); Iterator iter = facade.getIteratorStudants(); while ( iter.hasNext() ) { Studant item = ( Studant ) iter.next(); SimpleHash hash = new SimpleHash(); hash.put( "cpf", item.getCpf() ); hash.put( "name", item.getName() ); seq.add( hash ); } modelRoot.put( "studants", seq ); Como é o nosso Servlet ? Vamos abrir o ServletBroker ? Para que servem os Handlers ? Handlers são classes que recebem a requisição do usuário (repassada pelo Servlet) Analisam o request feito Chamam algum método da fachada Preparam a resposta para o usuário Para que servem os Handlers ? Vamos abrir o InsertStudantHandler ? Referências GUIA-DESEN-DefinicaoArquitetura.doc http://cvs.factprocess.codigolivre.org.br/cgibin/cvsweb.cgi/~checkout~/fabrica/Desenvolv imento/Templates/GUIA-DESENDefinicaoArquitetura.doc?contenttype=text/plain&cvsroot=factprocess Freemarker - http://freemarker.sourceforge.net/