大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> JSP编程进度条设计实例

JSP编程进度条设计实例

时间: 2021-07-31 作者:daque

很多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的实质是:  <?xml version="1.0" encoding="gb2312"?> <!doctype web-app    public "-//sun microsystems, inc.//dtd web application 2.3//en"    "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app>    <welcome-file-list>        <welcome-file>start.jsp</welcome-file>    </welcome-file-list></web-app> start.jsp启用一个专用的线程来运转“沉重的工作”,而后把http乞求传播给status.jsp。 start.jsp页面运用<jsp:usebean>标志创造一个taskbean的范例,将scope属性设置为session使得对于来自同一欣赏器的http乞求,其余页面也能索取到同一个bean东西。start.jsp经过挪用session.removeattribute("task")保证<jsp:usebean>创造了一个新的bean东西,而不是索取一个旧东西(比方,同一个用户对话中更早的jsp页面所创造的bean东西)。  底下是start.jsp页面包车型的士代码清单:  <% session.removeattribute("task"); %> <jsp:usebean id="task" scope="session"     class="test.barbean.taskbean"/> <% task.setrunning(true); %><% new thread(task).start(); %><jsp:forward page="status.jsp"/> 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运用<jsp:usebean>标志赢得start.jsp页面创造的bean东西:  <jsp:usebean id="task" scope="session"    class="test.barbean.taskbean"/> 为了准时反应工作执前进度,status.jsp会机动革新。javascript代码settimeout("location='status.jsp'", 1000)将每隔1000毫秒革新页面,从新乞求status.jsp,不须要用户干涉。  <html> <head>    <title>jsp进度条</title>    <% if (task.isrunning()) { %>        <script language="javascript">            settimeout("location='status.jsp'", 1000);        </script>    <% } %></head> <body> 进度条本质上是一个html表格,包括10个单位——即每个单位代办工作总体的10%进度。  <h1 align="center">jsp进度条</h1>     <h2 align="center">        截止: <%= task.getresult() %><br>        <% int percent = task.getpercent(); %>        <%= percent %>%    </h2>     <table width="60%" align="center"            border=1 cellpadding=0 cellspacing=2>        <tr>            <% for (int i = 10; i <= percent; i += 10) { %>                <td width="10%" bgcolor="#000080"> </td>            <% } %>            <% for (int i = 100; i > percent; i -= 10) { %>                <td width="10%"> </td>            <% } %>        </tr>    </table> 工作实行情景分底下几种状况:正在实行,已实行,尚未发端,已遏止:  <table width="100%" border=0 cellpadding=0 cellspacing=0>        <tr>            <td align="center">                <% if (task.isrunning()) { %>                    正在实行                <% } else { %>                    <% if (task.iscompleted()) { %>                        实行                    <% } else if (!task.isstarted()) { %>                        尚未发端                    <% } else { %>                        已遏止                    <% } %>                <% } %>            </td>        </tr>页面底部供给了一个按钮,用户不妨用它来遏止或从新启用工作:  <tr>            <td align="center">                <br>                <% if (task.isrunning()) { %>                    <form method="get" action="stop.jsp">                        <input type="submit" value="遏止">                    </form>                <% } else { %>                    <form method="get" action="start.jsp">                        <input type="submit" value="发端">                    </form>                <% } %>            </td>        </tr>    </table></body></html> 只有不遏止工作,约10秒后欣赏器将表露出计划截止5050:  四、遏止工作  stop.jsp页面把running标志树立成false,进而遏止暂时的计划工作:  <jsp:usebean id="task" scope="session"    class="test.barbean.taskbean"/> <% task.setrunning(false); %><jsp:forward page="status.jsp"/> 提防最早的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)

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.