Utilizzare Spring nelle web application – parte 6

Finalmente vedremo come realizzare le pagine JSP, ma prima, come al solito, bisogna mettere mano ai file di configurazione. Negli scorsi articoli infatti siamo partiti da una situazione molto generica, per poi suddividere l’applicazione in strati; questo ci obbliga ad effettuare periodicamente dei refactoring dei sorgenti; con la versione 3.x di Spring comunque si è cercato di semplificare molto le configurazioni, quindi si tratterà di cambiamenti molto isolati.

Per completezza riportiamo tutti i file di configurazione attuali, con le modifiche già applicate; il primo è src/main/resources/applicationContext.xml:

<?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:context="http://www.springframework.org/schema/context"
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:annotation-config/>

  <context:component-scan base-package="it.artera.springtut"/>

</beans>

Poi abbiamo src/main/webapp/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
  version="2.5">

  <display-name>Spring 3 Tutorial</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath*:/applicationContext.xml
    </param-value>
  </context-param>
  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <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>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

</web-app>

In questo file sono specificate le opzioni per:

  • configurare il caricamento dell’application context di Spring;
  • configurare Sitemesh (cfr. con la serie di articoli apparsi sul blog);
  • specifica dei welcome files, ovvero i file che vengono mostrati quando non si specifica nulla nella URL.

L’ultimo file è di configurazione è nuovo, src/main/webapp/WEB-INF/dispatcher-servlet.xml:

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
       default-lazy-init="true">

    <context:component-scan base-package="it.artera.springtut.controller"/>

    <!-- Configures the @Controller programming model -->
    <mvc:annotation-driven/>

    <!-- Un modo comodo per mappare le URL direttamente sulle JSP, senza dover creare un controller -->
    <mvc:view-controller path="/about.html" view-name="about" />

    <!-- View Resolver for JSPs -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="requestContextAttribute" value="rc"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- Add additional controller beans here -->
</beans>

In esso viene configurato il framework Spring MVC, tramite il tag <mvc:annotation-driven/>, e il view resolver di default. Questo componente, dal nome piuttosto esotico, non fa altro che stabilire (da qui il termine resolver) la visualizzazione (o view) da mostrare all’utente una volta eseguito il controller. Dettagli a parte, ci preme far notare come il view resolver vada a pescare le pagine sotto /WEB-INF/pages/; con questo stratagemma le pagine non saranno accessibili tramite chiamata diretta via URL (tutto ciò che sta sotto /WEB-INF infatti non è accessibile da web).

È possibile anche definire controller “virtuali”, che vanno direttamente su pagine JSP, utilizzando il tag <mvc:view-controller>.

Pagine JSP

Tutte le JSP utilizzeranno almeno una delle tag library a disposizione, creiamo quindi la pagina src/main/webapp/WEB-INF/pages/common/taglibs.jsp, che verrà inclusa:

&lt;%@ page language=&quot;java&quot; pageEncoding=&quot;UTF-8&quot; contentType=&quot;text/html;charset=utf-8&quot; %&gt;
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&gt;
&lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&gt;
&lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&gt;
&lt;%@ taglib prefix=&quot;sql&quot; uri=&quot;http://java.sun.com/jsp/jstl/sql&quot; %&gt;
&lt;%@ taglib prefix=&quot;spring&quot; uri=&quot;http://www.springframework.org/tags&quot; %&gt;
&lt;%@ taglib prefix=&quot;form&quot; uri=&quot;http://www.springframework.org/tags/form&quot; %&gt;

Ora, dobbiamo creare la pagina src/main/webapp/index.jsp. Questa verrà invocata come welcome page nel caso nella URL non ci sia una pagina specifica, ad esempio in http://www.example.com/. Poiché IndexController, realizzato nell’articolo scorso, risponde al path /index.html, questa JSP si occupa semplicimente di redirezionarvi il browser:

&lt;%@ include file=&quot;WEB-INF/pages/common/taglibs.jsp&quot;%&gt;
&lt;c:redirect url=&quot;index.html&quot; /&gt;

Infine, ecco il codice della pagina src/main/webapp/WEB-INF/pages/index.jsp, ovvero quella che verrà mostrata dopo IndexController:

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;%@ include file=&quot;common/taglibs.jsp&quot;%&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;index.jsp&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%@ include file=&quot;common/searchBox.jsp&quot; %&gt;
&lt;hr /&gt;
&lt;h4&gt;Ultime inserzioni&lt;/h4&gt;
&lt;a href=&quot;insertions.html&quot;&gt;Visualizza tutte&lt;/a&gt;
&lt;%@ include file=&quot;common/insertionsList.jsp&quot; %&gt;
&lt;/body&gt;
&lt;/html&gt;

Linkografia