繁体   English   中英

如何使用JSP设置进度栏值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM