Struts 2 Tietovirrat
Kirjoittanut J-P Julkaistu 08.03.2010
Struts 2 kehys sisältää varsin helppokäyttöisen mekanismin raakojen tietovirtojen syöttämiseksi selaimelle. Normaalistihan selaimelle syötetään enemmän tai vähemmän selkeää tekstiä kuten HTML-ssisältöä tms. Kuitenkin aina silloin tällöin on tarpeen lähettää selaimelle myös muuta (dynaamisesti luotua) tietoa, kuten kuvia tai videokuvaa. Tällöin kuvaan tulee Struts 2:sen palautustyyppi stream
Seuraavan esimerkin ymmärtämiseksi tarvitset hiukan taustatietoa struts2 -kehyksestä. Jos jo tiedät mitä ovat toiminnot (Action) ja ymmärrät struts.xml -konfiguraatiotiedoston sisällön pääpiirteittäin. Tiedät riittävästi.
Seuraavassa yksinkertaisessa esimerkissä lähetämme selaimelle tekstitiedoston nimellä "malli.txt" siten, että selain avaa tiedostontallennusdialogin. Tätä mallia soveltamalla voit lähettää selaimelle mitä tahansa tietoa kuten kuvia, videota tai pdf-tiedostoja, kunhan vaihdat tiedoston mimetyypin.
Lähdemme liikkeelle struts.xml tiedoston sisältämästä toiminnon (Action) määrittelystä.
<action name="dowloadTextFile" class="com.comiasw.example.TxtStreamAction"> <result type="stream"> <param name="contentType"> ${mimeType} </param> <param name="inputName">stream</param> <param name="contentDisposition"> attachment;filename="${textFileName}" </param> <param name="bufferSize">1024</param> <param name="contentLength"> ${textFileSize} </param> </result> </action>
Edellinen konfiguraatio määrittelee, että kun selain ohjataan osoitteeseen dowloadTextFile.action palvelin lähettää vastauksena tietovirran (InputStream) sisällön TxtStreamAction.getStream() metodin palauttamasta tietovirrasta. Palautettavan tiedoston nimi haetaan metodista TxtStreamAction.getTextFileName(), tiedoston koko metodista TxtStreamAction.getTextFileSize(). Tiedoston mimetyyppi haetaan vastaavasti metodilla TxtStreamAction.getMimeType().
contentDisposition -parametrin määritys attachment kertoo selaimelle, että kyse on liitetiedostosta, jolloin useimmat selaimet kysyvät käyttäjältä, haluaako tämä tallentaa vai avata tiedoston.
Kuten edellisestä esimerkistä huomaamme, struts.xml-tiedostoon voidaan määritellä parametreja syntaksilla ${parametrinNimi}, jotka viittavaavat toimintoluokan (Action) metodiin getParametrinNimi().
TxtStreamAction -luokka on tässä tilanteessa jotakuinkin seuraavan kaltainen:
package com.comiasw.example; import com.opensymphony.xwork2.ActionSupport; import java.io.ByteArrayInputStream; import java.io.InputStream; public class TxtStreamAction extends ActionSupport { private String content="Mallitiedoston sisältö"; public InputStream getStream() { return new ByteArrayInputStream(content.getBytes()); } public String getMimeType(){ return "text/plain"; } public int getTextFileSize(){ return content.getBytes().length; } public String getTextFileName(){ return "mallitiedosto.txt" } }
Ei siis kovin vaikeaa. Vieläkin yksinkertaisemmin asian voi toki tehdä. Tiedostokokoa ei ole pakkomääritellä ja sen voi jättää pois struts.xml-konfiguraatiosta ja mimetyypin ja tiedostonimen voi kirjoittaa suoraan konfiguraatiotiedostoon, jos ei ole vaaraa, että ne muuttuvat. Yksinkertaisimmillaan TxtStreamAction luokassa olisi siis vain metodi getStream().



