16 Kasım 2012 Cuma

Wicket ve Dosya İndirme

IResourceHandler - İndirilecek olan kaynağı akım olarak gönderir
Bu arayüzü gerçekleştiren sınıf ResourceStreamRequestHandler sınıfı. Bu sınıf IResourceStream kaynağını okur ve servlet'in çıktısı olarak gönderir.
//ResourceStreamRequestHandler aşağıdakine benzer bir iş yapar
ServletOutputStream servletOutputStreamObj = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"" + strFileName + ".xls\"");
Eğer indirilen dosya browser içinde gösterilsin istiyorsa aşağıdaki gibi yapabiliriz.
response.setHeader("Content-Disposition","inline");
ResourceStreamRequestHandler Kullanımı
ResourceStreamRequestHandler sınıfıBir komponent'in onClick() metoduna aşağıdaki gibi bir kod yazılabilir.

ResourceStreamRequestHandler mergedFileHandler = new ResourceStreamRequestHandler(new FileResourceStream(mergedFiles));
mergedFileHandler.setFileName(mergedFiles.getName());
getRequestCycle().scheduleRequestHandlerAfterCurrent(mergedFileHandler);
Bu tür detaylarla uğraşmak yerine bunları bizim için yapan ResourceLink veya DownloadLink yöntemlerinden birisi kullanılabilir.

ResourceLink - Sabit veya Dinamik Kaynakların Alınabilmesi
ResouceStreamResource sınıfı IResource kaynağının dinamik olarak alınabilmesine imkan sağlar.
ResourceLink (new ResourceStreamResource(new AbstractResourceStreamWriter())); 

 DownloadLink - Sabit Kaynakların Alınabilmesi
Eğer bir dosya indirilecekse DownloadLink kullanılabilir. Örnek:
add(new DownloadLink("download", new AbstractReadOnlyModel<File>() {
            @Override
            public File getObject() {
                File tempFile;
                try {
                    tempFile = //Create file;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
                return tempFile;
            }
        }).setDeleteAfterDownload(true);
Bu örnekte DownloadLink kendi içinde IResourceStream sınıfından türeyen FileResourceStream sınıfını kullanıyor.

Link
Bir Link sınıfının onClick metodunda
 getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);

kodu çalıştırılarak indirme işlemi başlatılabilir.


IResourceStream (İndirilecek kaynağı akım haline getirir)
Wicket ile dosya indirmek için aşağıdaki sınıf yapısı temel alınabilir.


Aşağıda ise kendi ResourceStreamWriter sınıfımızı yazmak istersek kullanabileceğimiz hiyerarşi bulunuyor.


IResource
Wicket ByteArrayResource only downloadable: can I let the browser handle the MIME type?
başlıklı soruda IResource'tan türeyen ByteArrayResource ile ilgili bir soru var.İlgili hiyerarşi aşağıda.
Eğer Resource dinamik olarak üretilen bir kaynaksa ResourceStreamResource sınıfı kullanılır.

IRequestCycle
IRequestCycle arayüzünü gerçekleştiren sınıf RequestCyle sınıfı. Bu sınıfın setResponsePage metodunun iki farklı çeşidi var. İlki bir Class alıyor, diğeri ise bir IRequestablePage instance'ı alıyor. Aralarındaki fark burada açıklanıyor. İlk metod 302 tarayıcıya redirect komutu gönderiyor.

RequestCycle in Wicket 1.5 sayfasında açıklandığı gibi dosya indirme işleminin gerçekleşmesini sağlayan  RequestCycle sınıfı. Bu sınıf ile gösterilecek bir sonraki sayfayı veya gösterme işlemi bittikten sonra indirilecek dosyayı belirtiyoruz. Örneğin gösterilecek bir sonraki sayfa için
setResponsePage(getApplication().getHomePage());
veya

add(new Link<Void>("link-login") {
  @Override
  public void onClick() {
    setResponsePage(LoginPage.class);
  }
});
metodunu çalıştırsak bile aslında altta aşağıdaki kod çalışır.
How to server-side forward a page request with Wicket 6 sorusunda ise konuyla ilgili açıklama var.


Bookmarkable vs non-bookmarkable pages
Page navigation within the controller başlıklı yazıda anlatıldığı gibi eğer bookmarkable bir sayfa göstermek istersek aşağıdaki gibi yaparız.
Eğer non-bookmarkable bir sayfa göstermek istersek aşağıdaki gibi yaparız.

Hiç yorum yok:

Yorum Gönder