[英]how to show a progress bar in the jsp page representing the execution of a java servlet
我遇到了回答这个问题的帖子,但我不知道如何在程序中实现,我的要求如下。
从一个jsp页面,我使用ajax调用来调用一个servlet:
$(document).on('click' , '#gettopevents' , function(event) {
var field = $("input[name = 'field']").val();
if(field === "")
{
$('#responsemsg').html("enter a field");
}
else
{
var dataform = { 'field' : field };
$.ajax({
url : 'GetAllLogs',
type : 'POST' ,
data : dataform ,
success : function(response) {
$('#displaylist').load('listgeneration.jsp');
},
error : function(){
alert("error");
}
});
}
event.preventDefault();
});
servlet的执行是一个严格的过程,需要一些时间。因此,我需要向用户显示有关servlet的执行状态的进度条。 更具体地说,我需要它成为。
@WebServlet("/GetAllLogs")
public class GetAllLogs extends HttpServlet
{
public void doGet(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException
{
PrintWriter obj = response.getWriter();
obj.print(10);
// at this point i need to set the progress bar value to 10%
....
....
obj.print(40);
// at this point i need to change the progress bar value to 40%
.....
.....
obj.print(100);
//at this point i neet to change the progress bar value to 100%
}
}
基本上我需要为servlet中的打印值更新状态栏。这种方法可行吗,我该怎么做。 提前致谢
以下是基本步骤:
*这可能是简单的事情,例如存储在会话中的AtomicInteger
,并随着长时间运行的进程进行工作而更新。 但是,长时间运行的进程可能在其他JVM上,或者提供状态的端点可能在其他JVM上。 在这种情况下,启动长期运行流程的初始调用应提供与该流程关联的唯一令牌。 长时间运行的过程使用令牌作为密钥来更新某些共享存储,例如数据库。 令牌传递到提供状态的端点以查找状态。
编辑以添加其他上下文
ajax调用https://.../api/long/running/process/start
当此ajax调用返回时,它调用另一个方法,该方法开始轮询后端。 (基于另一篇文章 。)
$.ajax({
url : https://.../api/long/running/process/start,
type : 'POST' ,
data : dataform ,
success : function(response) {
pollForLongRunningStatus(response);
},
error : function(){
alert("error");
}
});
}
pollForLongRunningStatus(response) {
$.post('https://.../api/long/running/process/status', function(data) {
alert(data); // update the progress bar
setTimeout(pollForLongRunningStatus, 1000);
});
}
假设起始URL由下面的类处理-此类很重要,它会启动长时间运行的进程并立即返回,因此需要作为asnych任务运行。 (如何操作取决于后端框架(如果有)。)
@WebServlet("/.../api/long/running/process/start")
public class LongRunningProcessStartHandler extends HttpServlet {
public void doGet(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {
AtomicInteger percentComplete = new AtomicInteger(0);
request.getSession().setAttribute("LONG_RUNNING_PROCESS_STATUS", percentComplete);
LongRunningProcess lrp = new LongRunningProcess(percentComplete);
lrp.start();
}
public class LongRunningProcess extends Thread {
private final AtomicInteger percentComplete;
public LongRunningProcess(AtomicInteger percentComplete) {
this.percentComplete = percentComplete;
}
public void run() {
for (int i = 0; i < 100; i++) {
Thread.sleep(1000);
percentComplete.incrementAndGet();
}
}
同时,状态URL仅报告完成百分比。 假设此类处理状态端点:
@WebServlet("/.../api/long/running/process/status")
public class LongRunningProcessStatusHandler extends HttpServlet {
public void doGet(HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {
return request.getSession().getAttribute("LONG_RUNNING_PROCESS_STATUS").get();
}
那是一般的想法。 (上面的代码将无法编译,因此需要将其设置为null安全。)当值达到100时,请从会话中删除该对象以保持会话整洁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.