Siirtyminen Sruts 1:stä Struts 2:seen
Kirjoittanut Ville Julkaistu 26.3.2009
Monien muiden uudistusten ohella Struts2-ohjelmistokehyksessä on mahdollista yhdistää Actionin ja ActionForm, jolloin järjestelmän kontrolleriosan (MVC) ohjelmointi suoraviivaistuu. Esimerkkinä toimii yksinkertainen sisäänkirjautumissivu, jossa on html-lomake tarvittavine tekstikenttineen. Struts1-version toiminnallisuus koostuu html-lomakkeen tiedot säilövästä LoginFormista ja LoginActionista. Migraatio aloitetaan tekemällä uusi Action-luokka, jonne sijoitetaan kaikki LoginFormin muuttujat gettereineen ja settereineen.
public class Login{ private String userName; private String password; ... public String getUserName() { return userName; } }
Actionin toimintaa ei enää tarvitse sitoa pelkästään execute-metodiin, vaan käytettävä metodi määritellään konfiguraatiotiedostossa. Tämä mahdollistaa Action-luokkien yhdistämisen. Esimerkkiluokkaan lienee siis sopivaa sijoittaa myös uloskirjautuminen, kumpikin omaan metodiinsa.
public class Login{ ... public String login(){ // Kopioi toiminnallisuus tähän return ”success”; } public String logout(){ return Action.SUCCESS; } }
Käytettävien metodien on oltava julkisia ja niiden tulee palauttaa String-arvo. Toiminnallisuus voidaan kopioida suoraan vanhoista Actioneista, lukuunottamatta palautusarvoja, jotka ovat normaaleja String-arvoja. Palautusarvoina voidaan käyttää myös Action-rajapinnan tarjoamia vakioita perustapahtumille.
Struts2-Actionit konfiguroidaan struts.xml-tiedostossa, jonka tulee olla applikaation classpathissa. Tiedoston rakenne poikkeaa hieman Struts1:n vastaavasta.
Struts1 (struts-config.xml):
<action-mappings> <action path="/loginUser" type="myactions.LoginAction" name="loginForm"> <forward name="success" path="/loginOk.jsp"/> </action> </action-mappings>
Struts2 (struts.xml):
<struts> <package name="login" extends="struts-default"> <action name="loginUser" method="login" class="myactions.Login"> <result name="success">/loginOk.jsp</result> </action> <action name="logoutUser" method="logout" class="myactions.Login"> <result name="success">/logoutOk.jsp</result> </action> </package> </struts>
Käytettävä JSP-sivu on myös konvertoitava Struts2-yhteensopivaksi. Alla olevaan sivuun ei suuria muutoksia tarvitse tehdä.
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html> <body> <html:form action="/loginUser.do"> Käyttäjätunnus: <html:text property="userName" /><br> Salasana: <html:password property="password" /><br> <html:submit value="Ok"/> </html:form> </body> </html>
Ensin otetaan käyttöön uusi tagikirjasto ja määritellään käytettävä etuliite. Tagien ja niiden attribuuttien nimitykset ovat osittain vaihtuneet, esimerkiksi text on nyt textfield. Lisäksi property-attribuutti on poistunut ja täten Actionin muuttujiin viitataan tagin name-attribuutilla.
<%@ taglib prefix="s" uri="/struts-tags" %> <html><body> <s:form action="/loginUser.action"> <s:textfield name="userName" label="Käyttäjätunnus"/><br> <s:password name="password" label="Salasana"/><br> <s:submit value="Ok" align="left"/> </s:form> </body> </html>
Struts1 ja Struts2 voivat toimia keskenään samassa applikaatiossa. Struts1-applikaation on vain lisättävä tarvittavat Struts2-kirjastot ja web.xml-tiedostoon seuraavat elementit:
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Web.xml-tiedoston Struts1-konfiguraatiot voidaan jättää ennalleen:
<servlet> <servlet-name>struts1</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>struts1</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
Struts2:ssa http-pyynnöt prosessoi FilterDispatcher-luokka. FilterDispatcher käsittelee oletuksena .action-päätteiset pyynnöt. Struts1:n ActionServlet on siis edelleen valmiina käsittelemään .do-päätteisiä pyyntöjä.



