Modelo de Componentes - DAS-2017-1-Grupo1/estudo-framework GitHub Wiki

1. Core Components

O Spring MVC define os seguintes componentes principais:

Principais Componentes do Spring MVC

Figura 1 - Core Components do Spring MVC.

2. Dispatcher Servlet

Qualquer que seja a requisição do cliente (URL) ele intercepta antes de passar o Objeto de Requisição para a Controller. O arquivo de configuração Web Configuration possui a definição de como o Servlet deve ser invocado para as requisições.

Segue um exemplo do arquivo web.xml para invocar o Servlet:

<?xml version='1.0' encoding='UTF-8'?>
    <web-app version='2.4'>

    <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>*.*</url-pattern>
    </servlet-mapping>

</web-app>

3. Handler Mappings

Componentes que implementam a interface HandlerMapping são responsáveis por definir um mapeamento entre as requisições do cliente e os objetos handler. Esse objetos, por sua vez, redirecionam para uma controller. A interface pode ser implementada por desenvolvedores para prover estratégias de mapeamento customizadas. Alguns dos componentes definidos pelo framework, são descritos a seguir.

Handler Mappings

Figura 2 - Handler Mappings.

3.1. SimpleUrlHandlerMapping

Esse componente permite um mapeamento direto e declarativo entre objetos bean e URLs ou entre nomes bean e URLs. Segue um exemplo de um mapeamento entre as requisições “/simpleUrlWelcome” e “/*/simpleUrlWelcome” para um bean "welcome".

@Configuration
public class SimpleUrlHandlerMappingConfig {
 
    @Bean
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        SimpleUrlHandlerMapping simpleUrlHandlerMapping
          = new SimpleUrlHandlerMapping();
         
        Map<String, Object> urlMap = new HashMap<>();
        urlMap.put("/simpleUrlWelcome", welcome());
        simpleUrlHandlerMapping.setUrlMap(urlMap);
         
        return simpleUrlHandlerMapping;
    }
 
    @Bean
    public WelcomeController welcome() {
        return new WelcomeController();
    }
}

Na configuração XML:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <value>
            /simpleUrlWelcome=welcome
            /*/simpleUrlWelcome=welcome
        </value>
    </property>
</bean>
<bean id="welcome" class="com.baeldung.WelcomeController" />

Uma alternativa relação ao XML seria:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/simpleUrlWelcome">welcome</prop>
            <prop key="/*/simpleUrlWelcome">welcome</prop>
        </props>
    </property>
</bean>

3.2. BeanNameUrlHandlerMapping

Esse componente é a implementação default do HandlerMapping. Ele mapeia URLs requisitadas para beans com o mesmo nome. Por exemplo, um URL "/foo" é mapeado para um bean chamado "/foo". Segue um exemplo com uma URL "/beanNameUrl":

@Configuration
public class BeanNameUrlHandlerMappingConfig {
    @Bean
    BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() {
        return new BeanNameUrlHandlerMapping();
    }
 
    @Bean("/beanNameUrl")
    public WelcomeController welcome() {
        return new WelcomeController();
    }
}
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean name="/beanNameUrl" class="com.baeldung.WelcomeController" />

4. Controllers

Controllers são componentes chamados pelo Dispatcher Servlet para executar alguma lógica de negócio. O Spring MVC provê uma variedade de componentes controllers, cada qual para um propósito específico. Todos eles implementam a interface Controller. Segue alguns exemplos de componentes controller.

Componentes Controller

Figura 3 - Controller components.

4.1. AbstractController

Todos os componentes do tipo controller herdam de AbstractController. O programador pode extender essa classe e implementar a sua própria controller a partir do zero. Isso pode ser feito para simplesmente retornar um recurso para o cliente, sem verificar os parâmetros da requisição.

public class ABSController extends AbstractController { 
  
 @Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
 HttpServletResponse response) throws Exception {

  String Mess = "Abstract Controller Test"; 
  ModelAndView modelAndView = new ModelAndView("abscontroller"); //buscar pela view "abscontroller"
  modelAndView.addObject("message", Mess);//adicionar o valor de Mess ao atributo "message" definido na view
  return modelAndView;
  }
}

4.2. ParameterizableViewController

Essa controller não requer o uso de uma classe, enviando uma requisição diretamente para uma view. Basta declarar um bean ParameterizableViewController e especificar o nome da view através da propriedade viewName.

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/welcome.htm">welcomeController</prop>
        </props>
    </property>
</bean>

<bean name="welcomeController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    <property name="viewName" value="WelcomePage" />
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix">
        <value>/WEB-INF/pages/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

4.3. MultiActionController

O MultiActionController é usado para agrupar ações relacionadas em um único controller.

public class CustomerController extends MultiActionController{

	public ModelAndView add(HttpServletRequest request,
		HttpServletResponse response) throws Exception {

		return new ModelAndView("CustomerPage", "msg","add() method");

	}

	public ModelAndView delete(HttpServletRequest request,
		HttpServletResponse response) throws Exception {

		return new ModelAndView("CustomerPage", "msg","delete() method");

	}

	public ModelAndView update(HttpServletRequest request,
		HttpServletResponse response) throws Exception {

		return new ModelAndView("CustomerPage", "msg","update() method");

	}

	public ModelAndView list(HttpServletRequest request,
		HttpServletResponse response) throws Exception {

		return new ModelAndView("CustomerPage", "msg","list() method");

	}

}
CustomerController –> /customer/*
/customer/add.htm –> add()
/customer/delete.htm –> delete()
/customer/update.htm –> update()
/customer/list.htm –> list()

5. ModelAndView

ModelAndView são objetos retornardos para o Dispatcher Servlet por uma controller. Essa classe é um container que carrega informações da View e da Model. O objeto Model representa algum pedaço de informação que pode ser usado pela View para renderizar para o usuário.

6. View Resolvers

Geralmente, as controllers retornam para o DispatcherServlet dentro objeto ModelAndView uma string (Logical View) representando o objeto real da view (Physical View Logical). Esse mapeamento entre o Logical View e o Physical View Location é realizado pelos componentes do tipo ViewResolver. Isso posibilita renderizar models no browser sem amarrar a implementação a uma tecnologia de view específica. Alguns dos componentes definidos pelo framework, são explicados a seguir.

View resolvers

Figura 4 - View resolvers.

6.1. InternalResourceViewResolver

Esse componente adiciona as propriedades prefix e suffix à string retornada pela ModelView da controller para retonar a view real.

@Bean
public ViewResolver internalResourceViewResolver() {
    InternalResourceViewResolver bean = new InternalResourceViewResolver();
    bean.setViewClass(JstlView.class);
    bean.setPrefix("/WEB-INF/view/");
    bean.setSuffix(".jsp");
    return bean;
}
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix">
       <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
       <value>.jsp</value>
    </property>
</bean> 

6.2. ResourceBundleViewResolver

Por padrão, o componente ResourceBundleViewResolver carrega as view beans do arquivo views.properties localizado na raíz do classpath do projeto. Essa localização pode ser sobrescrita através da propriedade basename.

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
    <property name="basename" value="spring-views" />
</bean>

Arquivo de configuração do projeto

WelcomePage.(class)=org.springframework.web.servlet.view.JstlView
WelcomePage.url=/WEB-INF/pages/WelcomePage.jsp

spring-views.properties

Quando um view name WelcomePage é retornado pela controller, o ResourceBundleViewResolver encontra uma chave que começa com WelcomePage no arquivo spring-views.properties e retorna a URL da view correspondente para o DispatcherServlet.

6.3. XMLViewResolver

O componente XMLViewResolver é usado para resolver o view name com base nas view beans no arquivo XML.

<bean class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="location">
        <value>/WEB-INF/spring-views.xml</value>
    </property>
</bean>

Arquivo de configuração do projeto

<bean id="WelcomePage" class="org.springframework.web.servlet.view.JstlView">
    <property name="url" value="/WEB-INF/pages/WelcomePage.jsp" />
</bean>

spring-views.xml

Quando um nome view WelcomePage é retornado pela controller, o XmlViewResolver irá econtrar um bean com id WelcomePage no arquivo spring-views.xml e retornar a URL da view correspondente /WEB-INF/pages/WelcomPage.jsp para o DispatcherServlet.

Referências

⚠️ **GitHub.com Fallback** ⚠️