SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
Spring MVC Framework.
          Rodrigo Urubatan Ferreira Jardim
               Arquiteto J2EE/Consultor
                 Immediate Consultoria
            rodrigo@usiinformatica.com.br
           http://www.usiinformatica.com.br
             http://www.immediate.com.br

http://www.immediate.com.br                   http://www.rsjug.org
Spring Framework




http://www.immediate.com.br   http://www.rsjug.org
Desenvolvendo aplicações com o
          Spring Framework
●   Histórico do Framework
●   Desenvolvendo para Interfaces não para classes
    concretas
●   Inversão de Controle e Injeção de Dependências
●   Facilidades AOP do framework
●   Desenvolvimento WEB com Spring MVC
    Framework


http://www.immediate.com.br       http://www.rsjug.org
Origem e Filosofia
●   Expert One-to-One J2EE Design and Development – by Rod Johnson
●   J2EE deve ser mais fácil de utilizar
●   Design OO é mais importante do que qualquer tecnologia Utilizada
    (Incluindo J2EE)
●   Checked Exceptions são utilizadas em excesso no java
●   É melhor programar para Interfaces do que para Classes
●   Programar com o Spring deve ser um prazer
●   A sua aplicação não deve depender do Spring (ou depender o menos
    possível)
●   Desenvolvedores principais: Jürgen Höller e Rod Johnson


http://www.immediate.com.br                       http://www.rsjug.org
Desenvolvendo para Interfaces e não
      para classes concretas
●   Facilidade para a troca de implementação
●   Menor acoplamento entre os componentes
●   Indiferença se o componente utilizado é local ou
    remoto
●   Compatibilidade com a futura utilização de AOP
    e criação de proxies para adicionar verificações e
    features não incluídas no projeto inicial


http://www.immediate.com.br         http://www.rsjug.org
Inversão de Controle e Injeção de
                dependências
●   O que é Inversão de Controle
●   O que é Injeção de dependências
●   Formas de Injeção de dependência
●   BeanFactory o Container de injeção de
    dependências do Spring Framework.




http://www.immediate.com.br        http://www.rsjug.org
Utilizando AOP de maneira fácil
●   Conceitos AOP
     – Aspect - um conceito distribuido pela aplicação, por exemplo,
       gerenciamento de transações
     – Advice - uma ação executada em um JointPoint
     – JointPoint - a especificação de onde uma ação deve ser executada
     – Pointcut - um conjunto de JointPoints especificando quando um advice
       deve ser executado
     – Introduction - a adição de metodos ou campos a objetos
     – TargetObject - um objeto que contem um advice
     – AOP Proxy - um objeto criado pelo framework AOP
     – Weaving - o ato de juntar aspectos para criar um TargetObject
●   Capacidades AOP do Spring Framework
●   Utilização do AOP


http://www.immediate.com.br                      http://www.rsjug.org
Capacidades AOP do Spring
                  Framework
●   O spring traz um framework AOP muito poderoso e totalmente integrado com a
    BeanFactory utilizada por toda a aplicação, mas não suporta todos os recursos AOP
    suportados por outras implementações de AOP.
●   O spring não suporta interceptação de campos, apenas de métodos.
●   O suporte a AOP do spring implementa as interfaces definidas pela AOP Aliance.
●   Por default são suportados os seguintes tipos de Advices:
     –   MethodInterceptor
     –   ThrowsAdvice
     –   BeforeAdvice
     –   AfterReturningAdvice




http://www.immediate.com.br                                 http://www.rsjug.org
Utilização do AOP
●   Um exemplo clássico de utilização transparente
    do suporte a AOP do spring framework, é o
    gerenciamento de transações declarativas nativo
    do Spring, que é implementado como um Advice
    AOP.
●   podemos ver também, diversas implementações
    de logging, controle de exceções, adição de
    interfaces em objetos (por exemplo, uma interface
    IsModified)

http://www.immediate.com.br        http://www.rsjug.org
Adicionando uma interface a um
              objeto via AOP
public class IsModifiedInterceptor extends          <bean id=quot;isModifiedInterceptorquot;
    DelegatingIntroductionInterceptor                  class=quot;IsModifiedInterceptorquot;/>
  implements IsModified {
  private boolean modified;                         <bean id=quot;modifiedBeanNameProxyCreatorquot;
  public boolean isModified() {
     return modified;                                   class=quot;org.springframework.aop.framework.au
  }                                                     toproxy.BeanNameAutoProxyCreatorquot;>
  public void resetModified(){                        <property
    modified=false;                                     name=quot;beanNamesquot;><value>*</value></prop
  }                                                     erty>
  public Object invoke(MethodInvocation               <property name=quot;interceptorNamesquot;>
    invocation) throws Throwable {                       <list>
     if (invocation.getMethod().getName().indexOf          <value>isModifiedInterceptor</value>
    (quot;setquot;) == 0)                                        </list>
    modified=true;                                    </property>
     return super.invoke(invocation);               </bean>
  }

}



http://www.immediate.com.br                                     http://www.rsjug.org
Desenvolvendo aplicações WEB
●   Configuração do framework
●   Controllers
●   Validação de formulários
●   Mapeando requests
●   Resolvendo Views
●   Integrando tecnologias de visualização
●   Localização e utilização de themas
●   Tratamento de exceções
●   Exposição de objetos de negocio como serviços remotos via XML-RPC,
    Hesian e Burlap
●   Chamada de objetos remotos utilizando XML-RPC, Hesian, Burlap e EJBs


http://www.immediate.com.br                    http://www.rsjug.org
Aplicação WEB Completa com o
         Spring Framework




http://www.immediate.com.br   http://www.rsjug.org
Configurando a aplicação
●   O primeiro passo para utilizar o spring em uma aplicação
    WEB, é informar ao framework quais serão os arquivos de
    configuração globais.
     –   arquivos web.xml e applicationContext.xml
●   Configurar o listener que ira carregar o contexto.
●   e opcionalmente configurar um contexto para cada
    servlet/dispatcher do framework utilizado.
     –   Arquivo <servletname>-servlet.xml
●   Opcionalmente configurar o framework MVC escolhido,
    caso este não seja o default do spring.
http://www.immediate.com.br                  http://www.rsjug.org
web.xml
<?xml version=quot;1.0quot; ?>
<!DOCTYPE web-app PUBLIC quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENquot; quot;http://java.sun.com/dtd/web-
    app_2_3.dtdquot;>
<!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. -->
<web-app>
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/applicationContext-web.xml,/WEB-INF/applicationContext-hibernate.xml </param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<servlet>
<servlet-name>exemplo</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup> 1</load-on-startup>
</servlet>
<servlet>
<servlet-name>caucho</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup> 4</load-on-startup>
</servlet>
<servlet>
<servlet-name>axis</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet </servlet-class>
<load-on-startup> 5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>exemplo</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>caucho</servlet-name>
<url-pattern>/caucho/*</url-pattern>
</servlet-mapping>

http://www.immediate.com.br
<servlet-mapping>
<servlet-name>axis</servlet-name>
<url-pattern>/axis/*</url-pattern>
                                                                       http://www.rsjug.org
</servlet-mapping>
Controllers
●   Controllers no framework MVC do Spring são equivalentes as Actions do
    Struts ou do WebWork.
●   No framework MVC do Spring, existem 3 tipos básicos de Controllers
     – Controllers Simples - Apenas estender a classe AbstractController
     – MultiActionController - Um Controller implementa diversas ações,
        semelhante a uma action implementando a interface Command do
        WebWork
     – CommandController - são Controladores utilizados para facilitar a
        utilização de formulários e o binding dos parametros destes formulários a
        estes JavaBeans
           ● SimpleFormController - Trás diversas funcionalidades de formulário,

             validação de input e página de sucesso
           ● WizardController - facilita a implementação de formulários multi

             página, como wizards, controla o estado de cada página, ...



http://www.immediate.com.br                         http://www.rsjug.org
<bean id=quot;delegateMAComponentquot;             <bean id=quot;exampleWizardquot;
class=quot;justjava.example.web.controllers.   class=quot;justjava.example.web.controllers.
   ExampleDelegateMultiActionquot;                ExampleWizardquot;
autowire=quot;byNamequot;/>                        autowire=quot;byNamequot;>
<bean id=quot;delegateMAquot;                      <property name=quot;commandNamequot;>
class=quot;org.springframework.web.servlet.m   <value>User</value>
   vc.multiaction.MultiActionControllerquot;   </property>
   >                                       <property name=quot;commandClassquot;>
<property name=quot;delegatequot;>                 <value>justjava.example.web.vo.User</val
<ref bean=quot;delegateMAComponentquot;/>             ue>
</property>                                </property>
</bean>                                    <property name=quot;pagesquot;>
<bean id=quot;exampleFormquot;                     <list>
   class=quot;justjava.example.web.controlle   <value>userWiz1</value>
   rs.ExampleFormquot;
                                           <value>userWiz2</value>
autowire=quot;byNamequot;>
                                           <value>userWiz3</value>
<property name=quot;formViewquot;>
                                           <value>userWizFinish</value>
<value>userForm</value>
                                           </list>
</property>
                                           </property>
<property name=quot;successViewquot;>
                                           </bean>
<value>user-created</value>
                                           <bean id=quot;exampleMAquot;
</property>
                                           class=quot;justjava.example.web.controllers.
<property name=quot;commandNamequot;>
                                              ExampleMultiActionquot;
<value>User</value>                        autowire=quot;byNamequot;/>
</property>
<property name=quot;commandClassquot;>
<value>justjava.example.web.vo.User</val
   ue>
</property>
</bean>


 http://www.immediate.com.br                          http://www.rsjug.org
Validando Formulários
●   Utilizando o framework MVC do Spring, existem duas formas default de
    validação de formulários:
     –   utilizando o commons-validator do projeto jakarta, para isto basta
         informar no XML do spring a utilização deste validator para um controller
         especifico.
     –   Utilizar uma classe implementando a interface Validator, desta forma
         tendo uma validação muito mais flexivel e podendo ser realizada mesmo
         dentro do Dao responsável pelo objeto, facilitando validações do tipo: o
         objeto ja existe, o nome de usuário solicitado ja esta sendo utilizado, ...,
         este é o metodo preferido de validação de formulários no Spring
●   Ao utilizar outro framework MVC a validação deste devera ser utilizada, mas
    o spring pode continuar utilizando o framework de validação nas camadas
    mais baixas, como os beans de negócio ou acesso a dados.


http://www.immediate.com.br                             http://www.rsjug.org
Mapeando Requests
●   BeanNameUrlHandlreMapping                <bean id=quot;urlMappingquot;
      – Direciona os requests para um bean   class=quot;org.springframework.web.se
                                                rvlet.handler.SimpleUrlHandler
        com o mesmo nome do excedente           Mappingquot;>
        da URL.                              <property name=quot;mappingsquot;>
●   SimpleUrlHandlerMapping                  <props>
      – Mapeia requests baseado em           <prop
        WildCards parecidos com os              key=quot;/delegate/*.htmlquot;>delegat
        utilizados para diretórios no ANT       eMA</prop>
                                             <prop
●   HandlerInterceptors                         key=quot;/form.htmlquot;>exampleForm</
      – Podem ser adicionados interceptors      prop>
        a qualquer mapeamento de requests,   <prop
        por exemplo para controlar o            key=quot;/wiz.htmlquot;>exampleWizard<
        horario de acesso as páginas ou         /prop>
                                             <prop
        alguma coisa relacionada a              key=quot;/ma/*.htmlquot;>exampleMA</pr
        segurança                               op>
                                             </props>
                                             </property>
                                             </bean>

http://www.immediate.com.br                          http://www.rsjug.org
Resolvendo Views - viewResolver
●   A resolução de views no framework MVC do Spring, é bem
    flexivel e suporta diversos tipos de recursos.
●   Esta é ralizada como a maior parte do framework por um Bean
    configurado no contexto.
●   Os viewResolvers que vem implementados por default são os
    seguintes:
     –   AbstractCachingViewResolver
     –   ResourceBundleViewResolver
     –   UrlBasedViewResolver
     –   InternalResourceViewResolver
     –   VelocityViewResolver




http://www.immediate.com.br                 http://www.rsjug.org
Tecnologias de Visualização
●   Configurando um dos viewResolvers disponiveis, pode-se
    utilizar o spring com as seguintes tecnologias de View:
     –   JSP/JSTL
     –   Tiles
     –   Velocity
     –   XSLT
     –   PDF
     –   Excel


http://www.immediate.com.br             http://www.rsjug.org
Localizando a aplicação e utilizando
                   temas
●   A maior parte do Spring Framework é localizavel.
●   existem os seguintes localeResolvers ja implementados:
     –   AcceptHeaderLocaleResolver
     –   CookieLocaleResolver
     –   SessionLocaleResolver
●   LocaleChangeInterceptor
     –   este interceptor pode ser adicionado ao hander resolver, e ira detectar um parâmetro
         com o nome siteLanguage no request para alterar o locale do usuário chamando no
         localeResolver do contexto o método setLocale



http://www.immediate.com.br                                 http://www.rsjug.org
Tratando Exceções
●   SimpleMappingExceptionResolver
    –   Habilita a mesma feature da API servlet, possibilita mapear um
        nome de classe de exceção que pode ser jogada de um controller
        para uma view.
●   HandlerExceptionResolver
    –   implementando esta interface em qualquer bean do contexto, o
        que se resume ao metodo: resolveException(Exception,
        Handler) pode-se programaticamente ficar sabendo qual
        exceção foi gerada e em qual controller do sistema, o que traz
        muito mais flexibilidade.


http://www.immediate.com.br                    http://www.rsjug.org
Enviando e-mails
●   A API javamail não é exatamente fácil de ser utilizada.
●   O spring possui uma API de abstração para o envio de
    mensagens/e-mails, estes podem ser enviados utilizando
    JavaMail ou então o MailSender desenvolvido pelo Jason
    Hunter, do pacote com.orreily.servlet.
●   Qualquer uma destas implementações é totalmente
    compatível e utilizável dentro do ambiente IoC do Spring,
    podendo até ser mascarada através do framework de AOP,
    como veremos depois.



http://www.immediate.com.br               http://www.rsjug.org
Configuração dos componentes para
            o e-mail.
<bean id=quot;mailSenderquot; class=quot;org.springframework.mail.javamail.JavaMailSenderImplquot;>
  <property name=quot;hostquot;>
     <value>mail.mycompany.com</value>
  </property>
</bean>
<bean id=quot;mailMessagequot; class=quot;org.springframework.mail.SimpleMailMessagequot;>
  <property name=quot;fromquot;>
     <value>customerservice@mycompany.com</value>
  </property>
  <property name=quot;subjectquot;>
     <value>Your order</value>
  </property>
</bean>
<bean id=quot;orderManagerquot; class=quot;com.mycompany.businessapp.support.OrderManagerImplquot;>
  <property name=quot;mailSenderquot;>
     <ref bean=quot;mailSenderquot;/>
  </property>
  <property name=quot;messagequot;>
     <ref bean=quot;mailMessagequot;/>
  </property>
</bean>




http://www.immediate.com.br                                     http://www.rsjug.org
Como utilizar a configuração feita.
                                    public class OrderManagerImpl implements OrderManager {
                                      private JavaMailSender mailSender;
public interface OrderManager {       private SimpleMailMessage message;
                                      public void setMailSender(JavaMailSender mailSender) {
                                         this.mailSender = mailSender;
                                      }
    void placeOrder(Order order);     public void setMessage(SimpleMailMessage message) {
                                         this.message = message;
}                                     }
                                      public void placeOrder(Order order) {
                                         SimpleMailMessage msg = new SimpleMailMessage
                                         (this.message);
                                         msg.setTo(order.getCustomer().getEmailAddress());
                                         msg.setText(
                                            quot;Dear quot;
                                              + order.getCustomer().getFirstName()
                                              + order.getCustomer().getLastName()
                                              + quot;, thank you for placing order. Your order number is
                                         quot;
                                              + order.getOrderNumber());
                                         try{
                                            mailSender.send(msg);
                                         }
                                         catch(MailException ex) {
                                            System.err.println(ex.getMessage());
                                         }
                                      }
                                    }

http://www.immediate.com.br                         http://www.rsjug.org
Acessando EJBs
●   Acessar EJBs a partir do container IoC do spring é exatamente a
    mesma coisa que acessar qualquer outro componente de negócios,
    ou seja, é como utilizar um POJO.
●   O spring prove suporte para a utilização de session beans locais ou
    remotos, bastando para isto, trocar a factory utilizada na
    configuração, de
    org.springframework.ejb.access.LocalStatelessSessionProxyFactory
    Bean para
    org.springframework.ejb.access.RemoteStatelessSessionProxyFacto
    ryBean
●   e também prove facilidades para ser utilizado a partir de um EJB,
    que será criado pelo EJB Container, e não pelo Spring.

http://www.immediate.com.br                   http://www.rsjug.org
Configurando o acesso a um EJB
<bean id=quot;mySessionBeanquot; class=quot;org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBeanquot;>
    <property name=quot;jndiNamequot;>
       <value>mySessionBean</value>
    </property>
    <property name=quot;businessInterfacequot;>
       <value>br.com.usiinformatica.palestra.spring.ejb.MyBusinessInterface</value>
    </property>
  </bean>
  <bean id=quot;myControllerquot; class = quot;br.com.usiinformatica.palestra.spring.ejb.EjbControllerquot;>
    <property name=quot;mySessionBeanquot;>
       <ref bean=quot;mySessionBeanquot;/>
    </property>
  </bean>




http://www.immediate.com.br                                       http://www.rsjug.org
Implementando o Cliente para o EJB
public class EjbController {
private MyBusinessInterface mySessionBean;
/**
 * @return Returns the mySessionBean.
 */
public MyBusinessInterface getMySessionBean() {
return this.mySessionBean;
}
/**
 * @param mySessionBean The mySessionBean to set.
 */
public void setMySessionBean( MyBusinessInterface mySessionBean ) {
this.mySessionBean = mySessionBean;
}
public void metodoDeNegocio(){
mySessionBean.executarCompra(quot;usuarioquot;,Collections.EMPTY_LIST);
}
}




http://www.immediate.com.br                                     http://www.rsjug.org
Implementando o EJB
public interface MyBusinessInterface {
public void executarCompra(String userName, Collection items);
}
public class MySessionBean extends AbstractStatelessSessionBean implements MyBusinessInterface {

/* (non-Javadoc)
 * @see br.com.usiinformatica.palestra.spring.ejb.MyBusinessInterface#executarCompra(java.lang.String, java.util.Collection)
 */
public void executarCompra( String userName, Collection items ) {
       MailSender ms = ( MailSender ) getBeanFactory().getBean(quot;mailSenderquot;);
       SimpleMailMessage smm = ( SimpleMailMessage ) getBeanFactory().getBean(quot;mailMessagequot;);
       smm.setText(quot;Nova compra do usuário: quot; + userName + quot;n Contendo: quot; + items.toString());
       ms.send(smm);
}
/* (non-Javadoc)
 * @see org.springframework.ejb.support.AbstractStatelessSessionBean#onEjbCreate()
 */
protected void onEjbCreate() throws CreateException {
}
}




http://www.immediate.com.br                                                       http://www.rsjug.org
Expondo objetos remotos via Hesian
•    Hesian é um protocolo binário para <bean name=quot;/User-hessianquot;
     comunicação via HTTP desenvolvido       class=quot;org.springframewor
     pela BEA.                               k.remoting.caucho.Hessian
•    A publicação de serviços neste          ServiceExporterquot;>
     protocolo via o container IoC do      <property
     Spring Framework é extremamente         name=quot;servicequot;><ref
     fácil, basta declarar um bean do tipo   bean=quot;userBOquot;/></property
     HessianServiceExporter e informar a     >
     este qual o bean deve ser exposto
     como serviço e a interface que este   <property
     deve utilizar.                          name=quot;serviceInterfacequot;>
                                           <value>justjava.example.web
                                             .business.UserBO</value>
                                           </property>
                                           </bean>



    http://www.immediate.com.br               http://www.rsjug.org
Expondo objetos remotos via Burlap
•    Burlap é o equivalente em XML ao        <bean name=quot;/Pedido-burlapquot;
     Hessian, também desenvolvido pela         class=quot;org.springframewor
     BEA.                                      k.remoting.caucho.BurlapS
•    A publicação de serviços neste            erviceExporterquot;>
     protocolo via o container IoC do        <property
     Spring Framework é extremamente           name=quot;servicequot;><ref
     fácil, basta declarar um bean do tipo     bean=quot;pedidoBOquot;/></proper
     BurlapServiceExporter e informar a        ty>
     este qual o bean deve ser exposto
     como serviço e a interface que este     <property
     deve utilizar.                            name=quot;serviceInterfacequot;>
                                             <value>justjava.example.web
                                               .business.PedidoBO</value
                                               >
                                             </property>
                                             </bean>


    http://www.immediate.com.br                     http://www.rsjug.org
Expondo objetos remotos via JaxRPC
•    Jax-RPC é a implementação de                 <service name=quot;PedidoServicequot;
     WebServices em padrão Java.                     provider=quot;java:RPCquot;>
                                                    <parameter name=quot;allowedMethodsquot;
•    O SpringFramework prove uma maneira             value=quot;*quot;/>
     fácil de expor serviços neste protocolo, e     <parameter name=quot;classNamequot;
     compatível com qualquer implementação           value=quot;justjava.example.web.xmlrpc.Pe
     deste.                                          didoServicequot;/>
•    Neste exemplo, será utilizado o Axis.        <beanMapping qname=quot;justjava:Pedidoquot;
                                                     xmlns:jpetstore=quot;urn:JustJavaquot;
•    Neste caso basta declarar normalmente o         languageSpecificType=quot;java:justjava.e
     servlet do Axis e criar um Bean que             xample.web.vo.Pedidoquot;/>
     estenda a classe ServletEndpointSupport      <beanMapping qname=quot;justjava:Itemquot;
     para ser exposto como serviço, e logo           xmlns:jpetstore=quot;urn:JustJavaquot;
     após expolo como serviço na                     languageSpecificType=quot;java:justjava.e
                                                     xample.web.vo.Itemquot;/>
     implementação de WebServices                 <beanMapping qname=quot;justjava:Enderecoquot;
     escolhida.                                      xmlns:jpetstore=quot;urn:JustJavaquot;
•    No caso do axis, isto se faz utilizando o       languageSpecificType=quot;java:justjava.e
     arquivo server-config.wsdd.                     xample.web.vo.Enderecoquot;/>
                                                  <beanMapping qname=quot;justjava:Userquot;
                                                     xmlns:jpetstore=quot;urn:JustJavaquot;
                                                     languageSpecificType=quot;java:justjava.e
                                                     xample.web.vo.Userquot;/>
                                                   </service>

    http://www.immediate.com.br                              http://www.rsjug.org
Acessando objetos remotos via
                       Hesian
• A chamada de objetos remotos       <bean id=quot;userBOquot;
  pelo protocolo Hessian é tão       class=quot;org.springframework.
  fácil quanto a exposição deste       remoting.caucho.HessianPr
  serviço.                             oxyFactoryBeanquot;>
                                     <property
• Para esta, basta conhecer a          name=quot;serviceUrlquot;>
  interface publica do serviço e a
  URL, e declarar um Bean como       <value>http://localhost:808
                                       0/spring/caucho/User-
  no exemplo.                          hessian</value>
                                     </property>
                                     <property
                                       name=quot;ServiceInterfacequot;>
                                     <value>justjava.example.web
                                       .business.UserBO</value>
                                     </property>
                                     </bean>

 http://www.immediate.com.br                http://www.rsjug.org
Acessando objetos remotos via
                       Burlap
• A chamada de objetos remotos       <bean id=quot;pedidoBOquot;
  pelo protocolo Burlap é tão        class=quot;org.springframework.
  fácil quanto a exposição deste       remoting.caucho.BurlapPro
  serviço.                             xyFactoryBeanquot;>
                                     <property
• Para esta, basta conhecer a          name=quot;serviceUrlquot;>
  interface publica do serviço e a
  URL, e declarar um Bean como       <value>http://localhost:808
                                       0/spring/caucho/Pedido-
  no exemplo.                          burlap</value>
                                     </property>
                                     <property
                                       name=quot;ServiceInterfacequot;>
                                     <value>justjava.example.web
                                       .business.PedidoBO</value
                                       >
                                     </property>
                                     </bean>
 http://www.immediate.com.br                http://www.rsjug.org
O que esta por vir
●   Spring 1.1
    –   JMS Support
    –   JMX Support
    –   declarative Rules-Based validator
    –   AOP pointcut expression Language, JSR-175 preview
●   Spring 1.2
    –   OGNL Support
    –   JCA Support
    –   enhanced RMI support
●   Spring 1.3?
    –   JSF
    –   Portlets


http://www.immediate.com.br                      http://www.rsjug.org
Projetos Relacionados
●   Rich Client Platform (Sandbox)
    –   Spring RCP
●   Validation (Sandbox)
    –   Commons-Validator
    –   Attribute Based
●   Security
    –   Acegi Secutiry System for Spring
        http://acegisecutiry.sourceforge.net




http://www.immediate.com.br                    http://www.rsjug.org
http://www.immediate.com.br   http://www.rsjug.org
Site do Spring framework
                     http://www.springframework.org
                      Javadoc do Sprign Framework
               http://www.springframework.org/docs/api/
                             Spring + Hibernate
                  http://hibernate.bluemars.net/110.html
                            Spring + WebWork 1
 http://wiki.opensymphony.com/space/Spring+Framework+Integration
                              The Server Side
                       http://www.theserverside.com




http://www.immediate.com.br            http://www.rsjug.org
Rodrigo Urubatan Ferreira Jardim
        Consultor/Desenvolvedor J2EE
          Immediate Consultoria
      Sun Certified Web Component Developer for J2EE 1.4
       Sun Certified Programmer for the Java 2 Platform 1.4

               rodrigo@usiinformatica.com.br
              http://www.usiinformatica.com.br

                http://www.immediate.com.br

http://www.immediate.com.br                       http://www.rsjug.org

Contenu connexe

Tendances

CakePHP - Configurando o ambiente de desenvolvimento no Windows
CakePHP - Configurando o ambiente de desenvolvimento no WindowsCakePHP - Configurando o ambiente de desenvolvimento no Windows
CakePHP - Configurando o ambiente de desenvolvimento no Windows
Emerson Soares
 

Tendances (20)

Mean Stack
Mean StackMean Stack
Mean Stack
 
CakePHP - Configurando o ambiente de desenvolvimento no Windows
CakePHP - Configurando o ambiente de desenvolvimento no WindowsCakePHP - Configurando o ambiente de desenvolvimento no Windows
CakePHP - Configurando o ambiente de desenvolvimento no Windows
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring Framework
 
Spring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaSpring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em Java
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
ASP.NET MVC 5.x
ASP.NET MVC 5.xASP.NET MVC 5.x
ASP.NET MVC 5.x
 
Apostila MVC
Apostila MVCApostila MVC
Apostila MVC
 
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJSConstruindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
 
AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivas
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Mini curso: Ionic Framework
Mini curso: Ionic FrameworkMini curso: Ionic Framework
Mini curso: Ionic Framework
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 

En vedette

UML with Action Semantics
UML with Action SemanticsUML with Action Semantics
UML with Action Semantics
elliando dias
 
How to Design Frameworks
How to Design FrameworksHow to Design Frameworks
How to Design Frameworks
elliando dias
 
Architecture Description Languages: An Overview
Architecture Description Languages: An OverviewArchitecture Description Languages: An Overview
Architecture Description Languages: An Overview
elliando dias
 
Towards a Common Metamodel for the Development of Web Applications
Towards a Common Metamodel for the Development of Web ApplicationsTowards a Common Metamodel for the Development of Web Applications
Towards a Common Metamodel for the Development of Web Applications
elliando dias
 

En vedette (7)

UML with Action Semantics
UML with Action SemanticsUML with Action Semantics
UML with Action Semantics
 
How to Design Frameworks
How to Design FrameworksHow to Design Frameworks
How to Design Frameworks
 
Processing
ProcessingProcessing
Processing
 
Architecture Description Languages: An Overview
Architecture Description Languages: An OverviewArchitecture Description Languages: An Overview
Architecture Description Languages: An Overview
 
Java Reflection
Java ReflectionJava Reflection
Java Reflection
 
Towards a Common Metamodel for the Development of Web Applications
Towards a Common Metamodel for the Development of Web ApplicationsTowards a Common Metamodel for the Development of Web Applications
Towards a Common Metamodel for the Development of Web Applications
 
Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 

Similaire à Spring MVC Framework

Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
elliando dias
 
T@rget trust asp.net avançado
T@rget trust   asp.net avançadoT@rget trust   asp.net avançado
T@rget trust asp.net avançado
Targettrust
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
Vinicius Rocha
 
Introdução a AOP + SpringAOP
Introdução a AOP + SpringAOPIntrodução a AOP + SpringAOP
Introdução a AOP + SpringAOP
elliando dias
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
guestea329c
 

Similaire à Spring MVC Framework (20)

Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Faces
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
servlet-requisicoes
servlet-requisicoesservlet-requisicoes
servlet-requisicoes
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Palestra ASP.NET MVC
Palestra ASP.NET MVCPalestra ASP.NET MVC
Palestra ASP.NET MVC
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
T@rget trust asp.net avançado
T@rget trust   asp.net avançadoT@rget trust   asp.net avançado
T@rget trust asp.net avançado
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
Desenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-endDesenvolvendo aplicações com Angular e Laravel no Back-end
Desenvolvendo aplicações com Angular e Laravel no Back-end
 
Introdução a AOP + SpringAOP
Introdução a AOP + SpringAOPIntrodução a AOP + SpringAOP
Introdução a AOP + SpringAOP
 
Asp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 PtAsp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 Pt
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 

Plus de elliando dias

Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
elliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
elliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
elliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
elliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
elliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
elliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introduction
elliando dias
 

Plus de elliando dias (20)

Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
 
Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introduction
 

Dernier

Dernier (9)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Spring MVC Framework

  • 1. Spring MVC Framework. Rodrigo Urubatan Ferreira Jardim Arquiteto J2EE/Consultor Immediate Consultoria rodrigo@usiinformatica.com.br http://www.usiinformatica.com.br http://www.immediate.com.br http://www.immediate.com.br http://www.rsjug.org
  • 3. Desenvolvendo aplicações com o Spring Framework ● Histórico do Framework ● Desenvolvendo para Interfaces não para classes concretas ● Inversão de Controle e Injeção de Dependências ● Facilidades AOP do framework ● Desenvolvimento WEB com Spring MVC Framework http://www.immediate.com.br http://www.rsjug.org
  • 4. Origem e Filosofia ● Expert One-to-One J2EE Design and Development – by Rod Johnson ● J2EE deve ser mais fácil de utilizar ● Design OO é mais importante do que qualquer tecnologia Utilizada (Incluindo J2EE) ● Checked Exceptions são utilizadas em excesso no java ● É melhor programar para Interfaces do que para Classes ● Programar com o Spring deve ser um prazer ● A sua aplicação não deve depender do Spring (ou depender o menos possível) ● Desenvolvedores principais: Jürgen Höller e Rod Johnson http://www.immediate.com.br http://www.rsjug.org
  • 5. Desenvolvendo para Interfaces e não para classes concretas ● Facilidade para a troca de implementação ● Menor acoplamento entre os componentes ● Indiferença se o componente utilizado é local ou remoto ● Compatibilidade com a futura utilização de AOP e criação de proxies para adicionar verificações e features não incluídas no projeto inicial http://www.immediate.com.br http://www.rsjug.org
  • 6. Inversão de Controle e Injeção de dependências ● O que é Inversão de Controle ● O que é Injeção de dependências ● Formas de Injeção de dependência ● BeanFactory o Container de injeção de dependências do Spring Framework. http://www.immediate.com.br http://www.rsjug.org
  • 7. Utilizando AOP de maneira fácil ● Conceitos AOP – Aspect - um conceito distribuido pela aplicação, por exemplo, gerenciamento de transações – Advice - uma ação executada em um JointPoint – JointPoint - a especificação de onde uma ação deve ser executada – Pointcut - um conjunto de JointPoints especificando quando um advice deve ser executado – Introduction - a adição de metodos ou campos a objetos – TargetObject - um objeto que contem um advice – AOP Proxy - um objeto criado pelo framework AOP – Weaving - o ato de juntar aspectos para criar um TargetObject ● Capacidades AOP do Spring Framework ● Utilização do AOP http://www.immediate.com.br http://www.rsjug.org
  • 8. Capacidades AOP do Spring Framework ● O spring traz um framework AOP muito poderoso e totalmente integrado com a BeanFactory utilizada por toda a aplicação, mas não suporta todos os recursos AOP suportados por outras implementações de AOP. ● O spring não suporta interceptação de campos, apenas de métodos. ● O suporte a AOP do spring implementa as interfaces definidas pela AOP Aliance. ● Por default são suportados os seguintes tipos de Advices: – MethodInterceptor – ThrowsAdvice – BeforeAdvice – AfterReturningAdvice http://www.immediate.com.br http://www.rsjug.org
  • 9. Utilização do AOP ● Um exemplo clássico de utilização transparente do suporte a AOP do spring framework, é o gerenciamento de transações declarativas nativo do Spring, que é implementado como um Advice AOP. ● podemos ver também, diversas implementações de logging, controle de exceções, adição de interfaces em objetos (por exemplo, uma interface IsModified) http://www.immediate.com.br http://www.rsjug.org
  • 10. Adicionando uma interface a um objeto via AOP public class IsModifiedInterceptor extends <bean id=quot;isModifiedInterceptorquot; DelegatingIntroductionInterceptor class=quot;IsModifiedInterceptorquot;/> implements IsModified { private boolean modified; <bean id=quot;modifiedBeanNameProxyCreatorquot; public boolean isModified() { return modified; class=quot;org.springframework.aop.framework.au } toproxy.BeanNameAutoProxyCreatorquot;> public void resetModified(){ <property modified=false; name=quot;beanNamesquot;><value>*</value></prop } erty> public Object invoke(MethodInvocation <property name=quot;interceptorNamesquot;> invocation) throws Throwable { <list> if (invocation.getMethod().getName().indexOf <value>isModifiedInterceptor</value> (quot;setquot;) == 0) </list> modified=true; </property> return super.invoke(invocation); </bean> } } http://www.immediate.com.br http://www.rsjug.org
  • 11. Desenvolvendo aplicações WEB ● Configuração do framework ● Controllers ● Validação de formulários ● Mapeando requests ● Resolvendo Views ● Integrando tecnologias de visualização ● Localização e utilização de themas ● Tratamento de exceções ● Exposição de objetos de negocio como serviços remotos via XML-RPC, Hesian e Burlap ● Chamada de objetos remotos utilizando XML-RPC, Hesian, Burlap e EJBs http://www.immediate.com.br http://www.rsjug.org
  • 12. Aplicação WEB Completa com o Spring Framework http://www.immediate.com.br http://www.rsjug.org
  • 13. Configurando a aplicação ● O primeiro passo para utilizar o spring em uma aplicação WEB, é informar ao framework quais serão os arquivos de configuração globais. – arquivos web.xml e applicationContext.xml ● Configurar o listener que ira carregar o contexto. ● e opcionalmente configurar um contexto para cada servlet/dispatcher do framework utilizado. – Arquivo <servletname>-servlet.xml ● Opcionalmente configurar o framework MVC escolhido, caso este não seja o default do spring. http://www.immediate.com.br http://www.rsjug.org
  • 14. web.xml <?xml version=quot;1.0quot; ?> <!DOCTYPE web-app PUBLIC quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENquot; quot;http://java.sun.com/dtd/web- app_2_3.dtdquot;> <!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. --> <web-app> <context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/applicationContext-web.xml,/WEB-INF/applicationContext-hibernate.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>exemplo</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup> 1</load-on-startup> </servlet> <servlet> <servlet-name>caucho</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup> 4</load-on-startup> </servlet> <servlet> <servlet-name>axis</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet </servlet-class> <load-on-startup> 5</load-on-startup> </servlet> <servlet-mapping> <servlet-name>exemplo</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>caucho</servlet-name> <url-pattern>/caucho/*</url-pattern> </servlet-mapping> http://www.immediate.com.br <servlet-mapping> <servlet-name>axis</servlet-name> <url-pattern>/axis/*</url-pattern> http://www.rsjug.org </servlet-mapping>
  • 15. Controllers ● Controllers no framework MVC do Spring são equivalentes as Actions do Struts ou do WebWork. ● No framework MVC do Spring, existem 3 tipos básicos de Controllers – Controllers Simples - Apenas estender a classe AbstractController – MultiActionController - Um Controller implementa diversas ações, semelhante a uma action implementando a interface Command do WebWork – CommandController - são Controladores utilizados para facilitar a utilização de formulários e o binding dos parametros destes formulários a estes JavaBeans ● SimpleFormController - Trás diversas funcionalidades de formulário, validação de input e página de sucesso ● WizardController - facilita a implementação de formulários multi página, como wizards, controla o estado de cada página, ... http://www.immediate.com.br http://www.rsjug.org
  • 16. <bean id=quot;delegateMAComponentquot; <bean id=quot;exampleWizardquot; class=quot;justjava.example.web.controllers. class=quot;justjava.example.web.controllers. ExampleDelegateMultiActionquot; ExampleWizardquot; autowire=quot;byNamequot;/> autowire=quot;byNamequot;> <bean id=quot;delegateMAquot; <property name=quot;commandNamequot;> class=quot;org.springframework.web.servlet.m <value>User</value> vc.multiaction.MultiActionControllerquot; </property> > <property name=quot;commandClassquot;> <property name=quot;delegatequot;> <value>justjava.example.web.vo.User</val <ref bean=quot;delegateMAComponentquot;/> ue> </property> </property> </bean> <property name=quot;pagesquot;> <bean id=quot;exampleFormquot; <list> class=quot;justjava.example.web.controlle <value>userWiz1</value> rs.ExampleFormquot; <value>userWiz2</value> autowire=quot;byNamequot;> <value>userWiz3</value> <property name=quot;formViewquot;> <value>userWizFinish</value> <value>userForm</value> </list> </property> </property> <property name=quot;successViewquot;> </bean> <value>user-created</value> <bean id=quot;exampleMAquot; </property> class=quot;justjava.example.web.controllers. <property name=quot;commandNamequot;> ExampleMultiActionquot; <value>User</value> autowire=quot;byNamequot;/> </property> <property name=quot;commandClassquot;> <value>justjava.example.web.vo.User</val ue> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 17. Validando Formulários ● Utilizando o framework MVC do Spring, existem duas formas default de validação de formulários: – utilizando o commons-validator do projeto jakarta, para isto basta informar no XML do spring a utilização deste validator para um controller especifico. – Utilizar uma classe implementando a interface Validator, desta forma tendo uma validação muito mais flexivel e podendo ser realizada mesmo dentro do Dao responsável pelo objeto, facilitando validações do tipo: o objeto ja existe, o nome de usuário solicitado ja esta sendo utilizado, ..., este é o metodo preferido de validação de formulários no Spring ● Ao utilizar outro framework MVC a validação deste devera ser utilizada, mas o spring pode continuar utilizando o framework de validação nas camadas mais baixas, como os beans de negócio ou acesso a dados. http://www.immediate.com.br http://www.rsjug.org
  • 18. Mapeando Requests ● BeanNameUrlHandlreMapping <bean id=quot;urlMappingquot; – Direciona os requests para um bean class=quot;org.springframework.web.se rvlet.handler.SimpleUrlHandler com o mesmo nome do excedente Mappingquot;> da URL. <property name=quot;mappingsquot;> ● SimpleUrlHandlerMapping <props> – Mapeia requests baseado em <prop WildCards parecidos com os key=quot;/delegate/*.htmlquot;>delegat utilizados para diretórios no ANT eMA</prop> <prop ● HandlerInterceptors key=quot;/form.htmlquot;>exampleForm</ – Podem ser adicionados interceptors prop> a qualquer mapeamento de requests, <prop por exemplo para controlar o key=quot;/wiz.htmlquot;>exampleWizard< horario de acesso as páginas ou /prop> <prop alguma coisa relacionada a key=quot;/ma/*.htmlquot;>exampleMA</pr segurança op> </props> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 19. Resolvendo Views - viewResolver ● A resolução de views no framework MVC do Spring, é bem flexivel e suporta diversos tipos de recursos. ● Esta é ralizada como a maior parte do framework por um Bean configurado no contexto. ● Os viewResolvers que vem implementados por default são os seguintes: – AbstractCachingViewResolver – ResourceBundleViewResolver – UrlBasedViewResolver – InternalResourceViewResolver – VelocityViewResolver http://www.immediate.com.br http://www.rsjug.org
  • 20. Tecnologias de Visualização ● Configurando um dos viewResolvers disponiveis, pode-se utilizar o spring com as seguintes tecnologias de View: – JSP/JSTL – Tiles – Velocity – XSLT – PDF – Excel http://www.immediate.com.br http://www.rsjug.org
  • 21. Localizando a aplicação e utilizando temas ● A maior parte do Spring Framework é localizavel. ● existem os seguintes localeResolvers ja implementados: – AcceptHeaderLocaleResolver – CookieLocaleResolver – SessionLocaleResolver ● LocaleChangeInterceptor – este interceptor pode ser adicionado ao hander resolver, e ira detectar um parâmetro com o nome siteLanguage no request para alterar o locale do usuário chamando no localeResolver do contexto o método setLocale http://www.immediate.com.br http://www.rsjug.org
  • 22. Tratando Exceções ● SimpleMappingExceptionResolver – Habilita a mesma feature da API servlet, possibilita mapear um nome de classe de exceção que pode ser jogada de um controller para uma view. ● HandlerExceptionResolver – implementando esta interface em qualquer bean do contexto, o que se resume ao metodo: resolveException(Exception, Handler) pode-se programaticamente ficar sabendo qual exceção foi gerada e em qual controller do sistema, o que traz muito mais flexibilidade. http://www.immediate.com.br http://www.rsjug.org
  • 23. Enviando e-mails ● A API javamail não é exatamente fácil de ser utilizada. ● O spring possui uma API de abstração para o envio de mensagens/e-mails, estes podem ser enviados utilizando JavaMail ou então o MailSender desenvolvido pelo Jason Hunter, do pacote com.orreily.servlet. ● Qualquer uma destas implementações é totalmente compatível e utilizável dentro do ambiente IoC do Spring, podendo até ser mascarada através do framework de AOP, como veremos depois. http://www.immediate.com.br http://www.rsjug.org
  • 24. Configuração dos componentes para o e-mail. <bean id=quot;mailSenderquot; class=quot;org.springframework.mail.javamail.JavaMailSenderImplquot;> <property name=quot;hostquot;> <value>mail.mycompany.com</value> </property> </bean> <bean id=quot;mailMessagequot; class=quot;org.springframework.mail.SimpleMailMessagequot;> <property name=quot;fromquot;> <value>customerservice@mycompany.com</value> </property> <property name=quot;subjectquot;> <value>Your order</value> </property> </bean> <bean id=quot;orderManagerquot; class=quot;com.mycompany.businessapp.support.OrderManagerImplquot;> <property name=quot;mailSenderquot;> <ref bean=quot;mailSenderquot;/> </property> <property name=quot;messagequot;> <ref bean=quot;mailMessagequot;/> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 25. Como utilizar a configuração feita. public class OrderManagerImpl implements OrderManager { private JavaMailSender mailSender; public interface OrderManager { private SimpleMailMessage message; public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } void placeOrder(Order order); public void setMessage(SimpleMailMessage message) { this.message = message; } } public void placeOrder(Order order) { SimpleMailMessage msg = new SimpleMailMessage (this.message); msg.setTo(order.getCustomer().getEmailAddress()); msg.setText( quot;Dear quot; + order.getCustomer().getFirstName() + order.getCustomer().getLastName() + quot;, thank you for placing order. Your order number is quot; + order.getOrderNumber()); try{ mailSender.send(msg); } catch(MailException ex) { System.err.println(ex.getMessage()); } } } http://www.immediate.com.br http://www.rsjug.org
  • 26. Acessando EJBs ● Acessar EJBs a partir do container IoC do spring é exatamente a mesma coisa que acessar qualquer outro componente de negócios, ou seja, é como utilizar um POJO. ● O spring prove suporte para a utilização de session beans locais ou remotos, bastando para isto, trocar a factory utilizada na configuração, de org.springframework.ejb.access.LocalStatelessSessionProxyFactory Bean para org.springframework.ejb.access.RemoteStatelessSessionProxyFacto ryBean ● e também prove facilidades para ser utilizado a partir de um EJB, que será criado pelo EJB Container, e não pelo Spring. http://www.immediate.com.br http://www.rsjug.org
  • 27. Configurando o acesso a um EJB <bean id=quot;mySessionBeanquot; class=quot;org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBeanquot;> <property name=quot;jndiNamequot;> <value>mySessionBean</value> </property> <property name=quot;businessInterfacequot;> <value>br.com.usiinformatica.palestra.spring.ejb.MyBusinessInterface</value> </property> </bean> <bean id=quot;myControllerquot; class = quot;br.com.usiinformatica.palestra.spring.ejb.EjbControllerquot;> <property name=quot;mySessionBeanquot;> <ref bean=quot;mySessionBeanquot;/> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 28. Implementando o Cliente para o EJB public class EjbController { private MyBusinessInterface mySessionBean; /** * @return Returns the mySessionBean. */ public MyBusinessInterface getMySessionBean() { return this.mySessionBean; } /** * @param mySessionBean The mySessionBean to set. */ public void setMySessionBean( MyBusinessInterface mySessionBean ) { this.mySessionBean = mySessionBean; } public void metodoDeNegocio(){ mySessionBean.executarCompra(quot;usuarioquot;,Collections.EMPTY_LIST); } } http://www.immediate.com.br http://www.rsjug.org
  • 29. Implementando o EJB public interface MyBusinessInterface { public void executarCompra(String userName, Collection items); } public class MySessionBean extends AbstractStatelessSessionBean implements MyBusinessInterface { /* (non-Javadoc) * @see br.com.usiinformatica.palestra.spring.ejb.MyBusinessInterface#executarCompra(java.lang.String, java.util.Collection) */ public void executarCompra( String userName, Collection items ) { MailSender ms = ( MailSender ) getBeanFactory().getBean(quot;mailSenderquot;); SimpleMailMessage smm = ( SimpleMailMessage ) getBeanFactory().getBean(quot;mailMessagequot;); smm.setText(quot;Nova compra do usuário: quot; + userName + quot;n Contendo: quot; + items.toString()); ms.send(smm); } /* (non-Javadoc) * @see org.springframework.ejb.support.AbstractStatelessSessionBean#onEjbCreate() */ protected void onEjbCreate() throws CreateException { } } http://www.immediate.com.br http://www.rsjug.org
  • 30. Expondo objetos remotos via Hesian • Hesian é um protocolo binário para <bean name=quot;/User-hessianquot; comunicação via HTTP desenvolvido class=quot;org.springframewor pela BEA. k.remoting.caucho.Hessian • A publicação de serviços neste ServiceExporterquot;> protocolo via o container IoC do <property Spring Framework é extremamente name=quot;servicequot;><ref fácil, basta declarar um bean do tipo bean=quot;userBOquot;/></property HessianServiceExporter e informar a > este qual o bean deve ser exposto como serviço e a interface que este <property deve utilizar. name=quot;serviceInterfacequot;> <value>justjava.example.web .business.UserBO</value> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 31. Expondo objetos remotos via Burlap • Burlap é o equivalente em XML ao <bean name=quot;/Pedido-burlapquot; Hessian, também desenvolvido pela class=quot;org.springframewor BEA. k.remoting.caucho.BurlapS • A publicação de serviços neste erviceExporterquot;> protocolo via o container IoC do <property Spring Framework é extremamente name=quot;servicequot;><ref fácil, basta declarar um bean do tipo bean=quot;pedidoBOquot;/></proper BurlapServiceExporter e informar a ty> este qual o bean deve ser exposto como serviço e a interface que este <property deve utilizar. name=quot;serviceInterfacequot;> <value>justjava.example.web .business.PedidoBO</value > </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 32. Expondo objetos remotos via JaxRPC • Jax-RPC é a implementação de <service name=quot;PedidoServicequot; WebServices em padrão Java. provider=quot;java:RPCquot;> <parameter name=quot;allowedMethodsquot; • O SpringFramework prove uma maneira value=quot;*quot;/> fácil de expor serviços neste protocolo, e <parameter name=quot;classNamequot; compatível com qualquer implementação value=quot;justjava.example.web.xmlrpc.Pe deste. didoServicequot;/> • Neste exemplo, será utilizado o Axis. <beanMapping qname=quot;justjava:Pedidoquot; xmlns:jpetstore=quot;urn:JustJavaquot; • Neste caso basta declarar normalmente o languageSpecificType=quot;java:justjava.e servlet do Axis e criar um Bean que xample.web.vo.Pedidoquot;/> estenda a classe ServletEndpointSupport <beanMapping qname=quot;justjava:Itemquot; para ser exposto como serviço, e logo xmlns:jpetstore=quot;urn:JustJavaquot; após expolo como serviço na languageSpecificType=quot;java:justjava.e xample.web.vo.Itemquot;/> implementação de WebServices <beanMapping qname=quot;justjava:Enderecoquot; escolhida. xmlns:jpetstore=quot;urn:JustJavaquot; • No caso do axis, isto se faz utilizando o languageSpecificType=quot;java:justjava.e arquivo server-config.wsdd. xample.web.vo.Enderecoquot;/> <beanMapping qname=quot;justjava:Userquot; xmlns:jpetstore=quot;urn:JustJavaquot; languageSpecificType=quot;java:justjava.e xample.web.vo.Userquot;/> </service> http://www.immediate.com.br http://www.rsjug.org
  • 33. Acessando objetos remotos via Hesian • A chamada de objetos remotos <bean id=quot;userBOquot; pelo protocolo Hessian é tão class=quot;org.springframework. fácil quanto a exposição deste remoting.caucho.HessianPr serviço. oxyFactoryBeanquot;> <property • Para esta, basta conhecer a name=quot;serviceUrlquot;> interface publica do serviço e a URL, e declarar um Bean como <value>http://localhost:808 0/spring/caucho/User- no exemplo. hessian</value> </property> <property name=quot;ServiceInterfacequot;> <value>justjava.example.web .business.UserBO</value> </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 34. Acessando objetos remotos via Burlap • A chamada de objetos remotos <bean id=quot;pedidoBOquot; pelo protocolo Burlap é tão class=quot;org.springframework. fácil quanto a exposição deste remoting.caucho.BurlapPro serviço. xyFactoryBeanquot;> <property • Para esta, basta conhecer a name=quot;serviceUrlquot;> interface publica do serviço e a URL, e declarar um Bean como <value>http://localhost:808 0/spring/caucho/Pedido- no exemplo. burlap</value> </property> <property name=quot;ServiceInterfacequot;> <value>justjava.example.web .business.PedidoBO</value > </property> </bean> http://www.immediate.com.br http://www.rsjug.org
  • 35. O que esta por vir ● Spring 1.1 – JMS Support – JMX Support – declarative Rules-Based validator – AOP pointcut expression Language, JSR-175 preview ● Spring 1.2 – OGNL Support – JCA Support – enhanced RMI support ● Spring 1.3? – JSF – Portlets http://www.immediate.com.br http://www.rsjug.org
  • 36. Projetos Relacionados ● Rich Client Platform (Sandbox) – Spring RCP ● Validation (Sandbox) – Commons-Validator – Attribute Based ● Security – Acegi Secutiry System for Spring http://acegisecutiry.sourceforge.net http://www.immediate.com.br http://www.rsjug.org
  • 37. http://www.immediate.com.br http://www.rsjug.org
  • 38. Site do Spring framework http://www.springframework.org Javadoc do Sprign Framework http://www.springframework.org/docs/api/ Spring + Hibernate http://hibernate.bluemars.net/110.html Spring + WebWork 1 http://wiki.opensymphony.com/space/Spring+Framework+Integration The Server Side http://www.theserverside.com http://www.immediate.com.br http://www.rsjug.org
  • 39. Rodrigo Urubatan Ferreira Jardim Consultor/Desenvolvedor J2EE Immediate Consultoria Sun Certified Web Component Developer for J2EE 1.4 Sun Certified Programmer for the Java 2 Platform 1.4 rodrigo@usiinformatica.com.br http://www.usiinformatica.com.br http://www.immediate.com.br http://www.immediate.com.br http://www.rsjug.org