quarta-feira, 30 de outubro de 2013

Primeiro Exemplo de Aplicação Spring Web MVC com o NetBeans IDE - 1

O padrão arquitetural MVC (Model-View-Controller) permite separar um projeto nas suas componentes de:


  • View - Apresentação (ou Interface com o Utilizador)
  • Controller - Aplicação (ou camada de controlo e dispatching)
  • Model - Modelo de Domínio
  • Infraestrutural (diferentes frameworks; ex.: Spring Web MVC, Hibernate, etc.)



Vimos em artigos anteriores como usar a framework Struts 1 para criar uma aplicação Web de acordo com o padrão MVC, usando JSP, Java e a framework Hibernate.


Vamos, neste artigo, começar a criar uma aplicação Java Web, que implementa o padrão MVC através da framework Spring Web MVC.


Para desenvolver o nosso exemplo vamos usar o NetBeans IDE 7.2.1.
Começamos, então, por criar um novo projeto Java Web/Web Application, atribuir-lhe um nome, testSpringMVC01, selecionar o servidor aplicacional a usar (vamos usar o Apache Tomcat), e selecionar as frameworks que pretendemos usar.


Para este exemplo selecionamos, para além da framework Spring Web MVC (Spring Framework 3.1.1), o Hibernate 3.2.5, o qual iremos usar como infraestrutura de mapeamento entre o Model e a base de dados Oracle.


Ao selecionar o Hibernate, podemos logo aí configurar a string de ligação à base de dados. Se não o fizermos podemos mais tarde editar o ficheiro hibernate.cfg.xml para o fazer.


O Netbeans cria a seguinte estrutura de projeto:






Esta estrutura de pastas inclui o local onde deveremos colocar a camada VIEW, que neste caso será composta por diversos ficheiros JSP (Java Server Pages) - WEB-INF/jsp -, e as classes Java - Source Packages -, onde estarão o CONTROLLER e o MODEL.


O ponto de entrada de uma aplicação Spring MVC é o DispatcherServlet, o qual é uma classe servlet baseada na classe abstrata HttpServlet

Ao receber um pedido HTTP (HTTP request), o DispatcherServlet consulta o HandlerMapping para chamar o controlador apropriado.


O controlador invocado recebe o pedido e chama os métodos de serviço através de GET ou POST.

O método de serviço irá instanciar classes definidas no MODEL e inicializá-las, e depois devolverá um nome de uma View ao DispatcherServletEste, por sua vez, irá pedir ao ViewResolver para carregar a View pretendida para responder ao pedido, e depois passa os dados do MODEL, instanciados anteriormente, para a View, a qual é finalmente renderizada no browser.

Os componentes mencionados, HandlerMappingController e ViewResolver fazem parte do WebApplicationContext, que é uma extensão do ApplicationContext com alguns extras para aplicações Web.

É no ficheiro web.xml que configuramos o mapeamento entre os pedidos que queremos que os DispatcherServlet tratem, e que servlets devem tratar que pedidos.
Ao criar o projeto, o NetBeans criou o ficheiro web.xml, na pasta WEB-INF, com o seguinte conteúdo:



<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>
           org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Podemos aqui notar o elemento <servlet> no qual está definido o DispatcherServlet de nome dispatcher. A framework Spring irá procurar um ficheiro de nome <nome_do_dispatcher>-servlet.xml, neste caso dispatcher-servlet.xml, localizado na pasta WEB-INF   


Podemos também notar o elemento <servlet-mapping> no qual é feito um mapeamento entre um padrão de URL (neste caso *.htm) e o dispatcher que deve ser chamado para tratar de pedidos que satisfaçam esse padrão.

Assim, de acordo com o web.xml acima, todos os pedidos HTTP com padrão *.htm serão encaminhados para o dispatcher service de nome dispatcher, o qual pode ser encontrado no ficheiro 
dispatcher-servlet.xml.

No ficheiro 
dispatcher-servlet.xml, encontramos definidas as classes que serão usadas pelos Controllers.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <!--
    The index controller.
    -->
    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />


</beans>



O primeiro bean define a classe controller que será usada por defeito:
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping

O index controller (indexController), no entanto, é definido como instância da classe
org.springframework.web.servlet.mvc.ParameterizableViewController

e, como se sobrepõe ao controller geral, necessita de um mapeamento próprio.

Temos ainda no ficheiro dispatcher-servlet.xml, a definição do sítio onde o view revolver encontrará as Views (ficheiros jsp) e o mapeamento de index.htm explicitamente para o indexController

No próximo artigo iremos trabalhar com esta base para fazer a nossa aplicação exemplo.



Referências:


Outros artigos relacionados:

Sem comentários:

Enviar um comentário