NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
balaz.marek94:29.8.2015 17:24

Zdravím, mám webovú aplikáciu napísanú v Jave, ktorá využíva technológiu JSF. Mám metódu download() v ktorej sa vykoná pár ďalších metód:

nazovSuboru = dajNazov();
urlSuboru = hladajUrl();
this.setVystupnyText("Downloading file!");
stiahniSubor();

Po kliknutí na tlačítko "Download" sa mi spustí moja metóda. Príkaz this.setVystup­nyText("..."); má prepísať objekt z JSF knižnice, presnejšie outputText. Ako som pochopil postupnosti webových aplikácií písaných v jave, najskôr sa skontrolujú objekty (v mojom prípade kliknutie na tlačítko "Download"), potom sa spustí logika (moja metóda download()), až na koniec sa vykonajú zmeny na stránke (prepíše sa môj outputText). Teraz ku problému. Pri metóde stiahniSubor() mi začne sťahovať súbor (web aplikácia stále beží, ako by sa funkcia už vykonala). Súbor mi stiahne bez problémov ale neprepíše mi môj outputText. Vedel by mi niekto poradiť? :)

 
Odpovědět
29.8.2015 17:24
Avatar
vita
Tvůrce
Avatar
Odpovídá na balaz.marek94
vita:29.8.2015 18:59

Ahoj, přilož delší část kódu (nejlépe třídu). Z tak krátkého úryvku těžko říct.

 
Nahoru Odpovědět
29.8.2015 18:59
Avatar
Odpovídá na vita
balaz.marek94:29.8.2015 19:52

V poriadku, avšak atribúty nastavím na "pevno" akými si hodnotami, pretože tie prvé metódy v metóde download() zaberajú veľa riadkov kódu a obsahujú "len" switche, ktoré return-u nejakú hodnotu.

package webstranka;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

@ManagedBean
@RequestScoped
public class Webstranka {

    private String urlStranky, urlSuboru, vystupnyText, nazovSuboru;
    private boolean obchodnePodmienky;

    public void download() {
        try {
            if (obchodnePodmienky) {
                nazovSuboru = "mojevideo.mp4";
                urlSuboru = "http://scontent-vie1-1.cdninstagram.com/hphotos-xaf1/t50.2886-16/11833209_1683434681890032_729142012_n.mp4"; //adresa lubovolneho videa
                this.setVystupnyText("Downloading file!");
                downloadFile();
            } else {
                this.setVystupnyText("Download error! Your must accept private policy!");
            }
        } catch (java.io.IOException e) {
            this.setVystupnyText("Download error! IO");
        } catch (Exception e) {
            this.setVystupnyText("Download error!");
        }
    }

    public void downloadFile() throws java.io.IOException {
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        response.setContentType("video/mp4");
        response.setHeader("Content-Disposition", "attachment;filename=" + nazovSuboru);
        javax.servlet.ServletOutputStream out;
        java.net.URL u = new java.net.URL(urlSuboru);
        java.io.InputStream is = u.openStream();
        java.net.HttpURLConnection huc = (java.net.HttpURLConnection)u.openConnection();
        response.setContentLength((int) huc.getContentLength());
        byte[] buffer = new byte[1024];
        out = response.getOutputStream();
        int i = 0;
        while ((i = is.read(buffer)) != -1) {
            out.write(buffer, 0 , i);
            out.flush();
        }
        FacesContext.getCurrentInstance().getResponseComplete();
    }

    public String getVystupnyText() {
        return vystupnyText;
    }
    public void setVystupnyText(String vystupnyText) {
        this.vystupnyText = vystupnyText;
    }
    public boolean isObchodnePodmienky() {
        return obchodnePodmienky;
    }
    public void setObchodnePodmienky(boolean obchodnePodmienky) {
        this.obchodnePodmienky = obchodnePodmienky;
    }
}

Takže takto vyzerá orezane moja trieda :)

 
Nahoru Odpovědět
29.8.2015 19:52
Avatar
vita
Tvůrce
Avatar
Odpovídá na balaz.marek94
vita:29.8.2015 20:52

Zkusil jsem si projít tvoji třídu a nevidím v ní problém.
Pokud je proměnná obchodnePodmienky = true začne se vykonávat blok a také se zavolá this.setVystup­nyText(...) (hodnota proměnné vystupnyText se změní na "Downloading file!") a po ní následuje metoda downloadFile().

Pokud jsi nezkoušel debuggovat, tak si dej breakpoint do bloku if před volání this.setVystup­nyText(...) a jdi krok po kroku. Víc ti asi nepomůžu.

 
Nahoru Odpovědět
29.8.2015 20:52
Avatar
Odpovídá na vita
jaroslav.horalek:11.9.2015 23:59

Ahoj, problém je prostý. Response si nastavil na download file. Response už nevyrenderuje do stránky nic. Viz. http://iswwwup.com/…message.html

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
11.9.2015 23:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.