Não é muito problemático realizar a exibição da barra de progresso sem a atualização da página da web, mas se a barra de progresso puder refletir com precisão a transação atual ou o progresso da execução de lógica complexa, então não é uma tarefa fácil. Tecnologia AJAX Popular, então o autor deste artigo tenta usar AJAX para realizar a barra de progresso precisa da página da web para atrair leitores.
Em primeiro lugar, você deve pensar em um problema. Se transações complexas ou lógica de negócios não forem executadas de maneira encadeada, será impossível ignorar as transações complexas para processar a exibição do progresso ao executar em JAVA. pensar em usar multi-threading para transações complexas ou realização de lógica de negócios.
Pensando em outra questão, o processamento de transações deve exigir uma série de informações de parâmetros na página web, então como obter esses parâmetros parece fácil de pensar, basta passar um HttpServletRequest.
Para compartilhar a barra de progresso, todo processamento de transações complexas deve implementar a mesma interface ou classe abstrata que usei aqui, como segue:
interface pública IprogressBar {
public void execute(HttpServletRequest req,String pbid);//Executa transações complexas
}
Use uma classe abstrata para implementar multithreading, como segue:
classe abstrata pública AbstractProgressBar estende TimerTask implementa IprogressBar {
solicitação HttpServletRequest privada;
String privada pbid;
public AbstractProgressBar(){
}
//As subclasses devem substituir esta função
public abstract void execute(HttpServletRequest req, String pbid);
execução nula pública() {
execute(solicitação,pbid);
}
public void setRequest(HttpServletRequest req){
this.request=req;
}
public void setPbid(String pbid){
this.pbid=pbid;
}
}
É inconveniente fornecer o código para o projeto específico. Aqui escrevi outra classe de teste, que é uma classe que executa processamento de transações complexas, como segue:
classe pública TestPB estende AbstractProgressBar{
public void execute(HttpServletRequest req, String pbid) {
String sql="inserir em temp_table(idx)values(?)";
int pid=Integer.parseInt(pbid);
ProgressBarpb=new ProgressBar(pid,300,0,1);
//Simula grandes transações
for(int i=0;i<300;i++){
DbUtils.executeUpdate(sql,novo Objeto[]{novo Inteiro(i)});
//Controla o progresso
pb.stepIt();
}
}
}
Em seguida, use a tecnologia AJAX para realizar a barra de progresso sem atualização da página da web.
<%@ page contentType="text/html;charset=UTF-8"%>
<title>Sem teste da barra de progresso da página de atualização</title>
<TIPO DE ESTILO="texto/css">
<!--
BODY {OVERFLOW:rolar;OVERFLOW-X:oculto}
.DEK {POSIÇÃO:absoluta;VISIBILIDADE:oculto;Z-INDEX:200;}
//-->
</STYLE>
<script type="texto/javascript">
var xmlHttp;
var pbid; //ID da barra de progresso
função createXMLHttpRequest(){
if (janela.ActiveXObject) {
xmlHttp = novo ActiveXObject("Microsoft.XMLHTTP");
}
senão if (window.XMLHttpRequest) {
xmlHttp = novo XMLHttpRequest();
}
}
função verificaçãoDiv() {
var progress_bar = document.getElementById("progressBar");
if (progress_bar.style.visibility != "visível") {
progress_bar.style.visibility = "visível";
}outro
{
progress_bar.style.visibility = "oculto";
}
}
função ir() {
createXMLHttpRequest();
verificarDiv();
var url = "../servlet/ProgressBarServlet?task=create&impcls=blogcn.pb.imp.TestPB";//onde blogcn.pb.imp.TestPB é a classe de implementação de transações complexas
botão var = document.getElementById("ir");
botão.disabled = verdadeiro;
xmlHttp.open("OBTER", url, verdadeiro);
xmlHttp.setRequestHeader("Tipo de conteúdo", "text/xml;charset=gb2312");
xmlHttp.onreadystatechange=goCallback;
xmlHttp.send(nulo);
}
função goCallback(){
se (xmlHttp.readyState==4)
{
if (xmlHttp.status==200) {
pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data;
setTimeout("pollServer()", 2000);
}
}
}
function pollServer() {
createXMLHttpRequest();
var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid;
xmlHttp.open("OBTER", url, verdadeiro);
xmlHttp.onreadystatechange = pollCallback;
xmlHttp.send(nulo);
}
função pollCallback(){
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var porcentagem_completa =
xmlHttp.responseXML
.getElementsByTagName("porcentagem")[0].firstChild.data;
if (porcentagem_completa <100) {
PB1.pos=porcentagem_completa;
PB1.Atualização();
setTimeout("pollServer()", 2000);
} outro {
PB1.pos=100;
PB1.Atualização();
document.getElementById("go").disabled = false;
}
}
}
}
<input type="button" value="Executar transações grandes" id="go" onclick="go();"/>
<DIV id="progressBar">
<linguagem script="javascript">
var PB1=new TProgressBar("meuPB1",220.180.375,20);
PB1.Criar();
Contagem de Piratas=100;
PID=Contagem de piratas-2;
PB1.Reposição();
PB1.max=PID;