Activitats

Hello World Spring MVC amb JavaConfig

L’objectiu d’aquesta activitat és capacitar l’estudiant per manegar les classes de Java Configuration, una alternativa a les anotacions i a la configuració basada en arxius XML.

En els continguts d’aquest apartat hem vist com fer una petita aplicació Hola, Món amb Spring MVC. En aquesta aplicació s’han fet servir anotacions basades en arxius de configuració, un a nivell ‘Application Context (web.xml) i l’altre a nivell de Web Application Context (nivell de Dispatcher Servlet amb l’arxiu DispatcherServlet-servlet.xml).

En aquesta activitat es proposa fer una aplicació Hola, Món amb Spring MVC, i en comptes de posar la configuració en arxius XML, basar-la en classes amb Java configuration. És a dir, no farem servir ni web.xml ni DispatcherServlet-servlet.xml, i els substituirem per classes Java i les anotacions pertinents.

El codi de la solució d’aquesta activitat el podeu descarregar del següent

enllaç ( 10.8 MB )
.

No obstant això, es recomana desenvolupar el projecte pas a pas com es detalla a continuació.

Creació del projecte i dependències

Creeu un nou projecte Maven/Project from Archetype/ amb l’arquetipus maven-archetype-webapp i l’anomeneu “HolaMonSpringConfig”.

Des de la pestanya Files de NetBeans o des de el mateix explorador de fitxers del sistema operatiu, creeu la carpeta Java dins de la carpeta src/main. Ara, si tornem a la pestanya projects de NetBeans, veurem que ha aparegut la carpeta Source Packages on crear els nostres paquets.

Afegim les dependències necessàries, com a qualsevol projecte Spring MVC.

A la secció <dependencies> de pom.xml heu d’afegir-hi les següents:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
        </dependency>

A més, aprofitarem per fer servir la codificació UTF8 en tot el projecte afegint la propietat que defineix aquesta característica en el mateix fitxer pom.xml.

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

El controlador

Creeu el paquet cat.xtec.ioc.controller i, a dins, afegiu-hi el controlador HolaMonController amb el codi que es mostra a continuació.

package cat.xtec.ioc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class HolaMonController {
    @RequestMapping(method = RequestMethod.GET)
    public String hola(ModelMap model) {
        model.addAttribute("salutacio", "Hola Mon Spring amb Java configuration");
        return "benvinguda";
    }
 
    @RequestMapping(value = "/holadenou", method = RequestMethod.GET)
    public String holaDeNou(ModelMap model) {
        model.addAttribute("salutacio", "Hola Mon de nou Spring amb Java configuration");
        return "benvinguda";
    }
}

En aquest exemple, en comptes de construir i retornar un ModelAndView, els mètodes que gestionen la petició reben un ModelMap i retornen un String (amb el nom de la vista); Spring s’encarregarà de construir internament el ModelAndView. Ambdues maneres, la construcció explícita o implícita del ModelAndView, són acceptades per Spring en les versions actuals.

El mètode hola es dispararà davant d’una petició amb l’URL principal, afegirà l’atribut salutacio a la resposta i retornarà la vista benvinguda (benvinguda.jsp).

El mètode holaDeNou que és dispararà amb l’URL holadenou fa el mateix que l’anterior però canviant el text de l’atribut salutacio.

La vista

Creeu la carpeta WEB-INF/views i dins la vista benvinguda.js/ amb el codi que es mostra a continuació.

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Hola Mon Spring MVC Java Config</title>
    </head>
    <body>
        <h1>Salutació: ${salutacio}</h1>
    </body>
</html>

Configuració de l’aplicació

El que hem fet fins ara no difereix de l’aplicació “Hola, Món” que havíem fet amb arxius de configuració XML. Però com que no hem creat la configuració en aquests fitxers, la nostra aplicació no funcionaria, atès que, per exemple, no hem dit qui farà de Dispatcher Servlet i tampoc es podran arribar a disparar els mètodes del controlador específic.

Vegem, doncs, com configurar la nostra aplicació amb Java configuration per fer-la funcionar.

Classe de configuració (‘Configuration class’)

La classe de configuració és la que substitueix l’arxiu de configuració de Web Application Context, és a dir, aDispatcherServlet-servlet.xml. Així doncs, tindrà la informació requerida per fer la cerca de components (component-scanning) i per a la resolució de vistes (View Resolver).

Creeu el paquet cat.xtec.ioc.configuration dins la classe HolaMonConfiguracio amb el codi que es mostra a continuació.

package cat.xtec.ioc.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "cat.xtec.ioc")
public class HolaMonConfiguracio {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

Podem comparar aquesta configuració amb la feta amb XML i veurem les semblances.

Classe d’inicialització (‘Initialization class’)

La classe d’inicialització (‘Initialization class’) conté la configuració equivalent a qualsevol configuració feta en web.xml.

Al paquet cat.xtec.ioc.configuration hi creeu la classe HolaMonInic amb el codi que es mostra a continuació:

package cat.xtec.ioc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class HolaMonInic  extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { HolaMonConfiguracio.class };
    }
  
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
  
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

Com abans fèiem al fitxer web.xml, ara a la classe d’inicialització s’està fent referència a on es troba la configuració a nivell de Dispatcher Servlet (a la classe HolaMonConfiguracio).

Elimineu l’arxiu web.xml que s’ha creat en el vostre projecte i executeu l’aplicació, i us ha de mostrar la salutació inicial.

Figura Sortida de l’aplicació amb la salutació inicial

Si aneu a la pàgina localhost:8080/HolaMonSpringConfig/holadenou veureu com canvia la salutació.

Anar a la pàgina anterior:
Introducció a Spring i Spring MVC
Anar a la pàgina següent:
Exercicis d'autoavaluació