• Like
Conhecendo o Spring
Upcoming SlideShare
Loading in...5
×

Conhecendo o Spring

  • 647 views
Uploaded on

Apresentação desenvolvida originalmente para trabalho de disciplina na graduação de Tecnologia em Desenvolvimento para a Internet em 2006.

Apresentação desenvolvida originalmente para trabalho de disciplina na graduação de Tecnologia em Desenvolvimento para a Internet em 2006.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
647
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
15
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Simplificando o desenvolvimentoJava/Java EE - 2006Maurício Linhares http://techbot.me/
  • 2. No início era apenas o profeta... Eu trago a linguagem que vai funcionar em todas as plataformas! Liberdade!
  • 3. Mas a liberdade virou Libertinagem Só quem tá certo Eu faço aqui sou eu! melhor!Não! Eu façomelhor!
  • 4. Acabou a farra! Agora quem não seguir as especificações vai para os campos de concentração!JCP Hitler
  • 5. EJB, BMP, JMS, CMP, JAAS, JSP, JSTL, JCA,JTA, JDBC, AWT, JNDI!Aprendam ou morram!
  • 6. Porque é tão complicado desenvolveraplicações Java EE?
  • 7. Já tá na hora desimplificar isso.
  • 8. Vamos criar umFramework para resolver esse problema!
  • 9. Vamos criar um framework!Mas o que é um framework?
  • 10. O que é?¡  Umesqueleto semi-pronto para ser estendido;¡  Contém implementações genéricas;¡  Deve tornar o difícil fácil e o impossível possível;
  • 11. E então surge o grandeSalvador! framework
  • 12. E qual é a missão dele?¡  Desenvolver aplicações Java EE tem que ser mais fácil;¡  Programar para interfaces é melhor do que programar para classes concretas;¡  Desenvolvimento orientado a objetos é mais importante do que a tecnologia utilizada;
  • 13. O que ele oferece pra isso?¡  Um container de Inversão de Controle;¡  Abstração para o controle de transações;¡  Abstração para bancos de dados;¡  Programação Orientada a Aspectos;¡  Integração com vários outros projetos;
  • 14. E quemdisse que eu sei o que é essa tal deInversão de Controle?
  • 15. A Inversão de Controleredefine......dois princípios daOrientação a Objetos
  • 16. Objetos não devem mostrarsuas intimidades...
  • 17. Objetos devem ser auto contidos...
  • 18. E o que é que aInversão de controle diz?
  • 19. Objetos devem informar oscontratos que eles precisamimplementarTrabalhando com contratos (ouinterfaces) as intimidades deles nãovão interessar a ninguém
  • 20. Os objetos devem dizer dequais objetos eles dependemPra que alguém possa fornecer essasdependências
  • 21. Inversão de Controle tambémé...... uma inversão deresponsabilidades
  • 22. Inversão de qualresponsabilidade?
  • 23. Os dois princípios foramrealmente redefinidos?O que?Quando?Porque?Onde está Wally?
  • 24. Existem dois tipos de inversão¡  Injeção de dependências;¡  Busca por dependências;
  • 25. Busca por dependências¡  Quem precisa, tem que correr atrás;¡  As dependências ficam em um contexto geral do sistema, ou não;¡  Costumam ser disponibilizadas em eventos específicos;
  • 26. Injeção de dependências¡  Quem precisa, diz que precisa e recebe na mão;¡  As dependências ficam onde elas quiserem ficar;¡  Podem ser disponibilizadas a qualquer momento, depende de quem precisa;
  • 27. Voltando ao nosso assunto...... Vejamos como épossível acessar o Spring
  • 28. Acessando o Spring¡  Configurado com (mais um) arquivo XML;¡  Os objetos ficam no ApplicationContext;¡  Os objetos não podem depender de objetos que não estejam no ApplicationContext;
  • 29. Um ApplicationContext pode ser criadopelas seguintes classes:¡  FileSystemXmlApplicationContext¡  ClassPathXmlApplicationContext¡  Emuma aplicação web o contexto normalmente é carregado por um ServletContextListener específico do Spring
  • 30. Meu primeiro SpringBean<bean id="autenticador" class="org.maujr.newsletter.Autenti cador"> <property name="usuario"> <value>mauricio.linhares</value> </property></bean>
  • 31. Como ficam os objetos¡  Todos são singletons por default;¡  Cada um deve ter o seu próprio id ;¡  Podem ser referenciados em um arquivo e utilizados em outro;¡  As dependências só são inseridas uma única vez;¡  Não é possível acessar objetos que não tem um contrutor público;
  • 32. Mas eunão quero umSingleton!
  • 33. Calma, calma!<bean id="autenticador" class="org.maujr.newsletter.Autenti cador singleton= false > <property name="usuario"> <value>mauricio.linhares</value> </property></bean>
  • 34. O ApplicationContext transformaautomaticamente de String para:¡  Tipos numéricos;¡  Class;¡  URL;¡  File;¡  Array de Strings (separando por vírgulas);
  • 35. E os outros tipos?
  • 36. São transformados de Stringpara os seus objetosusando PropertyEditorscustomizados
  • 37. Como eu crio um PropertyEditor?¡  Extendendo a classe PropertyEditorSupport;¡  Implementando os métodos setAsText() e getAsText();¡  E basta registrar ele no ApplicationContext;¡  99% das vezes isso não é necessário;
  • 38. <property/>Define uma propriedade do bean quevai ser inserida pelo Spring, podeconter diversas outras tags dentrodela
  • 39. <constructor-arg/>Funciona da mesma maneira que atag <property/>, mas passa asdependências como parâmetros doconstrutor
  • 40. <ref/>Referencia um outro bean que estejaconfigurado. Pode ser um bean nomesmo arquivo ou em arquivosdiferentes
  • 41. Outras tags¡  <props/>¡  <list/>¡  <map/>¡  <set/>¡  <value/>
  • 42. E se eu não tiver como chamar umconstrutor ?
  • 43. FactoryBeans estão na mão!
  • 44. Implementando a interfaceFactoryBean¡  O método getObject() retorna o objeto que essa fábrica deve produzir;¡  O método isSingleton() avisa se o objeto produzido é um singleton ou não;¡  O método getObjectType() deve retonar o tipo (Class) do objeto que esta fábrica produz;
  • 45. Como implementar o acesso aobanco de dados no nossosistema?Por que não deixar as classesacessarem a classe utilitáriadiretamente?
  • 46. Nosso primeiro FactoryBeanO gerenciador das conexões com obanco de dados
  • 47. Qual a responsabilidade dele?Abrir conexões com o banco de dadospara que os repositórios possamtrabalhar livremente
  • 48. Como funciona o nosso banco?ConexõesObjectContainers Banco de dados ObjectServer
  • 49. Em código...ObjectServer bancoDeDados = Db4o.openServer(nomeDoArquivo, porta);
  • 50. O que é um Repositório?
  • 51. Um adaptador entre mecanismosdistintos
  • 52. Como é o nosso repositório?public interface Repositorio { public void adicionar(Persistivel objeto); public void atualizar(Persistivel objeto); public void remover (Persistivel objeto); public Persistivel pegarPeloId(Long id); public List pegarTodos(Class clazz);}
  • 53. A nossa implementação dele......é a classe RepositorioDoDb4o
  • 54. Ei!Essa classeé abstrata!
  • 55. O método getContainer() éabstratoEntão nós temos queencontrar uma maneira deoferecer os ObjectContanersda nossa fábrica
  • 56. Mas ainda existe outroproblemaO Repositório é um singleton, mastem que receber novosObjectContainers a cada chamada dométodo getContainer()
  • 57. Como resolver isso?¡  Criar uma classe que estenda a RepositorioDoDb4o;¡  Implementar a interface ApplicationContextAware;¡  Pegar o ApplicationContext e pegar os ObjectContainers diretamente;
  • 58. Em código....public class RepositorioSpring extends RepositorioDoDb4o implements ApplicationContextAware { private ApplicationContext context; public ObjectContainer getContainer() { return context.getBean( objectContainerFactory ); } public void setApplicationContext(ApplicationContext context) { this.context = context; }}
  • 59. Isso tá muitocomplicado!
  • 60. Injeção de métodosUm objeto Singleton pode dependerde objetos não-Singleton semproblemas
  • 61. Como isso é feito?O Spring responde pela dependênciaem vez do objeto dependente
  • 62. Em código<bean id="repositorio" class="org.maujr.persistencia.db4o. RepositorioDoDb4o"> <lookup-method bean="objectContainerFactory" name="getContainer"/></bean><beanid="objectContainerFactory"class="org.maujr.persistencia.db4o.Ob jectContainerFactory"/>
  • 63. O que vai acontecer?Sempre que o método getContainer()for chamado no Repositório, oFactoryBean que cria osObjectContainers vai ser chamado
  • 64. Complicando um pouco mais...Ninguém está fechando as transaçõesnem as conexões com o banco.Onde isto está acontecendo?
  • 65. No FiltroDoDb4oEle faz o commit ou rollback dastransações e no fim fecha a conexãocom o banco de dados;
  • 66. Em código...try { chain.doFilter(request, response); ServerUtil.commitTransaction();} catch (Exception e) { e.printStackTrace(); ServerUtil.rollbackTransaction();} finally { ServerUtil.closeContainer();}
  • 67. E qual é avantagem disso?
  • 68. Todo o código está livre dainteração com o bancoO Spring provê mecanismos maissimples de se utilizar para osframeworks mais conhecidos, como oHibernate
  • 69. Spring MVCSimplificando o Desenvolvimento webcom o Spring
  • 70. Peraí!É necessário adicionar o Servlet quevai responder as requisições doSpring no web.xml com ummapeamentoSem o Servlet do Spring ele não poderesponder a requisições feitas aoservidor
  • 71. Características¡  Várias classes de suporte para formulários e requisições normais;¡  Transformação automática de valores do request para objetos;¡  Suporte transparente a vários mecanismos de visualização;¡  Totalmente configurado dentro do próprio Spring¡  Os controladores não são thread-safe;
  • 72. Mapeadores de URLExistem várias estratégiasdisponíveis, mas os mais utilizadossão BeanNameUrlHandlerMapping e oSimpleUrlHandlerMapping
  • 73. BeanNameUrlHandlerMappingDireciona as requisições para asclasses através dos seusidentificadores.Uma requisição para /contados.html seria enviada para obean com o ID /contados.html
  • 74. SimpleUrlHandlerMappingMais complexo, direciona asrequisições através de um mapa dechaves e valores. É possível usar curingas como * nas URLs.
  • 75. Em código...<bean id="urlMapper" class="org.springframework.web.servlet.handler .SimpleUrlHandlerMapping"><property name="mappings"> <props> <prop key="/noticia.html"> inserirNoticiaAction </prop> <prop key="/noticias.html"> listarNoticiasAction </prop> <prop key="/principal.html"> principalAction </prop> </props></property></bean>
  • 76. ViewResolvers¡  São as classes responsáveis pela descoberta das views;¡  Transformam nomes lógicos em uma requisição para a view apropriada;
  • 77. Em código....<bean id="viewResolver" class="org.springframework.web.serv let.view.ResourceBundleViewResolver "> <property name="basenames"> <value>views</value> </property> <property name="defaultParentView"> <value>mostrar-principal</value> </property></bean>
  • 78. Configurando...mostrar-principal.class= org.springframework.web.servlet.view.velocity .VelocityViewmostrar-principal.url= org/maujr/velocity/ principal.htmlmostrar-principal.exposeSpringMacroHelpers= truenoticia.url=org/maujr/velocity/noticia.htmlnoticia.exposeSpringMacroHelpers=truenoticias.url=org/maujr/velocity/noticias.htm
  • 79. A interface Controller¡  É a interface base para a parte web do Spring;¡  Define um único método, handleRequest() que deve retornar um objeto ModelAndView;¡  Esse é o método chamado quando uma dessas classes recebe uma requisição HTTP;
  • 80. Os objetos ModelAndView¡  Servem como abstração para colocação de objetos que devem aparecer na visualização;¡  Também recebe o nome lógico pelo qual a view responsável vai ser encontrada;¡  Não é necessário indicar qual o tipo da view que vai gerar a resposta;
  • 81. Controlador AbstractController¡  Classe simples para a resposta a requisições diretas;¡  Não é indicada para o uso de formulários;¡  Pode responder a qualquer método HTTP;¡  Não tem suporte a validação;¡  O método que deve ser sobrescrito é o handleRequestInternal()
  • 82. Criando o ListarAction¡  Umobjeto que lista todos os objetos de uma certa classe;¡  Faz uma busca utilizando o repositório;
  • 83. Propriedades do nosso objeto private Class classe; private String view; private Repositorio repositorio;
  • 84. Em código...protected ModelAndView handleRequestInternal (HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView ( this.getView() ); mv.getModel().put("objetos", this.getRepositorio ().pegarTodos( this.getClasse()) ); return mv; }
  • 85. O Controlador SimpleFormController¡  É utilizado para lidar com formulários;¡  Faz a conversão automática de tipos primitivos e também pode registrar seus próprios PropertyEditors;¡  Tem suporte a validação;¡  Os objetos podem ficar na sessão ou podem ser recriados a cada requisição
  • 86. Configurando<bean id="inserirNoticiaAction" class="org.maujr.action.FormAction"> <property name="commandClass"> <value>org.maujr.noticia.Noticia</value> </property> <property name="formView"> <value>noticia</value> </property> <property name="successView"> <value>noticias-redirect</value> </property> <property name="validator"> <ref bean="noticiasValidator"/> </property> <property name="repositorio"> <ref bean="repositorio"/> </property></bean>
  • 87. É o mesmo objeto para o GET e oPOST¡  NoGET ele carrega o objeto e coloca ele para ser visualizado no método formBackingObject();¡  No POST ele faz a validação do formulário e se não tiver nenhum erro chama o método onSubmit();
  • 88. Criando o FormAction¡  É responsável por inserir e editar os objetos no banco de dados;¡  É capaz de tranformar todas as propriedades simples;¡  Pode ser extendido para lidar com propriedades complexas;
  • 89. Quando ele recebe um GETString id = request.getParameter("chave");if ( id != null ) { Persistivel objeto =repositorio.pegarPeloId( new Long(id) ); return objeto;}return super.formBackingObject(request);
  • 90. Quando ele recebe um POSTthis.getRepositorio().adicionar ( (Persistivel) command);return new ModelAndView ( this.getSuccessView() );
  • 91. Sequência de execução do SpringMVC
  • 92. Não estouvendo avalidação!
  • 93. A validação é feita pelainterface ValidatorBasta implementar os métodossupports() e validate(). Quandoocorrer um erro, chama-se o método reject() no objeto Errors, o Springretorna a requisição e mostra o erroautomaticamente.
  • 94. Em código...public void validate(Object obj, Errors errors) {Pessoa pessoa = (Pessoa) obj; if (pessoa.getNome() == null) { errors.rejectValue( nome , obrigatorio , Este campo é obrigatório ); }}
  • 95. Revisando...
  • 96. O que é...Inversão de controle?
  • 97. Quais são os...Tipos de inversão decontrole?
  • 98. É possível...Utilizar objetos que nãotenham construtorespúblicos?
  • 99. O que é...Um FactoryBean?
  • 100. Todos os objetos...Tem que ser singletons?
  • 101. E então? Acabou?
  • 102. Agora eu voudominar aFenda do Biquini!
  • 103. Não tão rápido!Ainda falta o Velocity!
  • 104. O que é o Velocity?É uma ferramenta de geração textodinamicamente, para aplicaçõesdesktop ou web
  • 105. Como ele funciona?¡  Você escreve um arquivo de texto qualquer com as diretivas da Velocity Template Language (VTL);¡  Manda o Velocity carregar o arquivo;¡  Cria um conjunto de objetos que vai ser utilizado para gerar o resultado;¡  E recebe um String com o que for criado;
  • 106. VelocityEngine¡  É a classe que é utilizada para se acessar o Velocity;¡  Faz o carregamento dos Templates;¡  Uma mesma VelocityEngine pode ser reutilizada por toda a aplicação;
  • 107. Configurando uma VelocityEngineengine = new VelocityEngine();Properties props = new Properties();props.put("resource.loader", "class");props.put("class.resource.loader.class", ClasspathResourceLoader.class.getName());props.put("class.resource.loader.cache", "false");engine.init(props);
  • 108. Criando e executando um templateTemplate template = engine.getTemplate("org/maujr/ velocity/noticias.html");Context context = new VelocityContext ();List<Noticia> noticias = new ArrayList<Noticia>();//criando as notíciascontext.put("objetos", noticias);Writer writer = new StringWriter();template.merge(context, writer);System.out.println(writer.toString());
  • 109. O que é a VTL?É uma linguagem simples para otratamento dos templates
  • 110. Utilizando uma variável do Context¡  $nomeDaVariável – Declaração simples¡  ${nomeDaVariavel} – Declaração completa¡  $!{nomeDaVariavel} – Declaração silenciosa
  • 111. Chamando métodosMétodos que não recebemparâmetros podem ser chamadosnormalmente, como em:${pessoa.calcularPeso()}
  • 112. Acessando propriedadesJavaBeansPropriedades JavaBeans podem seracessadas da mesma maneira queem Expression Language:${noticia.titulo}${aluno.curso.nome}
  • 113. Tem alguma diferença?<a href= /verArtigo/$command.id.do > Ver artigo</a><a href= /verArtigo/${command.id}.do > Ver artigo</a>
  • 114. Como criar uma variável notemplate?Usando #set:#set( $nome = Maurício )
  • 115. Execução Condicional - #if¡  Operador para tratar condições¡  Recebe um boolean¡  Se o valor retornar null ele interpreta como false¡  Pode conter uma condição #else¡  Pode conter várias condições #elseif para funcionar como um switch¡  Pode conter os operadores ==, >=, <= e !=
  • 116. Em código....#if (${command.id}) <input type="hidden" name="chave" value="$! {command.id}"/>#end
  • 117. Em código com #else e #elseif#if (${command.id}) <input type="hidden" name="chave" value="$! {command.id}"/>#elseif (${command.id} == 10) O valor do id é 10#else Caiu no Else#end
  • 118. Passeando pelas coleções com#foreach¡  Faz a iteração dentro de todas as coleções do Java¡  Não tem controle nativo do tamanho do loop¡  O contador pode ser acessado pela variável ${velocityCounter}
  • 119. Em código...#foreach($noticia in ${objetos}) <tr> <td>${noticia.titulo}</td> <td>${noticia.texto}</td> <td> <a href="noticia.html?chave=$ {noticia.id}"> Editar </a> </td></tr>#end
  • 120. E esse#springBind é o que?
  • 121. É um #macro!Um macro é uma função que podeser reutilizada em vários templatesdiferentes
  • 122. Como se define isso?#macro (nomeDoMacro $variavel $outraVariavel $maisOutra) escreve qualquer coisa#end
  • 123. Onde colocar isso?¡  Macros devem ser colocados em arquivos separados¡  Eles são carregados pelo próprio Velocity quando uma VelocityEngine é criada, através da propriedade velocimacro.library
  • 124. Em código...velocimacro.library=spring.vmOu se forem vários:velocimacro.library= spring.vm,struts.vm,webwork.vm
  • 125. Incluindo conteúdo estáticocom #includeInclui um arquivo de texto qualquer,mas não faz avaliações de VTL ouvariáveis
  • 126. Em código#include( noticias.html )#include( noticias.html , rodape.html , topo.html )
  • 127. Incluindo templates dinâmicoscom #parseFunciona do mesmo modo que o#include, mas faz avaliação deconteúdo dinâmico em VTL
  • 128. E agora?Acabou?Mais alguma coisa?Tá na hora de ir pegar o menino naescola?
  • 129. Agora eu vou colocar em prática o meu plano maligno!
  • 130. A aplicação de exemplo precisa denovas funcionalidades¡  Cadastrar, editar e listar usuários¡  Montar as mensagens de e-mail que vão ser enviadas para cada endereço
  • 131. Trabalhem!
  • 132. Referências¡  Harrop, Rob; Machacek, Jan. Pro Spring. Apress, 2005.¡  Harrop, Rob. Pro Jakarta Velocity. Apress, 2004.¡  Evans, Eric. Domain Driven Design:Tackling Complexity in the Heart of Software. Addisson- Wesley, 2004
  • 133. Referências¡  Johnson, Rod; Hoeller, Juergen. Expert One-On-One J2EE Development Without EJB. Wrox Press, 2004¡  Johnson, Rod. Expert One-On-One J2EE Development. Wrox Press, 2002
  • 134. Trilha Sonora Arch Enemy – Doomsday MachineBlack Label Society - Mafia
  • 135. Trilha Sonora Therion – Lemuria & Sirus BNickelback – All The Right Reasons