Inhaltsverzeichnis
JSP进度条
Heim Datenbank MySQL-Tutorial JSP编程进度条设计实例_MySQL

JSP编程进度条设计实例_MySQL

Jun 01, 2016 pm 02:11 PM
jsp 任务 实例 执行 线程 编程 设计 Zeitplan 页面

  
许多Web应用、企业应用涉及到长时间的操作,例如复杂的数据库查询或繁重的XML处理等,虽然这些任务主要由数据库系统或中间件完成,但任务执行的结果仍旧要借助JSP才能发送给用户。本文介绍了一种通过改进前端表现层来改善用户感觉、减轻服务器负载的办法。 当JSP调用一个必须长时间运行的操作,且该操作的结果不能(在服务器端)缓冲,用户每次请求该页面时都必须长时间等待。很多时候,用户会失去耐心,接着尝试点击浏览器的刷新按钮,最终失望地离开。 本文介绍的技术是把繁重的计算任务分离开来,由一个独立的线程运行,从而解决上述问题。当用户调用JSP页面时,JSP页面会立即返回,并提示用户任务已经启动且正在执行;JSP页面自动刷新自己,报告在独立线程中运行的繁重计算任务的当前进度,直至任务完成。
一、模拟任务
  首先我们设计一个TaskBean类,它实现java.lang.Runnable接口,其run()方法在一个由JSP页面(start.jsp)启动的独立线程中运行。终止run()方法执行由另一个JSP页面stop.jsp负责。TaskBean类还实现了java.io.Serializable接口,这样JSP页面就可以将它作为JavaBean调用:
  package test.barBean;
import java.io.Serializable;
  public class TaskBean implements Runnable, Serializable {
    private int counter;
    private int sum;
    private boolean started;
    private boolean running;
    private int sleep;
      public TaskBean() {
        counter = 0;
        sum     = 0;
        started = false;
        running = false;
        sleep   = 100;
    }
}
  TaskBean包含的“繁重任务”是计算1+2+3…+100的值,不过它不通过100*(100+1)/2=5050公式计算,而是由run()方法调用work()方法100次完成计算。work()方法的代码如下所示,其中调用Thread.sleep()是为了确保任务总耗时约10秒。
  protected void work() {
    try {
        Thread.sleep(sleep);
        counter++;
        sum += counter;
    } catch (InterruptedException e) {
        setRunning(false);
    }
}
 
status.jsp页面通过调用下面的getPercent()方法获得任务的完成状况:
  public synchronized int getPercent() {
    return counter;
} 如果任务已经启动,isStarted()方法将返回true:
public synchronized boolean isStarted() {
    return started;
}
 
  如果任务已经完成,isCompleted()方法将返回true:
  public synchronized boolean isCompleted() {
    return counter == 100;
}
 
  如果任务正在运行,isRunning()方法将返回true:
  public synchronized boolean isRunning() {
    return running;
}
 
SetRunning()方法由start.jsp或stop.jsp调用,当running参数是true时。SetRunning()方法还要将任务标记为“已经启动”。调用setRunning(false)表示要求run()方法停止执行。
  public synchronized void setRunning(boolean running) {
    this.running = running;
    if (running)
        started  = true;
}
 
任务执行完毕后,调用getResult()方法返回计算结果;如果任务尚未执行完毕,它返回null:
  public synchronized Object getResult() {
    if (isCompleted())
        return new Integer(sum);
    else
        return null;
}
 
当running标记为true、completed标记为false时,run()方法调用work()。在实际应用中,run()方法也许要执行复杂的SQL查询、解析大型XML文档,或者调用消耗大量CPU时间的EJB方法。注意“繁重的任务”可能要在远程服务器上执行。报告结果的JSP页面有两种选择:或者等待任务结束,或者使用一个进度条。
  public void run() {
    try {
        setRunning(true);
        while (isRunning() && !isCompleted())
            work();
    } finally {
        setRunning(false);
    }
} 二、启动任务

  start.jsp是web.xml部署描述符中声明的欢迎页面,web.xml的内容是:
 
  br>    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
 
   
        start.jsp
   


  start.jsp启动一个专用的线程来运行“繁重的任务”,然后把HTTP请求传递给status.jsp。
  start.jsp页面利用标记创建一个TaskBean的实例,将scope属性定义为session使得对于来自同一浏览器的HTTP请求,其他页面也能提取到同一个Bean对象。start.jsp通过调用session.removeAttribute("task")确保创建了一个新的Bean对象,而不是提取一个旧对象(例如,同一个用户会话中更早的JSP页面所创建的Bean对象)。
  下面是start.jsp页面的代码清单:
 
      class="test.barBean.TaskBean"/>
 


 
start.jsp创建并设置好TaskBean对象之后,接着创建一个Thread,并将Bean对象作为一个Runnable实例传入。调用start()方法时新创建的线程将执行TaskBean对象的run()方法。
  现在有两个线程在并发执行:执行JSP页面的线程(称之为“JSP线程”),由JSP页面创建的线程(称之为“任务线程”)。接下来,start.jsp利用调用status.jsp,status.jsp显示出进度条以及任务的执行情况。注意status.jsp和start.jsp在同一个JSP线程中运行。
  start.jsp在创建线程之前就把TaskBean的running标记设置成了true,这样,即使当JSP线程已开始执行status.jsp而任务线程的run()方法尚未启动,也能够确保用户会得到“任务已开始运行”的状态报告。
  将running标记设置成true、启动任务线程这两行代码可以移入TaskBean构成一个新的方法,然后由JSP页面调用这个新方法。一般而言,JSP页面应当尽量少用Java代码,即我们应当尽可能地把Java代码放入Java类。不过本例中我们不遵从这一规则,把new Thread(task).start()直接放入start.jsp突出表明JSP线程创建并启动了任务线程。
  在JSP页面中操作多线程必须谨慎,注意JSP线程和其它线程实际上是并发执行的,就象在桌面应用程序中,我们用一个线程来处理GUI事件,另外再用一个或多个线程来处理后台任务。不过在JSP环境中,考虑到多个用户同时请求某一个页面的情况,同一个JSP页面可能会在多个线程中同时运行;另外,有时同一个用户可能会向同一个页面发出多个请求,虽然这些请求来自同一个用户,它们也会导致服务器同时运行一个JSP页面的多个线程。 三、任务进度
status.jsp页面利用一个HTML进度条向用户显示任务的执行情况。首先,status.jsp利用标记获得start.jsp页面创建的Bean对象:
      class="test.barBean.TaskBean"/>
  为了及时反映任务执行进度,status.jsp会自动刷新。JavaScript代码setTimeout("location='status.jsp'", 1000)将每隔1000毫秒刷新页面,重新请求status.jsp,不需要用户干预。
 
 
    JSP进度条
   
       
   

 
  进度条实际上是一个HTML表格,包含10个单元――即每个单元代表任务总体的10%进度。
 

JSP进度条


     


        结果:

       
        %
   


                  BORDER=1 CELLPADDING=0 CELLSPACING=2>
       
           
               
           
            percent; i -= 10) { %>
               
           
       
   
   

 
任务执行情况分下面几种状态:正在执行,已完成,尚未开始,已停止:
 
       
           
        页面底部提供了一个按钮,用户可以用它来停止或重新启动任务:
 
           
       
   

               
                    正在执行
               
                   
                        完成
                   
                        尚未开始
                   
                        已停止
                   
               
           

               

               
                   

                       
                   

               
                   

                       
                   

               
           


  只要不停止任务,约10秒后浏览器将显示出计算结果5050:
  四、停止任务
  stop.jsp页面把running标记设置成false,从而停止当前的计算任务:
      class="test.barBean.TaskBean"/>
 

 
注意最早的Java版本提供了Thread.stop方法,但JDK从1.2版开始已经不赞成使用Thread.stop方法,所以我们不能直接调用Thread.stop()。
  第一次运行本文程序的时候,你会看到任务的启动有点延迟;同样地,第一次点击“停止”按钮时也可以看到任务并没有立即停止运行(特别是如果机器配置较低的话,延迟的感觉更加明显),这些延迟都是由于编译JSP页面导致的。编译好JSP页面之后,应答速度就要快多了。
  五、实际应用
  进度条不仅使得用户界面更加友好,而且对服务器的性能也有好处,因为进度条会不断地告诉用户当前的执行进度,用户不会再频繁地停止并重新启动(刷新)当前的任务。另一方面,创建单独的线程来执行后台任务也会消耗不少资源,必要时可考虑通过一个线程池来实现Thread对象的重用。另外,频繁地刷新进度页面也增加了网络通信开销,所以务必保持进度页面简洁短小。
  在实际应用中,后台执行的繁重任务可能不允许停止,或者它不能提供详细的执行进度数据。例如,查找或更新关系数据库时,SQL命令执行期间不允许中途停止――不过如果用户表示他想要停止或中止任务,程序可以在SQL命令执行完毕后回退事务。
  解析XML文档的时候,我们没有办法获知已解析内容精确的百分比。如果用DOM解析XML文档,直到解析完成后才得到整个文档树;如果用SAX,虽然可以知道当前解析的内容,但通常不能确定还有多少内容需要解析。在这些场合,任务的执行进度只能靠估计得到。
  估计一个任务需要多少执行时间通常是很困难的,因为它涉及到许多因素,即使用实际测试的办法也无法得到可靠的结论,因为服务器的负载随时都在变化之中。一种简单的办法是测量任务每次执行所需时间,然后根据最后几次执行的平均时间估算。如果要提高估计时间的精确度,应当考虑实现一种针对应用特点的算法,综合考虑多种因素,例如要执行的SQL语句类型、要解析的XML模式的复杂程度,等等。
  结束语:本文例子显示出用JSP、Java、HTML和JavaScript构造进度条是相当容易的,真正困难的是如何将它用到实际应用之中,特别是获得后台任务的进度信息,但这个问题没有通用的答案,每一种后台执行的任务都有它自己的特点,必须按照具体情况具体分析。 (出处:PConline)

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Honor Magic V3 stellt erstmals die KI-Defokussierungs-Augenschutztechnologie vor: Lindert effektiv die Entwicklung von Kurzsichtigkeit Honor Magic V3 stellt erstmals die KI-Defokussierungs-Augenschutztechnologie vor: Lindert effektiv die Entwicklung von Kurzsichtigkeit Jul 18, 2024 am 09:27 AM

Laut Nachrichten vom 12. Juli wurde die Honor Magic V3-Serie heute offiziell veröffentlicht und ist mit dem neuen Honor Vision Soothing Oasis-Augenschutzbildschirm ausgestattet. Der Bildschirm selbst verfügt zwar über hohe Spezifikationen und eine hohe Qualität, war aber auch Vorreiter bei der Einführung des aktiven KI-Augenschutzes Technologie. Es wird berichtet, dass die traditionelle Methode zur Linderung von Myopie „Myopie-Brillen“ ist. Die Stärke von Myopie-Brillen ist gleichmäßig verteilt, um sicherzustellen, dass der zentrale Sehbereich auf der Netzhaut abgebildet wird, der periphere Bereich jedoch dahinter Die Netzhaut erkennt, dass das Bild zurückliegt, wodurch die Richtung der Augenachse später wächst und sich dadurch vertieft. Eine der wichtigsten Möglichkeiten, die Entwicklung von Myopie zu lindern, ist derzeit die „Defokussierungslinse“. Der zentrale Bereich hat eine normale Stärke, und der periphere Bereich wird durch optische Designtrennwände so angepasst, dass das Bild im peripheren Bereich fällt vor der Netzhaut.

Gleichzeitige C++-Programmierung: Wie vermeidet man Thread-Aushungerung und Prioritätsumkehr? Gleichzeitige C++-Programmierung: Wie vermeidet man Thread-Aushungerung und Prioritätsumkehr? May 06, 2024 pm 05:27 PM

Um Thread-Aushunger zu vermeiden, können Sie faire Sperren verwenden, um eine faire Zuweisung von Ressourcen sicherzustellen, oder Thread-Prioritäten festlegen. Um die Prioritätsumkehr zu lösen, können Sie die Prioritätsvererbung verwenden, um die Priorität des Threads, der die Ressource enthält, vorübergehend zu erhöhen, oder die Sperrenerhöhung verwenden, um die Priorität des Threads zu erhöhen, der die Ressource benötigt.

Gleichzeitige C++-Programmierung: Wie führt man Thread-Beendigung und -Abbruch durch? Gleichzeitige C++-Programmierung: Wie führt man Thread-Beendigung und -Abbruch durch? May 06, 2024 pm 02:12 PM

Zu den Thread-Beendigungs- und Abbruchmechanismen in C++ gehören: Thread-Beendigung: std::thread::join() blockiert den aktuellen Thread, bis der Ziel-Thread die Ausführung abschließt. std::thread::detach() trennt den Ziel-Thread von der Thread-Verwaltung. Thread-Abbruch: std::thread::request_termination() fordert den Ziel-Thread auf, die Ausführung zu beenden; std::thread::get_id() erhält die Ziel-Thread-ID und kann mit std::terminate() verwendet werden, um das Ziel sofort zu beenden Faden. Im tatsächlichen Kampf ermöglicht request_termination() dem Thread, den Zeitpunkt der Beendigung zu bestimmen, und join() stellt dies in der Hauptzeile sicher

Neuer Stapelprozess! Das Xiaomi MIX Fold 4 ist zum ersten Mal mit einem „dreidimensionalen, speziell geformten' Akku von Jinshajiang ausgestattet Neuer Stapelprozess! Das Xiaomi MIX Fold 4 ist zum ersten Mal mit einem „dreidimensionalen, speziell geformten' Akku von Jinshajiang ausgestattet Jul 20, 2024 am 03:20 AM

Laut Nachrichten vom 19. Juli wurde Xiaomi MIX Fold 4, das erste neue Flaggschiff-Falttelefon, heute Abend offiziell veröffentlicht und ist erstmals mit einem „dreidimensionalen, speziell geformten Akku“ ausgestattet. Berichten zufolge hat Xiaomi MIX Fold4 einen großen Durchbruch in der Batterietechnologie erzielt und eine innovative „dreidimensionale, speziell geformte Batterie“ speziell für Faltbildschirme entwickelt. Herkömmliche Faltschirmgeräte verwenden meist herkömmliche quadratische Batterien, die eine geringe Raumnutzungseffizienz aufweisen. Um dieses Problem zu lösen, verwendete Xiaomi nicht die üblichen Wickelbatteriezellen, sondern entwickelte ein neues Laminierungsverfahren, um eine neue Batterieform zu schaffen, die die Raumausnutzung erheblich verbesserte. Innovation in der Batterietechnologie Um positive und negative Elektrodenblätter abwechselnd präzise zu stapeln und die sichere Einbettung von Lithiumionen zu gewährleisten, hat Xiaomi eine neue Ultraschallschweißmaschine und Laminiermaschine entwickelt, um die Schweiß- und Schneidgenauigkeit zu verbessern.

Das Apple iPad Pro/Air 2024 unterstützt den Apple Pencil der zweiten Generation nicht: Bei Bedarf können neue Modelle erworben werden Das Apple iPad Pro/Air 2024 unterstützt den Apple Pencil der zweiten Generation nicht: Bei Bedarf können neue Modelle erworben werden May 08, 2024 pm 04:07 PM

Laut einer Nachricht vom 8. Mai wurden die neuen iPad Pro/Air-Tablets von Apple veröffentlicht. Laut der offiziellen Website von Apple unterstützen das neue iPad Pro und das iPad Air nicht mehr den 2018 veröffentlichten Apple Pencil, sondern nur noch den Apple Pencil Pro und Apple Pencil (USB-C). Der Apple Pencil (USB-C) wird im November 2023 auf den Markt kommen. Dieser Stift verfügt über die gleiche Pixelgenauigkeit, geringe Latenz und Neigungswinkelerkennungsfunktionen wie der Apple Pencil der ersten und zweiten Generation, eliminiert jedoch die Druckempfindlichkeitsfunktion unterstützt kein kabelloses Laden. Der Preis beträgt 649 Yuan. Das neu veröffentlichte ApplePe

Das Mobiltelefon Honor X60i ist ab 1.399 Yuan im Angebot: visueller viereckiger OLED-Direktbildschirm Das Mobiltelefon Honor X60i ist ab 1.399 Yuan im Angebot: visueller viereckiger OLED-Direktbildschirm Jul 29, 2024 pm 08:25 PM

Laut Nachrichten vom 29. Juli ist das Mobiltelefon Honor X60i heute offiziell zum Preis ab 1.399 Yuan erhältlich. Was das Design angeht, verfügt das Honor X60i-Mobiltelefon über ein gerades Bildschirmdesign mit einem Loch in der Mitte und nahezu unbegrenzten, ultraschmalen Rändern an allen vier Seiten, was das Sichtfeld erheblich erweitert. Parameter des Honor , Smart-Kapsel, Fingerabdruck unter dem Bildschirm, Dual-MIC, Rauschunterdrückung, Fragen und Antworten zu Wissen, Fotofunktionen: hinteres Dual-Kamerasystem: 50 Millionen Pixel Hauptkamera, 2 Millionen Pixel Hilfsobjektiv, vorderes Selfie-Objektiv: 8 Millionen Pixel, Preis: 8 GB

Vivos Telefon mit dem stärksten Signal! vivo X100s ist mit einem universellen Signalverstärkungssystem ausgestattet: 21 Antennen, 360°-Surround-Design Vivos Telefon mit dem stärksten Signal! vivo X100s ist mit einem universellen Signalverstärkungssystem ausgestattet: 21 Antennen, 360°-Surround-Design Jun 03, 2024 pm 08:41 PM

Laut Nachrichten vom 13. Mai wurde das vivo Laut der offiziellen Einführung von vivo verwendet vivoX100s ein innovatives universelles Signalverstärkungssystem, das mit bis zu 21 Antennen ausgestattet ist. Dieses Design wurde basierend auf dem Direktbildschirm neu optimiert, um viele Signalanforderungen wie 5G, 4G, Wi-Fi, GPS und NFC auszugleichen. Damit ist das vivo X100s das Mobiltelefon mit der stärksten Signalempfangsfähigkeit in der Geschichte von vivo. Das neue Telefon verfügt außerdem über ein einzigartiges 360°-Surround-Design mit rund um das Gehäuse verteilten Antennen. Dieses Design verbessert nicht nur die Signalstärke, sondern optimiert auch verschiedene tägliche Haltehaltungen, um Probleme durch falsche Haltemethoden zu vermeiden.

OnePlus Ace 3 Pro stellt das Tiangong-Kühlsystem der zweiten Generation vor: überkritisches thermisches Graphit OnePlus Ace 3 Pro stellt das Tiangong-Kühlsystem der zweiten Generation vor: überkritisches thermisches Graphit Jun 28, 2024 am 01:49 AM

Laut Nachrichten vom 27. Juni wurde OnePlus Ace3Pro heute Abend offiziell veröffentlicht. Das neue Gerät ist nicht nur mit dem Flaggschiff-Kern Snapdragon 8 der dritten Generation ausgestattet, sondern legt auch großen Wert auf die Wärmeableitung. Berichten zufolge stellt OnePlus Ace3 Pro zum ersten Mal das Tiangong-Kühlsystem vor. Dieses System ist mit einem 9126 mm² großen VC-Kühlkörper ausgestattet. Im Vergleich zur vorherigen Generation ist die Wärmeableitungseffizienz um erstaunliche 36 gestiegen %. Diese bahnbrechende Technologie ermöglicht es Mobiltelefonen, die Wärme schnell abzuleiten, wenn sie unter hoher Last laufen, und sorgt so für eine stabile Leistung der Mobiltelefone. Noch auffälliger ist, dass OnePlus Ace3Pro zum ersten Mal überkritischen 2K-Thermalgraphit verwendet: Seine Wärmeleitfähigkeit liegt bei bis zu 2041 W/(m·K) und liegt damit an erster Stelle in der Branche. Die Wärmeableitungskapazität wird um 70 % erhöht, wodurch die Wärmeableitung von Mobiltelefonen verbessert und eine stabile Betriebstemperatur aufrechterhalten wird. verstreut

See all articles