Você está na página 1de 71

Open-source Education

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Concluses

Palestrante
Vinicius M. Senger
Trabalha com desenvolvimento de softwares a mais de 12 anos; Foi instrutor e consultor Java da: Sun do Brasil e Oracle; Palestrante em diversos eventos Java: Fenasoft, Objetos Distribudos, JustJava, JavaOne EUA, ; Certificaes: Sun Enterprise Architect (2 fase), Java Programmer 1.4, Sun Official Instructor, Oracle Instructor, Microsoft Certified Professional, Microsoft Certified Trainner; Programador, diretor tcnico e instrutor Globalcode;

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Concluses

Introduo bsica
Um design-pattern ... Uma forma padro de organizar classes e objetos; Nomes para solues que voc j modelou; Uma forma de compartilhar conhecimentos sobre POO; Solues POO para problemas que incidem em diversos cenrios de desenvolvimento; Uma definio de conjunto finito de responsabilidades para uma classe;

Introduo bsica
Ao adotar design-patterns... Seu cdigo fica mais organizado; Aumento de qualidade; Menor complexidade; Aumenta comunicao dentro da equipe de desenvolvimento;

Introduo bsica
Diagrama de seqncia UML, cdigo sem pattern

Cdigo extenso Muitas responsabilidades por classe

Introduo bsica
Com patterns...

Cdigo melhor distribudo entre classes Poucas responsabilidades por classe

Introduo bsica
A definio de um pattern pode conter... Um nome: Transfer Object Um outro nome (also know as): Value Object Um problema: algumas entidades contm dados que so sempre lidos em grupo... Uma soluo: serializar todos os dados da entidade em um objeto que...

Introduo bsica
Famlias de patterns GoF: 23 patterns Criao: Abstract Factory, Builder, Factory Method, Prototype, Singleton Estrutura: Adapter, Bridge, Composite, Decorator, Faade, Flyweight, Proxy Comportamento: Chain of Resp., Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor

Introduo bsica
Famlias de patterns J2EE: Business Delegate, Composite Entity, Composite View, Data Access Object, Fast Lane Reader, Front Controller, Intercepting Filter, Modelview-controller, Service Locator, Session Faade, Transfer Object, Value List Handler, View Helper Outros: theserverside.com, securitypatterns.org, Microsoft .NET patterns

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Concluses parciais sobre patterns

Patterns e Certificao
As seguintes certificaes Sun exigem conhecimentos de patterns: Sun Certified Web Components Developer; Sun Certified Business Component Developer; Sun Certified Enterprise Architect; O que e quanto estudar? Todos patterns J2EE; Aplicar na prtica os principais GoF e os mais obscuros conhecer a teoria bsica;

Patterns e Certificao
Qual das opes no um benefcio da utilizao dos design-patterns: a) Eles fornecem uma linguagem comum para discusses sobre o design. b) Eles fornecem solues para os problemas do mundo real. c) Ele comunicam a experincia obtida previamente. d) Eles fornecem solues aos problemas totalmente inusitados.

Patterns e Certificao
Qual das opes no um benefcio da utilizao dos design-patterns: a) Eles fornecem uma linguagem comum para discusses sobre o design. b) Eles fornecem solues para os problemas do mundo real. c) Ele comunicam a experincia obtida previamente. d) Eles fornecem solues aos problemas totalmente inusitados.

Patterns e Certificao
O design pattern Decorator aparece frequentemente em qual pacote Java: a) java.io b) java.awt c) java.lang d) java.util

Patterns e Certificao
O design pattern Decorator aparece frequentemente em qual pacote Java: a) java.io b) java.awt c) java.lang d) java.util

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Concluses parciais sobre patterns

Singleton
Definio: garantir que uma classe tenha somente uma instance. Warning: Devemos tomar cuidado com NullPointerException em servidores em cluster com Singleton implementados com static
public class FormatHelper { private static FormatHelper instance = new FormatHelper(); ... public static FormatHelper getInstance() { return instance; } protected FormatHelper() { } public String fullDateFormat(java.util.Date data) { if(data==null || data.equals("")) return ""; else return dataCompleta.format(data); } }

Command / Action
Definio: encapsula uma requisio ao software em um objeto. Action do Struts o principal exemplo de implementao deste pattern. Transformao do mtodo / cdigo em objeto Anti-pattern:

Command / Action
Aps pattern

Factory
Definio: as responsabilidades de criar objetos a partir de um tipo (interface) atribuda uma classe que contempla tal lgica. Exemplo do anti-pattern:
16 17 18 19 20 21 22 23 24 25 26 27 28 ... CalculadoraDeImpostos calculadora = null; if(p.fornecedor.getUF().equals("SP")) { calculadora = new CalculadoraSaoPaulo(); } else if(p.fornecedor.getUF().equals("RJ")) { calculadora = new CalculadoraRio(); } else if(p.fornecedor.getUF().equals("SC")) { calculadora = new CalculadoraSC(); } double impostos = calculadora.processar(p); ...

Factory
Ao aplicarmos o pattern factory a responsabilidade sob o operador new da factory...
16 17 18 19 20 ... CalculadoraDeImpostos calculadora = null; calculadora = FabricaDeCalculadoras.criar(p); double impostos = calculadora.processar(p); ...

Toda a responsabilidade de criar objetos foi transferida. A factory tem a oportunidade de criar cache / pool de objetos, transparecer qual a classe que implementa tal interface (jdbc), alm de transparncia de localidade.

Factory
Podemos programar fbricas que criam objeto baseados em uma interface; Podemos criar fbricas dinmicas utilizando a API java.reflection: A classe DriverManager uma factory de Connections JDBC que cria dinamicamente um conexo com RDBMS, baseando-se em um URL;

Composite
Definio: define um estrutura de objetos em formato de rvore de dados
public class Produto { private Componente componente; public void setComponente(Componente componente) { this.componente = componente; } public Componente getComponente() { return componente; } } class Componente { private Componente componente; public void setComponente(Componente componente) { this.componente = componente; } public Componente getComponente() { return componente; } } class Motor extends Componente {} class Cilindro extends Componente {}

Composite
class Usa { public void test() { Produto p = new Produto(); Componente motor = new Motor(); motor.setComponente(new Cilindro()); p.setComponente(motor); } }

Proxy
Definio: prover um objeto intermedirio para acessar outro objeto. O maior exemplo de Proxy em Java so Stubs e Skeletons RMI.

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Concluses parciais sobre patterns

Service Locator
Definio: simplifica o acesso a recursos J2EE em um aplicativo centralizando lookups JNDI em classes especficas de localizao de servios. Evita que sua soluo tenha alto acoplamento com JNDI Naming Service; Tomar cuidado com Service Locator e cluster; Utilize sempre que possvel ENC; Exemplo no JAREF

Data Access Object


Definio: centraliza o servio de persistncia de objetos em um pequeno conjunto de classes, evitando por exemplo que cdigo SQL se espalhe pelo cdigo da soluo. Anti-pattern:

Data Access Object


Aplicando o pattern:

Model-view-controller
Definio: divide o aplicativo em dados, comportamento e apresentao. Aplicando MVC podemos reaproveitar o mesmo dado para mltiplas visualizaes; Podemos reaproveitar o comportamento (eventos) da soluo; um pattern de arquitetura, criado h muito tempo. Pode ser aplicado em qualquer linguagem, mais facilmente com OOP.

Model-view-controller
115.000 resultados na busca sobre framework MVC no google Struts, WebWorks, Spring, PicoContainer so exemplos de frameworks J2EE

Model-view-controller

Front-controller
Problema: em aplicativos com mltiplos pontos de entrada (em Web, mltiplas URLs de acesso; em GUI, mtodos espalhados para tratamento de eventos)

Front-controller
Definio: criar um ponto nico de entrada no aplicativo. Para o caso de aplicativos Web, uma nica URL permite o acesso aos recursos do servidor.

Front-controller
Um controlador central pode oferecer servios para o aplicativo: Logging Segurana Undo / Redo Internacionalizao Leitura de formulrios Validao de dados Filtro de contedo

Intercepting Filter
Definio: forma para executar pr e ps processamento em requests da soluo Um Servlet Filter um exemplo de implementao de Intercepting Filter para interceptar requests no Web Container; Ainda no temos na espec J2EE intercepting filter para EJBs

Intercepting Filter

View Helper
Definio: simplifica a renderizao de objetos em views com formatao. Uma Custom Tag pode representar um View Helper; Uma simples classe convencional com mtodos estticos tambm; Exemplo no JAREF

Composite View
Definio: em views complexas, dividimos a tela em diversos pedaos. Depois criamos uma view que rene determinados componentes / pedaos de tela para compor um front-end. Em Web / JSPs utilizamos diversas tcnicas de include; Com aplicativos Swing, uma view composta pode ter diversos panels: panel para botes, panel do menu de opes, panel para apresentar o dado etc.;

Arquitetura sem patterns


#1Model One
User 1. get() JSPForm JSPSave JDBC JSPResults

2. doPost() 2.1. action()

2.2. action()

Arquitetura com patterns


Arquitetura MVC
User JSPForm 1. get() 2. doPost() 2.1. create() FrontController Command Factory Command

2.2. execute()

Arquitetura com patterns


Arquitetura MVC
Command DAO JDBC 2.2.1.1. action() JSPResults

2.2.1. action()

2.2.2 sendRedirect()

Agenda
Introduo bsica Patterns e certificaes Sun Exemplos GoF patterns J2EE patterns Introduo ao Jakarta Struts

Jakarta Struts
Utilizando patterns voc cria solues com cdigo-fonte mais claro e organizado, porm esta prtica requer planejamento e modelagem; Planejamento e modelagem de cdigo representa menor produtividade no curto prazo; Frameworks unem qualidade de cdigo, com patterns prmoldados, sem queda de produtividade no curto prazo;

Jakarta Struts
Um framework cuida da infra-estrutura tcnica comum para diversos tipos de aplicativos Um framework disponibiliza um software pr-moldado, basta rechear com as funcionalidades do seu domnio de negcio; O Struts framework de desenvolvimento de aplicativos Web J2EE MVC; O Struts trabalha de acordo com diversos patterns, oferecendo alta qualidade de cdigo aliada alta produtividade no curto prazo;

Download e instalao
Download: http://jakarta.apache.org; Instalao: um zip/jar, basta descompactar...

Primeiro aplicativo
Vamos imaginar um simples exemplo de um aplicativo Web J2EE para verificar se um ano bissexto ou no; Conforme discutimos sobre patterns, temos trs abordagens para desenvolver uma soluo J2EE Web: 1. Sem patterns (somente JSPs); 2. Com patterns (aplicamos patterns com classes de infra-estrutura proprietrias); 3. Com patterns e framework (utilizando Struts);

Arquitetura bsica
Com a primeira alternativa, teramos a seguinte soluo:

Arquitetura bsica
Para esta arquitetura nosso trabalho seria o de desenvolver: 1. Um HTML com formulrio de entrada do ano; 2. VerificarAno.jsp;

MVC proprietrio
A segunda opo, aplicarmos os patterns na raa:

MVC proprietrio
Esta abordagem mais elaborada que a anterior, porm teramos que desenvolver: 1. Um HTML com formulrio de entrada do ano; 2. Um Java Servlet Front Controller; 3. Uma classe ActionFactory; 4. Uma interface para definir o padro de Action; 5. Uma classe com a implementao VerificaAnoAction; 6. A pgina Resultado.jsp;

MVC com Struts


A terceira opo desenvolver o aplicativo com Struts:

MVC com Struts


Abordagem ideal, precisamos desenvolver apenas: 1. Formulrio HTML ou link em uma pgina; 2. Classe para responder pelo evento submit do formulrio ou clique no link (Action); 3. Pgina de reposta;

Vantagens do Struts
Struts cuida do controle (de eventos) do aplicativo; Struts oferece servios para facilitar a construo da actions para formulrios de dados e validao; Struts facilita (muito) a criao de views / pgina de apresentao atravs de diversas tag libraries; Struts facilita internacionalizao do aplicativo; Struts modular e extensvel;

Exemplo com Struts


Resumo de tarefas 3. Instalamos a biblioteca struts.jar no Application Server; 4. Configuramos o Servlet Front-controller do Struts no web.xml; 5. Criamos uma sub-classe de Action para responder ao evento; 6. Configuramos a Action no struts-config.xml

Exemplo com Struts


Instalao do struts.jar: Cada servidor pode oferecer uma forma diferente; Muitos trabalham com o lib/ext; No Jboss podemos simplesmente copiar para o diretrio deploy; Podemos empacotar o jar no WEB-INF/lib (+ / -);

Exemplo com Struts


web.xml com Struts
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <display-name>Acme Struts</display-name> <!-- Declarao Padro do Front-Controller ActionServlet (com debugging) --> <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>2</load-on-startup> </servlet> <!-- Padro para mapeamento para Struts Action --> <servlet-mapping> Poderia ser .exe, .asp, .php... <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>

Exemplo com Struts


Formulrio HTML
Qualquer coisa .do vai chegar no <html> controlador central do Struts <head> <title></title> </head> <body> <FORM name="ExemploStruts" action="VerificarAno.do" method="get"> <p>Exemplo de Struts - Curso Globalcode</p> <p>Entre com o ano: <input maxlength="4" size="4" value="2000" </p> <p><input type="submit"></p> </FORM> </body> </html> name="textAno">

Exemplo com Struts


Criao da classe Action
package br.com.globalcode.struts.action; import javax.servlet.http.*; import org.apache.struts.action.*; public class VerificarAno extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { /* Podemos ler os dados de entrada e processa-los aqui mesmo, ou apenas recepcionar e ler os dados e em seguida delegar o processamento para outra classe (business delegate)*/ boolean resposta = false; int ano = Integer.parseInt(request.getParameter("textAno")); resposta = ((ano%4==0 && ano%100!=0) || ano%400==0); request.setAttribute("resposta", new Boolean(resposta)); // Em seguida, chamamos uma pgina atravs de um nome // "mapping" / "alias" definido no struts-config.xml return (mapping.findForward("resposta")); } }

Exemplo com Struts


struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/strutsconfig_1_1.dtd"> <struts-config> <action-mappings> <action path="/VerificarAno" type="br.com.globalcode.struts.action.VerificarAno" > <forward name="resposta" path="/resultado-ano.jsp" /> </action> </action-mappings> </struts-config>

Exemplo com Struts


Pgina de resultados
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% Boolean resposta = (Boolean) request.getAttribute("resposta"); %> <html> <head> <title>Resultado verificao AnoBissexto</title> </head> <body> O ano <%= (resposta.booleanValue() ? "" : " no ") + " bissexto" %><br> </body> </html>

Exemplo com Struts


Resumo da arquitetura com Struts

Exemplo com Struts


Empacotamento do aplicativo em .war

Demo
Ano bissexto com Struts

Mais sobre Struts


Oferece tambm recurso de leitura de formulrios, ou seja, ele pode fazer automaticamente o cdigo abaixo: String nome = request.getParameter(textNome); If(nome.equals()) ...

Mais sobre Struts


Oferece um recurso chamado de synchronized tokens, que ajuda a resolver problema de submits repetidos dejavu; Oferece Tag Libs para simplificar a criao de views: HTML Tag Lib: criao de formulrios com dados de JavaBeans, validao e JavaScript; Logic Tag Lib: laos, percorrer colees, condies entre outros; Bean Tag Lib: includes, variveis entre outros utilitrios;

Mais sobre Struts


Exemplo de JSP com Tag lib do Struts para formulrio:
1 <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> 2 <html:html> 3 <html:form action="RegistrarPesquisa.do"> 4 <p>Qual seu time de futebol?</p> 5 <p><html:text property="resposta"/></p> 6 <p>Qual seu nome?</p> 7 <html:submit/> 8 </html:form> 9 <html:errors /> 10 </html:html> 11

Demo
Ferramentas e / ou outros exemplos

Você também pode gostar