2014-01-08 79 views
0

好吧,我有一個JSP,一個Servlet和一個Action類。 JSP有一個「下載」按鈕,點擊後可以調用2個函數 - 「build()」和「download()」。 「build()」函數執行一個動作。該操作在服務器上創建並構建文件。 「download()」用於使用servlet從服務器獲取文件,以便用戶可以下載它。JSP - 如何在Action完成執行後才調用Servlet?

Action.java 
    ----------- 
    buildFile() { 
    //build file/writes in the file 
    } 

    Servlet.java 
    ----------- 
    doget(){ 
    //gets the file from the server 
    } 

    JSP 
    --- 
    <script type="text/javascript"> 
    function build() { 
    //calls buildFile(); 
    //form.submit(); 
} 

function download() { 
window.open('/Servlet'); 
} 
</script> 

<input type="button" class="button" value="Download" onclick="build();download();"/> 

現在的問題是,無論何時點擊「下載」,下載()在build()後立即被調用。因此,如果文件的數據較少,則構建過程完成,用戶可以下載該文件。但是,如果正在寫入文件的數據很大,則在「build()」後用戶仍然會調用download(),並且用戶僅在其下載的文件中獲取部分數據(導致文件仍在場景後面)。我想做一些讓download()等待Action(buildFile())完成執行的東西。另外,如果沒有form.submit(),則由於某種原因不會調用該操作。這就是爲什麼我不能使用「document.ready」或「window.onLoad」。所以請提出其他建議。我也試過這個:

function build() { 
     //calls buildFile(); 
     //form.submit(); 
download(); 
    } 

    function download() { 
    window.open('/Servlet'); 
    } 
<input type="button" class="button" value="Download" onclick="build();"/> 

但它不起作用。

回答

0

我找到了解決方案。我只是調用build(),然後在action類的構建方法結束時,我調用servlet中的doget()方法。

Action.java 
    ----------- 
    buildFile() { 
    //build file/writes in the file 
     Servlet servlet = new Servlet(); 
     servlet.doget(); 
    } 

    Servlet.java 
    ----------- 
    doget(){ 
    //gets the file from the server 
    } 

<input type="button" class="button" value="Download" onclick="build();"/> 

這會生成我的文件,無論需要多長時間,然後彈出下載框給用戶。

+0

這與僅僅在一個servlet中執行所有操作並沒有什麼不同,這更直接。 – developerwjk

-1

你的按鈕就是這麼說的。您希望用戶按下載按鈕並獲取文件。但是在獲取文件之前,必須先構建文件。

這告訴你,你需要做兩件事;建立,然後下載。

onclick="buildAndDownload();" 

function buildAndDownload(){ 
    // build file 
    // start the download 
} 

你甚至可以將這兩個動作的邏輯分成兩個獨立的方法。

如果文件已準備好,您需要的下載功能是查詢服務器的一種方法。

function download(){ 
    while(! fileIsReady()){ 
      Thread.sleep(500); 
     } 
     // Start the download 
} 

當然,如果你知道該文件總是準備好後x毫秒的下載,並且不希望建立更多的服務器端功能,你可以稱之爲「了Thread.sleep(1500);」等待1.5秒後再開始下載。

0

不是直接調用兩個JavaScript方法build()和download(),而是直接使用HTML表單提交給一個構建和下載文件的servlet。

<form action='/Servlet' method='post' target='_blank'> 
    <input type='hidden' name='param_needed_to_build_file' value='something' /> 
    <input type="submit" class="button" value="Download" /> 
</form> 

target ='_ blank'使它打開一個新窗口。如果你願意,你也可以使用method ='get'。如果需要,您還可以使用javascript將servlet彈出到另一個窗口中,但構建和下載都應該在servlet中。

在你的servlet中,實現doGet和/或doPost方法來調用Java函數build()和download(),這兩個函數都將在你的servlet中。或者你可以把build()方法放在servlet中引用和使用的另一個類中。實際上,通常的做法是構建文件並將其直接寫入響應對象,而不是直接寫入文件系統,然後再讀取(除非由於某種原因,以後要保存該文件)。

+0

謝謝。我意識到這個解決方案,但有沒有辦法解決這個問題,而不要求Servlet構建文件? – user1291453

+0

會有什麼意義?您仍然需要等待以任何方式構建文件。除非您向一個servlet發送Ajax請求來構建文件,否則請等待響應,然後編寫指向下一個檢索文件的servlet的鏈接。 – developerwjk

+0

謝謝,這很有幫助! – user1291453

相關問題