[英]How to set progress bar value using jsp
我正在尝试制作一个servlet,以在线下载文件。 为此,我在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代码变得冗长,因为它将为每个字节打印一个脚本代码。
我应该怎么做才能防止这种情况?
感谢帮助
嗨,首先,我认为您应该将进程存储在会话中。 然后,使用ajax调用,您可以使用从某些servlet下方收到的响应来定期更新进度栏。 添加映射,然后我只写doGet东西。此外,我还假定该特定servlet的URL映射为'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()方法并添加逻辑以增加进度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.