首先说流程:
1.访问启动任务servlet
2.启动任务servlet开启任务,并跳转掉进度条展示页面
3.页面就绪就调用(进度参数获取servlet),此后进度条展示页面定时调用,直到传递过来为100%.
4.获取参数servlet从session中取出任务,并获取任务中的进度参数.返回进度参数给进度展示页面.
一下是各个文件代码,工程为web工程。
1.进度条schedule.css文件:
body {
margin:0;
padding:0;
font-family:"宋体";
font-size:12px;
line-height:1.8em;
color:#392b60;
height:100%;
}
/*最外层的div样式*/
.progressOutside {
border:red 1px dotted; /*边框1像素的红色虚线*/
width:350px; /*宽度是350像素*/
position:relative; /*相对body位置*/
margin-left:-175px; /*整个div宽度是350,-175px就是向右移动了175像素.正好居中.*/
left:50%; /*左边框距浏览器左边框是屏幕的一半.*/
margin-top:150px; /*上边框相对于body顶部35%*/
}
/*标题div样式*/
.progressTitle {
border:greenyellow 1px solid;
line-height:30px; /*设置行高
padding:0 15px 0; /*内填充 上:0, 右:15像素, 下:0*/
}
/*内容div样式*/
.progressContent {
border:purple 1px double;
padding:15px;
height:40px !important;
}
/*进度条框*/
.progress {
background:#f0f4f9 url(../imgs/2.gif) repeat-x top;
border:yellow 2px solid;
height:15px;
margin:10px 0 0 0 !important; margin:35px 0 0 0;
}
/*进度条实体*/
.progressSchedule {
border:red 1px double;
background:url(../imgs/1.gif) repeat-x left top;
width:3%;
height:15px;
}
/*进度提示框*/
.progressPercent {
text-align:center;
border:green 1px solid;
height:15px;
position:absolute;
display:block;
left:125px;
margin-top:-17px;
width:100px;
}
/*百分比提示框*/
.textProgress {
border:orange 1px solid;
font-weight:bold;
font-family:tohama;
}
2.页面文件invoke.jsp 用到了jquery.
<html>
<head>
<link href="<%=basePath%>css/schedule.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="<%=basePath %>js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="<%=basePath %>js/get.js"></script>
<title>Insert title here</title>
</head>
<body>
<div class="progressOutside">
<div class="boxTitle progressTitle" id="divName">进度条标题在此</div>
<div class="boxContent progressContent">
<div class="progress" id = "progress">
<div class="progressSchedule" style="width:0%" id="styleId"></div>
<div class="progressPercent">
完成<span class="textProgress" id="bfb"></span>
</div>
</div>
</div>
</div>
</body>
</html>
3.用到的ajax get.js文件
$(document).ready(function(){
getPercent();
});
function getPercent(){
$.post("process",{userName:'ab'},function(data){
styleId.style.width=data;
$("#bfb").text(data);
if(data!='100%'){
window.setTimeout(getPercent,100);
}else{
if(confirm("Finished?")){
window.location.href="/servlet1/index.html";
}
}
});
}
4.启动线程servlet Index.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Progress p = (Progress) request.getSession().getAttribute("progress");
if(p!=null){
System.out.println("Thread Running!");
throw new RuntimeException("线程被占用!");
}else{
Progress progress = new Progress();
request.getSession().setAttribute("progress", progress);
progress.start();
}
response.sendRedirect(request.getContextPath()+"/invoke.jsp");
}
5.线程任务类-->要做的任务写在这个里面Progress.java
public class Progress extends Thread{
Logger logger = Logger.getLogger(Process.class);
//Getter方法省略
private String percent = "";
//Getter方法省略
private boolean over = false;
public void run(){
for(int i=1;i<=100;i++){
try {
Thread.sleep(1*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
percent = i+"%";
}
if(logger.isDebugEnabled()){
logger.debug("thread run over!");
}
over = true;
}
}
6.取参数servlet-->此servlet是要被页面定时的调用,Process.java
被调用时,会取出当前任务线程,获取当前任务线程中的进度参数,同时将进度参数传到页面.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Progress p = (Progress) request.getSession().getAttribute("progress");
if (p!=null) {
String percent = p.getPercent();
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(percent);
}
if(p.isOver()){
request.getSession().removeAttribute("progress");
}
}