<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>War, war never changes</title>
	<atom:link href="http://dominikszybowski.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://dominikszybowski.wordpress.com</link>
	<description>J2EE, .NET, IT - Dominik Szybowski blog technologiczny</description>
	<lastBuildDate>Sat, 03 Oct 2009 16:12:15 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dominikszybowski.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/d797e3157e94194e4460a06725c745fa?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>War, war never changes</title>
		<link>http://dominikszybowski.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dominikszybowski.wordpress.com/osd.xml" title="War, war never changes" />
	<atom:link rel='hub' href='http://dominikszybowski.wordpress.com/?pushpress=hub'/>
		<item>
		<title>MTS 2009 okiem JAVA&#8217;owca</title>
		<link>http://dominikszybowski.wordpress.com/2009/10/03/mts-2009-okiem-javaowca/</link>
		<comments>http://dominikszybowski.wordpress.com/2009/10/03/mts-2009-okiem-javaowca/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 16:12:15 +0000</pubDate>
		<dc:creator>k3nnymusic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dominikszybowski.wordpress.com/?p=26</guid>
		<description><![CDATA[Microsoft Technology Summit &#8211; największa polska konferencja technologiczna organizowana przez MS została zakończona. Przyszedł czas na refleksje. Wydarzenie trwało dwa dni i odbywało się w Pałacu Kultury i Nauki w Warszawie. Na kilkudziesięciu sesjach występowali zarówno prelegenci polscy jak i zagraniczni. Całość otwierała sesja generalna, na której najważniejsze osobistości MS&#8217;u opowiadały o wizji oraz planowaniu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dominikszybowski.wordpress.com&amp;blog=7538819&amp;post=26&amp;subd=dominikszybowski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img src="http://dominikszybowski.grupa-net.pl/mts.gif" alt="MTS" align="left" /> Microsoft Technology Summit &#8211; największa polska konferencja technologiczna organizowana przez MS została zakończona. Przyszedł czas na refleksje. </p>
<p>Wydarzenie trwało dwa dni i odbywało się w Pałacu Kultury i Nauki w Warszawie. Na kilkudziesięciu sesjach występowali zarówno prelegenci polscy jak i zagraniczni. Całość otwierała sesja generalna, na której najważniejsze osobistości MS&#8217;u opowiadały o wizji oraz planowaniu wydatków przez Microsoft (sic!). Mimo iż była to głównie marketingowa papka, trzeba przyznać, że zrobiona perfekcyjnie. Sala kongresowa pękała w szwach i chyba nawet nikt nie wychodził w trakcie. Trzy ogromne rzutniki w połączeniu z muzyką, światłami oraz ogromną charyzmą na scenie stworzyły wybuchową mieszankę.</p>
<p>Po zakończonej sesji wychodziło się z sali z myślą &#8222;Tak!.. jestem deweloperem i jestem z tego dumny!&#8221; (wiecie co mam na myśli ?:). Potem przyszedł czas na konkrety.<br />
W kilku salach jednocześnie odbywały się prelekcje na które każdy zapisywał się indywidualnie układając sobie harmonogram. Uczestnicy otrzymywali karty identyfikacyjne z kodami kreskowymi, skanowane czytnikiem przez co wszystko przebiegało bardzo szybko i sprawnie. Jeżeli 5 minut po rozpoczęciu sesji były wolne miejsca, można było wejść na salę, na która nie było się zapisanym. Dzięki temu, jeżeli komuś zależało na jakiejś sesji, mógł się tam dostać bez większych problemów. </p>
<p>W trakcie trwania wydarzenia były godziny, w których prelegenci stacjonowali w boksach i odpowiadali na pytania uczestników (ask the expert). Muszę przyznać, że była to część, która najbardziej mi się podobała. Bez żadnego dystansu, można było nawiązać kontakty i porozmawiać o swoich ulubionych technologiach, powymieniać doświadczenia czy pośmiać się z bug&#8217;ów w nowym sofcie MSu:)</p>
<p>Inne minusy organizacyjne to samo miejsce, w którym odbywała się konferencja było jakby trochę za małe na taką liczbę osób(ale czy są większe?), przez co posiłki część osób musiała konsumować na ziemi.</p>
<p>Jeżeli chodzi o same sesje, to część z nich niestety nie zachwycała i było widać przysypiających uczestników (niektórzy chrapali!). Na szczególną uwagę zasługują prelekcje Tomasza Onyszko, który z dużą dawką humoru prowadził sesje w taki sposób, że nawet ktoś kto nie był zbytnio związany z tematyką dość szybko rozumiał nawet zaawansowane zagadnienia. W 3 sesjach przez niego prowadzonych można było zrozumieć tematykę Single Sign On przez ActiveDirectory właściwie od A do Z (oczywiście na tyle ile można zrozumieć coś od a do z oglądając prezentację). Dodatkowo bardzo podobał mi się dystans prowadzącego, który otwarcie mówił, że używa WireSharka, pokazywał dużo produktów nie-microsoftowych i uczył jak integrować linuxa z AD <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Innym prelegentem, który potrafił &#8216;uwieść&#8217; swoją charyzmą i sposobem prowadzenia prezentacji był Mark Minasi prowadzący Uncovering Windows&#8217; Two Least-Understood Security Stars: UAC and WIL. Show w pełnym tego słowa znaczeniu z dużą dawką poczucia humoru i ten czysto amerykański staajl, który budził nawet najbardziej sennych słuchaczy. Niestety nie była to najbardziej intensywna dawka wiedzy technologicznej ale zrekompensowana lekkością i przyjemnością z słuchania.</p>
<p>Jeżeli ktoś lubi bardziej technologiczne wykłady powinien zajrzeć na sesję Tomka Kopacza. Miałem przyjemność uczestniczyć w dwóch prezentacjach. Pierwsza &#8222;Usługi w świecie Microsoft: WCF,REST, .NET Service Bus, Workflow Services&#8221;, była podróżą w której uczestnik poruszał się po wszystkich zagadnieniach związanych z usługami w przerażającym tempie. Tomek bardzo precyzyjnie zwracał uwagę na wszystkie pułapki wydajnościowe oraz sugerował w jaki sposób można sobie z nimi radzić.<br />
Niestety rozczarowała mnie trochę druga sesja o Entities framework, ale nie wiem czy to przez samego prelegenta, czy może bardziej przez technologię. Mając doświadczenia z ORMami takimi jak Hibernate/NHibernate można wysnuć jedyny wniosek &#8211; nowy świetny produkt MSu to przepisane stare rozwiązania, a w dodatku bez połowy funkcjonalności i nazwaniem tego &#8222;nowa jakość pisania oprogramowania&#8221;. W nowych wersjach pojawiają się kolejne moduły, które są już w innych orm&#8217;ach i sprzedawane jako technologia, która zbawi świat. Nie zaskoczy mnie jak w wersji .net 4.5 MS przepisze kilka kolejnych rzeczy takich jak adnotacje(attrybuty w świecie .net), cache, wersjonowanie encji czy search(<a href="http://hibernate.org">Hibernate&#8217;a</a>). </p>
<p>Poza tymi kilkoma szczegółami na pewno warto było pojawić się na konferencji, chociażby po to, aby zobaczyć cały rozmach z jakim została ona zorganizowana. Można było na niej znaleźć inspirację i poznać technologię, którymi warto się zainteresować. Dla kogoś kto jest związany z nimi na co dzień raczej bez fajerwerków.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dominikszybowski.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dominikszybowski.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dominikszybowski.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dominikszybowski.wordpress.com&amp;blog=7538819&amp;post=26&amp;subd=dominikszybowski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dominikszybowski.wordpress.com/2009/10/03/mts-2009-okiem-javaowca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a3a66ed11ba9aca4360f62e222e7db3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">k3nnymusic</media:title>
		</media:content>

		<media:content url="http://dominikszybowski.grupa-net.pl/mts.gif" medium="image">
			<media:title type="html">MTS</media:title>
		</media:content>
	</item>
		<item>
		<title>Zaczynamy&#8230;</title>
		<link>http://dominikszybowski.wordpress.com/2009/05/25/zaczynamy/</link>
		<comments>http://dominikszybowski.wordpress.com/2009/05/25/zaczynamy/#comments</comments>
		<pubDate>Mon, 25 May 2009 00:34:03 +0000</pubDate>
		<dc:creator>k3nnymusic</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[SPRING]]></category>
		<category><![CDATA[STRUTS]]></category>

		<guid isPermaLink="false">http://dominikszybowski.wordpress.com/?p=3</guid>
		<description><![CDATA[Blog ten z założenia ma przyjąć formę notatek z pola walki z technologiami takimi jak J2EE i .NET.  Będę próbował opisywać niektóre ‘starcia’ wraz ze znalezionymi przeze mnie (dobrymi lub nie) rozwiązaniami. Bardziej powinno to przypominać otwartą dyskusję na temat dobrych praktyk i integracji nie zawsze lubiących się technologii niż jakieś moje wydumane wywody . [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dominikszybowski.wordpress.com&amp;blog=7538819&amp;post=3&amp;subd=dominikszybowski&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Blog ten z założenia ma przyjąć formę notatek z pola walki z technologiami takimi jak J2EE i .NET.  Będę próbował opisywać niektóre ‘starcia’ wraz ze znalezionymi przeze mnie (dobrymi lub nie) rozwiązaniami. Bardziej powinno to przypominać otwartą dyskusję na temat dobrych praktyk i integracji nie zawsze lubiących się technologii niż jakieś moje wydumane wywody <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .  Chciałbym skupić się przede wszystkim na aplikacjach korporacyjnych, ale nie powinno też zabraknąć czasem jakiegoś przerywnika.</p>
<p>No to zaczynamy…</p>
<h2>Integracja Struts2 &#8211; Spring &#8211; Groovy</h2>
<p>Od jakiegoś czasu wdrażam się w tematykę groovy&#8217;iego &amp; grails&#8217;a i wszystkimi aspektami z nimi związanymi. W skrócie <a href="http://groovy.codehaus.org/">groovy</a> to język dynamiczny kompilowany do klas Javy, a <a href="http://grails.org">grails</a> to cały framework z wbudowanymi min. <a href="https://www.hibernate.org/">Hibernate&#8217;m</a> i <a href="http://www.springsource.org/">spring&#8217;iem</a> wspierający paradygmat konwencja ponad konfiguracją. Jeżeli chodzi o zalety, to mamy bardzo dużo rzeczy ‘za darmo’  i konfigurujemy tylko to co jest nam potrzebne. Nie chciałbym ich wszystkich tutaj wymieniać, bo można znaleźć setki artykułów, na ten temat.</p>
<p>Ponieważ od jakiegoś czasu używam połączenia spring + jpa + <a href="http://struts.apache.org/2.x/">struts2</a> zacząłem zastanawiać się jak rozszerzyć je o wsparcie dla groovy&#8217;iego. Istnieje  <a href="http://cwiki.apache.org/S2PLUGINS/groovy-plugin.html">plugin</a> do struts&#8217;a implementujący fabrykę obiektów pozwalającą na budowanie instancji  bezpośrednio z plików .groovy. Niestety plugin ten został stworzony jako rozszerzenie StrutsObjectFactory bez uwzględnienia springa, co ogranicza nam możliwość wstrzykiwania Beanów do struts&#8217;owych akcji.</p>
<p>Spróbujmy rozszerzyć <a href="http://struts.apache.org/2.0.8/docs/spring-plugin.html">struts-spring-plugin</a> tak, aby pozwalał ładowanie skryptów groovy.</p>
<p>A więc od początku…</p>
<p>Zaczynamy od uruchomienia <a href="http://www.eclipse.org/">eclipse&#8217;a</a>, wraz z <a href="http://groovy.codehaus.org/Eclipse+Plugin">wtyczką</a> wspierającej pisanie w groovym.</p>
<p><img class="aligncenter size-full wp-image-4" title="plugin" src="http://dominikszybowski.files.wordpress.com/2009/05/plugin.jpg?w=700" alt="plugin"   /></p>
<p>Jako serwer aplikacji wykorzystamy <a href="http://tomcat.apache.org/">Tomcat’a 6.0</a>.</p>
<p>Następnym krokiem będzie ściągnięcie wszystkich niezbędnych bibliotek</p>
<ul>
<li>Struts2 wraz ze źródłami</li>
<li>Spring 2.5.6-SEC</li>
<li>Groovy 1.6.3</li>
</ul>
<p>W obszarze roboczym tworzymy dwa projekty</p>
<ul>
<li>SpringGroovy – będący prostą aplikacją webową do testowania pluginu</li>
<li>SpringGroovyPlugin – nasze rozszerzenie</li>
</ul>
<p><img class="aligncenter size-full wp-image-5" title="workspace" src="http://dominikszybowski.files.wordpress.com/2009/05/workspace.jpg?w=700" alt="workspace"   /></p>
<p>Ponieważ twórcy struts’a nie zalecają tworzenia wtyczek zależnych od siebie zdecydowałem się rozszerzyć istniejący plugin do integracji ze springiem. Podpinamy źródła wtyczki znajdujące się w<br />
<code>struts-2.1.6\src\plugins\spring\src\main\java</code></p>
<p><!--  Make the Spring object factory the automatic default --></p>
<p>Źródła zawierają w zasadzie tylko dwa pliki, klasę Java \org\apache\struts2\spring\StrutsSpringObjectFactory.java która rozszerza SpringObjectFactory oraz plik konfiguracyjny struts-plugin.xml, który zawiera konfigurację</p>
<p>&lt;!DOCTYPE struts PUBLIC<br />
&#8222;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&#8221;<br />
&#8222;http://struts.apache.org/dtds/struts-2.0.dtd&#8221;&gt;</p>
<p>&lt;struts&gt;<br />
&lt;bean type=&#8221;com.opensymphony.xwork2.ObjectFactory&#8221; name=&#8221;spring&#8221; /&gt;</p>
<p>&lt;!&#8211;  Make the Spring object factory the automatic default &#8211;&gt;<br />
&lt;constant name=&#8221;struts.objectFactory&#8221; value=&#8221;spring&#8221; /&gt;</p>
<p>&lt;package name=&#8221;spring-default&#8221;&gt;<br />
&lt;interceptors&gt;<br />
&lt;interceptor name=&#8221;autowiring&#8221;/&gt;<br />
&lt;interceptor name=&#8221;sessionAutowiring&#8221;/&gt;<br />
&lt;/interceptors&gt;<br />
&lt;/package&gt;<br />
&lt;/struts&gt;</p>
<p>Najbardziej interesujący nas fragment to</p>
<p>&lt;bean type=&#8221;com.opensymphony.xwork2.ObjectFactory&#8221; name=&#8221;spring&#8221; /&gt;</p>
<p>Czyli definicja ziarna o nazwie spring będąca fabryką obiektów StrutsSpringObjectFactory oraz</p>
<p>&lt;constant name=&#8221;struts.objectFactory&#8221; value=&#8221;spring&#8221; /&gt;</p>
<p>czyli ustawienie wyżej zadeklarowanego ziarna jako domyślnej fabryki obiektów.<br />
Obie definicje za chwilę zastąpimy własną implementacją.<br />
Tworzymy klasą dziedziczącą po spring&#8217;owym factory:</p>
<p>package com.ds.struts2.plugin;</p>
<p>import groovy.lang.GroovyClassLoader;</p>
<p>import java.io.File;<br />
import java.io.IOException;<br />
import java.net.URL;</p>
<p>import javax.servlet.ServletContext;</p>
<p>import org.apache.struts2.StrutsConstants;<br />
import org.apache.struts2.spring.StrutsSpringObjectFactory;</p>
<p>import com.opensymphony.xwork2.inject.Inject;<br />
import com.opensymphony.xwork2.util.logging.Logger;<br />
import com.opensymphony.xwork2.util.logging.LoggerFactory;</p>
<p>public class SpringGroovyObjectFactory extends StrutsSpringObjectFactory {<br />
 private static final long serialVersionUID = -1890684310820252562L;<br />
 private static final Logger LOG = LoggerFactory.getLogger(<br />
SpringGroovyObjectFactory.class.getName());<br />
 private GroovyClassLoader gcl;<br />
 <br />
 @Inject<br />
    public SpringGroovyObjectFactory (<br />
            @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,<br />
required=false) String autoWire,<br />
            @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE_ALWAYS_RESPECT,<br />
required=false) String alwaysAutoWire,<br />
            @Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE,<br />
required=false) String useClassCacheStr,<br />
            @Inject ServletContext servletContext) {<br />
  <br />
  super(autoWire,alwaysAutoWire,useClassCacheStr,servletContext);<br />
       <br />
  //inicjalizacja class loadera z groovy utils<br />
  gcl = new GroovyClassLoader(this.getClass().getClassLoader());</p>
<p>  LOG.info(&#8222;&#8230; initialized Struts-Spring-Groovy integration successfully&#8221;, new String[0]);<br />
 }<br />
 <br />
 public Class getClassInstance(String s) throws ClassNotFoundException {<br />
     //jezeli brak rozszerzenia .groovy uzywa springowego factory<br />
  if(!s.endsWith(&#8222;.groovy&#8221;))<br />
         return super.getClassInstance(s);<br />
     Class clazz = null;<br />
     try {<br />
         clazz = loadGroovyClass(s);<br />
     } catch(Exception ex){<br />
         LOG.error(&#8222;Groovy object factory error&#8221;, ex);<br />
     }<br />
     return clazz;<br />
 }</p>
<p> private Class loadGroovyClass(String s)throws ClassNotFoundException, IOException {<br />
  s = s.substring(0, s.length() &#8211; &#8222;.groovy&#8221;.length());<br />
  URL r = getClass().getResource(&#8222;/&#8221;);<br />
  String path = r.getFile();<br />
  s = s.replace(&#8222;.&#8221;, &#8222;/&#8221;);<br />
  s += &#8222;.groovy&#8221;;<br />
  path += s;</p>
<p>        Class clazz = gcl.parseClass(new File(path));<br />
        return clazz;<br />
    }<br />
}</p>
<p>Ponieważ przesłaniamy konstruktor springa, musimy oznaczyć go adnotacją @Inject z takimi samymi parametrami jakie miał konstruktor klasy bazowej, aby struts wiedział, co ma wstrzyknąć podczas inicjalizacji.<br />
W konstruktorze tworzymy class loader z pakietu groovy.lang</p>
<p>gcl = new GroovyClassLoader(this.getClass().getClassLoader());</p>
<p>który pozwala nam na ładowanie klas ze skryptów grooviego, jak widać w metodzie loadGroovyClass(String s).</p>
<p>Metoda getClassInstance jest wywoływana za każdym razem, gdy wywołamy akcję zdefiniowana w pliku struts.xml i w przypadku kiedy akcją jest zwykłą klasą, zostaje wywołana metoda klasy bazowej.</p>
<p>if(!s.endsWith(&#8222;.groovy&#8221;))<br />
return super.getClassInstance(s);</p>
<p>Jeżeli jednak jest to plik .groovy korzystamy z metody parseClass podając ścieżkę do pliku. Zastanawia mnie jaki ma to skutek wydajnościowy, ponieważ, za każdym razem zostaje parsowany plik ze skryptem. Być może warto było by pokusić się o cache’owanie tak zainicjalizowanych klas (a może biblioteka dostarczona z groovym sama dba o to?) lub w momencie tworzenia paczki produkcyjnej wcześniejsze kompilowanie wszystkich skryptów do postaci .class.</p>
<p>Mamy fabrykę więc pozostało wprowadzić zmiany w konfiguracji:</p>
<p>&lt;struts&gt;<br />
&lt;bean type=&#8221;com.opensymphony.xwork2.ObjectFactory&#8221; name=&#8221;springGroovyObjectFactory&#8221; /&gt;</p>
<p>&lt;!&#8211;  Make the Groovy-Spring object factory the automatic default &#8211;&gt;<br />
&lt;constant name=&#8221;struts.objectFactory&#8221; value=&#8221;springGroovyObjectFactory&#8221; /&gt;</p>
<p>&lt;package name=&#8221;spring-default&#8221;&gt;<br />
&lt;interceptors&gt;<br />
&lt;interceptor name=&#8221;autowiring&#8221;/&gt;<br />
&lt;interceptor name=&#8221;sessionAutowiring&#8221;/&gt;<br />
&lt;/interceptors&gt;<br />
&lt;/package&gt;</p>
<p><!--  Make the Groovy-Spring object factory the automatic default --></p>
<p>&lt;/struts&gt;</p>
<p>Eksportujemy projekt do postaci pliku .jar i podgrywamy do projektu SpringGroovy w celu przetestowania rozwiązania.</p>
<p>Utworzyłem plik Web.xml ze standardowymi filtrami dla strutsa i springa:</p>
<p>&lt;filter&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;filter-class&gt;<br />
org.apache.struts2.dispatcher.FilterDispatcher<br />
&lt;/filter-class&gt;<br />
&lt;/filter&gt;</p>
<p>&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;</p>
<p>&lt;listener&gt;<br />
&lt;listener-class&gt;<br />
org.springframework.web.context.ContextLoaderListener<br />
&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>Następnie bardzo prostą akcję napisaną w groovy’im wyświetlającą komunikat na ekranie:<br />
<code><span style="color:#006699;">package com.action.groovy<span><br />
<span><br />
import org.apache.struts2.convention.annotation.Result<span><br />
import com.opensymphony.xwork2.ActionSupport<span><br />
import org.apache.struts2.convention.annotation.Action<span><br />
<span><br />
public class GroovyHelloWorld extends ActionSupport{<span><br />
<span><br />
String msg = "Hello groovy!"<span><br />
<span><br />
public String execute(){<span><br />
addActionMessage(getMsg());<span><br />
return SUCCESS;<span><br />
}<span><br />
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code><br />
Pozostało zdefiniowanie akcji w pliku struts.xml</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&#8222;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&#8221;<br />
&#8222;http://struts.apache.org/dtds/struts-2.0.dtd&#8221;&gt;<br />
&lt;struts&gt;<br />
&lt;constant name=&#8221;struts.objectFactory&#8221; value=&#8221;springGroovyObjectFactory&#8221; /&gt;<br />
&lt;constant name=&#8221;struts.devMode&#8221; value=&#8221;true&#8221; /&gt;</p>
<p>&lt;package name=&#8221;basic&#8221; extends=&#8221;struts-default&#8221;&gt;</p>
<p>&lt;action name=&#8221;groovy&#8221; method=&#8221;execute&#8221;&gt;<br />
&lt;result&gt;/WEB-INF/jsp/basic/groovy.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>&lt;/package&gt;</p>
<p>&lt;/struts&gt;<br />
Oraz utworzenia widoku /WEB-INF/jsp/basic/groovy.jsp</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243; ?&gt;<br />
&lt;%@ page language=&#8221;java&#8221; contentType=&#8221;text/html; charset=UTF-8&#8243;<br />
pageEncoding=&#8221;ISO-8859-1&#8243;%&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221;%&gt;</p>
<p>&lt;!DOCTYPE html PUBLIC &#8222;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8222;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;<br />
&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=ISO-8859-1&#8243; /&gt;<br />
&lt;title&gt;Insert title here&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;s:actionmessage/&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>Po uruchomieniu serwera w moim przypadku okazało się, że plugin nie działa tak jak powinien. Eclipse podczas budowania projektu ignoruje pakiety, w których nie ma żadnych klas (a przecież my mamy tylko plik .groovy) i nie kopiuje ich do katalogu classes, gdzie classloader szuka skryptu. Nie udało mi się znaleźć ustawienia, które by załatwiło sprawę, więc na czas testów dodałem do pakietu pustą klasę.<br />
Tym razem plugin powinien działać bez zarzutu.</p>
<p><img class="aligncenter size-full wp-image-6" title="success" src="http://dominikszybowski.files.wordpress.com/2009/05/success.jpg?w=700" alt="success"   /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dominikszybowski.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dominikszybowski.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dominikszybowski.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dominikszybowski.wordpress.com&amp;blog=7538819&amp;post=3&amp;subd=dominikszybowski&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dominikszybowski.wordpress.com/2009/05/25/zaczynamy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8a3a66ed11ba9aca4360f62e222e7db3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">k3nnymusic</media:title>
		</media:content>

		<media:content url="http://dominikszybowski.files.wordpress.com/2009/05/plugin.jpg" medium="image">
			<media:title type="html">plugin</media:title>
		</media:content>

		<media:content url="http://dominikszybowski.files.wordpress.com/2009/05/workspace.jpg" medium="image">
			<media:title type="html">workspace</media:title>
		</media:content>

		<media:content url="http://dominikszybowski.files.wordpress.com/2009/05/success.jpg" medium="image">
			<media:title type="html">success</media:title>
		</media:content>
	</item>
	</channel>
</rss>
