<?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"
	>

<channel>
	<title>TIGRA BLOG</title>
	<atom:link href="http://www.tigra.cz/blog/index.php?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.tigra.cz/blog</link>
	<description>Nechte to na nás..</description>
	<pubDate>Wed, 28 May 2008 10:19:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Apache Wicket - stahování z aplikace</title>
		<link>http://www.tigra.cz/blog/?p=6</link>
		<comments>http://www.tigra.cz/blog/?p=6#comments</comments>
		<pubDate>Thu, 15 May 2008 09:45:47 +0000</pubDate>
		<dc:creator>vlasta</dc:creator>
		
		<category><![CDATA[Apache Wicket]]></category>

		<category><![CDATA[ajax]]></category>

		<category><![CDATA[button]]></category>

		<category><![CDATA[download]]></category>

		<category><![CDATA[link]]></category>

		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.tigra.cz/blog/?p=6</guid>
		<description><![CDATA[Dalo to chvilku zabrat, ale první blog post je na světě. Dnes to bude o stahování souborů pomocí Apache Wicket. Rozeberu tu 3 možnosti jak na to.
]]></description>
			<content:encoded><![CDATA[<p>Dalo to chvilku zabrat, ale první blog post je na světě. Dnes to bude o stahování souborů pomocí <a href="http://wicket.apache.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/wicket.apache.org');" target="_self">Apache Wicket</a>. Rozeberu tu 3 možnosti jak na to.<br />
</p>
<p style="text-align: left;"><strong></strong><br />
<strong>Pomocí Linku</strong></p>
<p>Wicket poskytuje již hotovou třídu wicket.markup.html.link.DownloadLink. Jako parametr se jí pošle java.io.File a o zbytek se postará Wicket.</p>
<p><em>Java:</em></p>
<pre name="code" class="java">
// stahovani pomoci linku
form.add(new DownloadLink(&quot;downloadLink&quot;, createExampleFile()));
</pre>
<p><em>HTML:</em></p>
<pre name="code" class="html">
&lt;a href=&quot;#&quot; wicket:id=&quot;downloadLink&quot;&gt;Stažení souboru&lt;/a&gt;
</pre>
<p><strong>Pomocí Buttonu</strong></p>
<p>V metodě onSubmit tlačítka připravíme soubor pro stažení, vytvoříme ResourceStream pro tento soubor a dále upravíme RequestTarget v RequestCycle tak, aby ukazovala na naší ResourceStream.</p>
<p><em>Java:</em></p>
<pre name="code" class="java">

// stahovani pomoci Buttonu
Button downloadButton = new Button(&quot;downloadButton&quot;){

    @Override
    public void onSubmit() {
        File downloadFile = createExampleFile();
        FileResourceStream fileStream = new
                    FileResourceStream(downloadFile); 

        getRequestCycle().setRequestTarget(
                    new ResourceStreamRequestTarget(fileStream));
    }
};

form.add(downloadButton);
</pre>
<p><em>HTML:</em></p>
<pre name="code" class="html">

&lt;input type=&quot;submit&quot; wicket:id=&quot;downloadButton&quot; value=&quot;Stažení souboru&quot; /&gt;
</pre>
<p>
<strong>Pomocí AjaxButtonu</strong></p>
<p>V metodě onSubmit tlačítka připravíme soubor pro stažení, načteme ho do bufferu pomocí InputStream. Vytvoříme DynamicWebResource, která je wrapper okolo našeho souboru (obsahuje informace o názvu souboru, content typu a datech souboru). Tuto DynamicWebResource musíme zaregistrovat do SharedResources a získat odkaz na ní (WicketUtils je knihovní třída - její kód je zobrazen níže). Poslední krok je do RequestTargetu přidat Javascript, který nám otevře nové okno, s odkazem na naší DynamicWebResource. Tím se provede stažení a nově otevřené okno zmizí.</p>
<p><em>Java:</em></p>
<pre name="code" class="java">

// stahovani pomoci AjaxButtonu
AjaxButton downloadAjaxButton = new AjaxButton(&quot;downloadAjaxButton&quot;) {

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form form) {
        try{
            File downloadFile = createExampleFile();
            FileInputStream input = new
            FileInputStream(downloadFile);

            final byte[] buffer = new byte[1024];
            input.read(buffer);

            DynamicWebResource resource = new
                DynamicWebResource(&quot;exampleFile.txt&quot;) {

                @Override
                protected ResourceState getResourceState() {
                    return new ResourceState() {

                        @Override
                        public String getContentType() {
                            return &quot;text/plain&quot;;
                        }

                        @Override
                        public byte[] getData() {
                            return buffer;
                        }
                    };
                }
            };

            String url = WicketUtils.getUrlForResource(
                                            getApplication(),
                                            getRequestCycle(),
                                            resource);

            // pridani JavaScriptu do AJAX response, ktery otevre
            // popup okno s downloadem
            target.appendJavascript(&quot;window.open(\&quot;&quot; +
                                    url + &quot;\&quot;, \&quot;stahovani\&quot;,&quot; +
                                    &quot;\&quot;width=100,height=100\&quot;);&quot;);
        } catch(Exception e){
            throw new RuntimeException(e);
        }
    }
};

form.add(downloadAjaxButton);
</pre>
<p><em>HTML:</em></p>
<pre name="code" class="html">
&lt;input type=&quot;submit&quot; wicket:id=&quot;downloadAjaxButton&quot; value=&quot;Stažení souboru (AJAX)&quot; /&gt;
</pre>
<p><strong>WicketUtils.java</strong></p>
<pre name="code" class="java">

package cz.tigra.examples.downloads.utils;

import org.apache.wicket.Application;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.Resource;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.SharedResources;

public class WicketUtils {

    private static final String RESOURCE_NAME = &quot;download&quot;;

    /**
     *
     * Pomocna metoda. Vraci url pro Resource
     *
     * @param app pouziva se jako scope a k ziskani objektu SharedResources
     * @param reqCycle k ziskani url
     * @param targetResource dany zdroj ktery bude ResourceReference vracet
     * @return url pro danou reference
     */
    public static String getUrlForResource(
              final Application app,
              final RequestCycle reqCycle,
              final Resource targetResource) {

        SharedResources sharedRes = app.getSharedResources();

        String resKey = sharedRes.resourceKey(app.getClass(),
                                        RESOURCE_NAME, null, null);
        sharedRes.remove(resKey);

        ResourceReference fileReference =
                    new ResourceReference(app.getClass(), RESOURCE_NAME) {
            @Override
            protected Resource newResource() {
                return targetResource;
            }
        };

        return reqCycle.urlFor(fileReference).toString();
    }
}
</pre>
<p>Doufám, že vám to ušetří pár chvil s Googlem.</p>
<p><em>Vlastimil Dolejš</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigra.cz/blog/?feed=rss2&amp;p=6</wfw:commentRss>
		</item>
	</channel>
</rss>

