V dnešním díle konečně hodíme za hlavu teorii a přejdeme k psaní kódu. Řekneme si odkud Spring stáhnout, jakou verzi použít a pak bleskově implementujeme kompletní funkční Spring-based webovou aplikaci.

Download Springu

Každý, kdo chce začít se Springem experimentovat, si samozřejmě nejdříve musí stáhnout odpovídající knihovny. Nejvhodnější je pochopitelně kompletní distribuce, obsahující všechny externí knihoven, na kterých Spring závisí, včetně dokumentace a vzorových Spring aplikací. Tuto distribuci je možno stáhnout ze Sourceforge stránek Springu. Samotný jar balík Springu lze stáhnout například ze vzdáleného úložiště Mavenu, kde se nachází jak kompletní “vše v jednom” knihovna spring-xxx.jar (kde xxx je číslo verze), která obsahuje všechny moduly Springu, tak i jednotlivé moduly/knihovny, které lze využít v těch případech, kdy uživatel potřebuje jen určitou část funkcionality Springu.

Verze Springu

V tomto seriálu budu využívat svých zkušeností se Springem, které jsem získal během návrhu redakčního systému, na kterém běží náš blog. To, co zde v dalších dílech najdete, by mělo být funkční při použití Springu verze 1.1.5. Vzhledem k tomu, že vývojáři Springu se víceméně drží doporučení pro verzování od Apache Software Foundation, novější verze Springu by měly být zpětně kompatibilní, čili je možno použít dnes aktuální verze 1.2 RC2, stabilní verze 1.2, která by měla vyjít již velmi brzy, či jakékoliv budoucí 1.x.y verze.

Popis použití rámce Spring začneme tak trochu od prostřed. Autoři knih a tutoriálů většinou startují u popisu implementace konceptu Dependency Injection, my však – věrni našemu webově orientovanému zaměření – začneme u modulu Spring MVC.

Některé – zejména ty pozdější a pokročilejší – příklady budou přebírány přímo ze zdrojáků našeho redakčního systému, tedy z funkční a běžící aplikace. Vyvíjíme jej s využitím Tomcatu verze 5, ovšem na našem hostingu běží na Tomcatu 4. Všechny příklady by měly jít velmi snadno převést pro využití v jiném webovém kontejneru. Používáme Javu 1.4.

Nebudeme to protahovat a vrhneme se přímo na nějaký kód. Předpokládejme typickou WAR strukturu webové aplikace:

/WEB-INF/lib/spring-1.1.5.jar /WEB-INF/lib/log4j-1.2.9.jar

Spring používá pro logování log4j, takže je nutno použít log4j knihovnu, kterou lze nalézt například i v kompletní distribuci Springu (tedy v té, která je na Sourceforge download stránce označena jako with dependencies), a vytvořit konfigurační soubor

/WEB-INF/classes/log4j.properties

s jednoduchým obsahem


log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss,SSS} | %C{1}:%M | %m%n

Dále vytvoříme soubor

/WEB-INF/web.xml

Místo, kde na vaši aplikaci vypustíte Spring je právě v souboru web.xml, který může při minimální konfiguraci vypadat takto:



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

< !DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web -app>

<display -name>Spring example/display-name>

<servlet>
</servlet><servlet -name>example</servlet>
<servlet -class>org.springframework.web.servlet.DispatcherServlet</servlet>
<load -on-startup>1</load>

<servlet -mapping>
</servlet><servlet -name>example</servlet>
<url -pattern>/</url>

</display></web>


Vstupním bodem Spring MVC frameworku je objekt třídy DispatcherServlet, který vystupuje v roli tzv. předního kontroleru (front controller), což je běžný J2EE návrhový vzor, kdy všechny HTTP požadavky jdoucí do aplikace “sbírá” jeden objekt a předává je ke zpracování ostatním částem aplikace (ostatním objektům).

Dalším krokem ke zprovoznění první Spring-based aplikace je vytvoření konfiguračního souboru ve formátu XML, který bude Springem, a konkrétně objektem třídy DispatcherServlet, využit pro vytvoření sítě vzájemně provázaných objektů. Je důležité, aby tento soubor měl tvar (servlet-name)-servlet.xml. Soubor

/WEB-INF/example-servlet.xml

může mít opět při spíše minimalistickém nastavení tento obsah:


< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE beans
PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

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

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

<bean id="homeController"
class="spring.example.HomeController" />

</beans>


Následuje vytvoření v tomto konfiguračním souboru definované třídy

/WEB-INF/classes/spring/example/HomeController.java

Její obsah je takovýto:



package spring.example;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Map;
import java.util.HashMap;

public class HomeController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request,   HttpServletResponse response)
throws ServletException, IOException {

Map model = new HashMap();
model.put("pozdrav","Hello world!");
return new ModelAndView("home-view", "model", model);
}

}


Posledním krokem našeho bleskového step-by-step návodu bude vytvoření souboru

/WEB-INF/jsp/home-view.jsp

s obsahem:



< %@ page import="java.util.Map" %>

<html>
<head>
<title>Spring example</title>
</head>
<body>
<h1>< %=((Map)(request.getAttribute("model"))).get("pozdrav")%></h1>
</body>
</html>


Soubory JSP se při tvorbě webových aplikací postavených podle MVC vzoru doporučuje umísťovat do adresáře WEB-INF, kde k nim má přístup pouze samotná aplikace a odkud je nelze vyvolat přímým zadáním jejich cesty do adresního řádku prohlížeče.

Psychická pohoda programátora především

V dnešním díle jsme sice postavili fungující Spring aplikaci, ale princip jejího fungování jsme příliš nerozebrali. Chtěl jsem docílit toho snad každému známého pocitu začátečníka, který při snaze proniknout do nové a netriviální technologie implementuje první triviální příklad a získá tak pocit, že to zas takový problém nebude.

OT: Podobný psychologický moment lze vysledovat v základech dnes už tak známé a populární metodiky vývoje software jakou je Test Driven Development. Jedním z hlavních cílů TDD je dosažení psychické pohody a sebevědomí programátora tím, že je neustále ujišťován o bezchybnosti své práce zelenou barvou ukazatele úspěšnosti JUnit testu. A čím častěji má testy řízený programátor zelenou barvu před očima, tím lépe.

Související odkazy