2015-04-06 27 views
1

我想讓一個servlet在線下載文件。爲此,我在jsp中創建了一個進度條元素。如何使用jsp設置進度條值

<progress id="p1" max="100" value="0"><span>0</span>%</progress> 

和Java腳本代碼更新進度值:

function setProgress(value) 
{ 
var progressBar = document.getElementById("p1"); 
progressBar.value = value; 
progressBar.getElementsByTagName('span')[0].textContent = value; 
} 

現在,在servlet代碼來改變進度:

InputStream is = ..........; 
byte[] bytes = new byte[size*1024]; 
int read = in.read(); 
for(int j=0;read!=-1;j++) 
{ 
    bytes[j] = (byte)read; 
    setProgress((int)getProgressDownload(bytes.length)); 
    read = in.read(); 
} 

public float getProgressDownload(int dsize) 
{ 
    return ((float)dsize/tsize)*100;//tsize is total file's size; 
} 
public void setProgress(int value) 
{ 
    try 
    { 
     response.getWriter().write("<script>"); 
     response.getWriter().write("setProgress(\"p1\","+value+");"); 
     response.getWriter().write("</script>"); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

現在的問題是品牌HTML代碼冗長,因爲每個字節都會打印一個腳本代碼。

我應該怎麼做才能防止這種情況?

感謝您的幫助

+1

更好地使用基於AJAX的方法來完成此任務。 – 2015-04-06 10:55:18

+0

我該怎麼做?你能解釋我嗎? – 2015-04-07 07:36:03

+0

@ParkashKumar是正確的..使用相同的AJAX .. – 2015-04-07 11:10:30

回答

1

嗨首先我覺得你應該存儲在會話過程中。然後使用ajax調用,您可以使用從某個servlet下面收到的響應定期更新進度欄。添加映射和所有我剛寫的doGet東西.. 我也假設URL映射爲這個特別的servlet的progressServlet'.. 下面是doGet方法

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String downloadId = "longProcess_" + request.getParameter("downloadId"); 
     LongProcess longProcess = (LongProcess) request.getSession().getAttribute(downloadId); 
     int progress = longProcess.getProgress(); 

     response.setContentType("application/json"); 
     response.setCharacterEncoding("UTF-8"); 
     response.getWriter().write(String.valueOf(progress)); 
    } 

然後在JS,你可以使用的setTimeout ()/ setInterval()以特定的時間間隔調用checkProgress方法,並在收到的進度完成100%時停止調用。您可以使用它來重複觸發Ajax請求以請求進度的當前狀態。

var refreshprogessbar = setInterval(checkProgress, 10000);// 10 seconds 
function checkProgress() {/*pass the actual id instead of 12345*/ 
    $.getJSON('progressServlet?downloadId=12345', function(progress) { 
     if(progress == 100){clearInterval(refreshprogessbar);} 
     setProgress(progress); 
    }); 
} 

LongProcess基本上是您用來跟蹤正在進行的過程的類。下面是這樣一個的例子:

class LongProcess extends Thread { 
    private int progress; 
    public void run() { 
     while (progress < 100) { 
      try { sleep(1000); } catch (InterruptedException ignore) {} 
      progress++; 
     } 
    }  
    public int getProgress() { 
     return progress; 
    } 
} 

我只是遞增的進展提交的成員,但你可以有一個setProgress()方法,並添加邏輯來提高進度。

+0

先生,我無法理解你提到的** LongProcess **類。它是什麼?我可以將** MyServlet **(其中下載正在線程中處理)連接到** progressServlet **,以便它可以獲取進度的值?謝謝你的解釋。 – 2015-04-09 09:24:11

+0

@Rajnishkumar我已編輯答案..檢查並讓我知道..如果它的幫助,請接受答案.. – 2015-04-09 10:30:53