athrunwang

          紀(jì)元
          數(shù)據(jù)加載中……
          為Struts 2應(yīng)用程序創(chuàng)建進(jìn)度條(等待頁面)

          Struts 2模擬進(jìn)度條的原理

                對(duì)于一些需要較長(zhǎng)時(shí)間才能完成的任務(wù),在Web開發(fā)中,會(huì)由HTTP協(xié)議會(huì)因?yàn)槌瑫r(shí)而斷開而面臨許多風(fēng)險(xiǎn),這是在桌面開發(fā)不曾遇到的。Struts 2提供的execAndWait攔截器就是為了處理和應(yīng)付這種情況而設(shè)計(jì)的。注意,該攔截器不在"defaultStack"中,所以必須在使用它的動(dòng)作里聲明它,并且必須放在攔截器棧的最后一個(gè)。

                使用了該攔截器后,動(dòng)作依然正常執(zhí)行,只是該攔截器會(huì)分配一個(gè)后臺(tái)線程處理動(dòng)作的運(yùn)行,并在動(dòng)作完成之前把用戶帶到一個(gè)"等待"頁面。,該頁面每隔一段時(shí)間刷新一次,直到那個(gè)后臺(tái)線程執(zhí)行完畢為止。如果用戶隨后又觸發(fā)了同一個(gè)動(dòng)作,但頂一個(gè)動(dòng)作尚未執(zhí)行完畢,這個(gè)攔截器將繼續(xù)向用戶發(fā)送"等待"結(jié)果;如果他已經(jīng)執(zhí)行完畢,用戶會(huì)看到該動(dòng)作的最終結(jié)果。

                "等待"結(jié)果的行為與"dispatcher"結(jié)果的行為很相似,但是要注意的是,"等待"結(jié)果對(duì)應(yīng)的視圖帶有如下的meta標(biāo)簽:

          <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>

          該標(biāo)簽的作用就每隔多少秒就重新加載一次同樣的URL。這里"5"表示5秒,"url=/Struts2/default_progressbar.action"表示要加載的URL。

             Struts 2是一個(gè)靈活強(qiáng)大的框架,如果你不喜歡Struts 2提供的默認(rèn)"等待頁面",你也可以自己設(shè)計(jì)自己的等待頁面,若在動(dòng)作聲明中,沒有找到"等待"結(jié)果,將使用默認(rèn)值。


          execAndWait攔截器

          execAndWait攔截器 可以接收以下參數(shù):

          • threadPriority:分配給相關(guān)線程的優(yōu)先級(jí),默認(rèn)值為Thread.NORM_PRIORITY。
          • delay:向用戶發(fā)送"等待"結(jié)果前的毫秒數(shù),默認(rèn)值為0。如果你不想立刻發(fā)送"等待"結(jié)果,可以將該參數(shù)設(shè)置為一個(gè)值。例如,你想讓動(dòng)作超過2秒還未完成時(shí)才發(fā)送"等待"結(jié)果,需要將其值設(shè)置為2000.
          • delaySleepInterval:每隔多少毫秒喚醒主線程(處理動(dòng)作的后臺(tái)線程)去檢查后臺(tái)線程是否已經(jīng)處理完成,默認(rèn)值是100。這個(gè)值設(shè)為0時(shí)無效。

          示例:使用默認(rèn)視圖與自定義視圖

          創(chuàng)建一個(gè)動(dòng)作類,該動(dòng)作類的工作為掛起30秒:

          public class ProgressbarAction extends ActionSupport
          {
          private static final long serialVersionUID = 7441785390598480063L;

          private int complete = 0;

          // 獲取進(jìn)度值
          public int getComplete()
          {
          complete += 10;
          return complete;
          }

          @Override
          public String execute()
          {
          try
          {
          Thread.sleep(30000);
          }
          catch (InterruptedException e)
          {
          e.printStackTrace();
          }
          return SUCCESS;
          }
          }

          配置struts.xml文件:

          <package name="progressbar" extends="struts-default">
          <action name="default_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
          <interceptor-ref name="defaultStack"></interceptor-ref>
          <interceptor-ref name="execAndWait">
          <param name="delay">1500</param>
          </interceptor-ref>
          <result name="success">/state_ok.jsp</result>
          </action>

          <action name="customer_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
          <interceptor-ref name="defaultStack"></interceptor-ref>
          <interceptor-ref name="execAndWait">
          <param name="delay">1500</param>
          </interceptor-ref>
          <result name="wait">/customer_wait.jsp</result>
          <result name="success">/state_ok.jsp</result>
          </action>
          </package>

          測(cè)試頁面:

          <body>
          <s:a href="/Struts2/default_progressbar.action">default_view</s:a>
          <br />
          <s:a href="/Struts2/customer_progressbar.action">customer_view</s:a>
          </body>

          自定義等待頁面:

          <html>
          <head>
          <base href="<%=basePath%>">

          <title>My JSP 'customer_wait.jsp' starting page</title>

          <meta http-equiv="pragma" content="no-cache">
          <meta http-equiv="cache-control" content="no-cache">
          <meta http-equiv="expires" content="0">
          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          <meta http-equiv="description" content="This is my page">

          <!-- 下面的meta元素才是重點(diǎn),其他的沒什么影響,是IDE自帶的 -->
          <meta http-equiv="refresh" content="3;url=/Struts2/customer_progressbar.action">
          <!--
          <link rel="stylesheet" type="text/css" href="styles.css">
          -->

          </head>

          <body>
          <div>
          Please wait...(<s:property value="complete"/>)% complete
          </div>
          </body>
          </html>

          最終結(jié)果頁面:

          <body>
          OK!
          </body>

          在瀏覽器中輸入:http://localhost:8081/Struts2/test.jsp,獲得如下頁面

          首先點(diǎn)擊,"default_view"鏈接:


          查看它的源代碼:

          <html>
          <head>
          <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>
          </head>
          <body>
          Please wait while we process your request...
          <p/>

          This page will reload automatically and display your request when it is completed.
          </body>
          </html>

          這次點(diǎn)擊"customer_view"鏈接:

          ...

          ...

          這是自定義界面,最后動(dòng)作執(zhí)行完畢后,都會(huì)獲得最終頁面

          我們使用Struts 2模擬進(jìn)度條就完成了!

          posted on 2011-11-18 10:40 AthrunWang 閱讀(1029) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 林西县| 腾冲县| 江城| 长宁区| 乌拉特中旗| 云和县| 正宁县| 包头市| 蕉岭县| 巴中市| 延边| 台北县| 土默特右旗| 正阳县| 分宜县| 嘉祥县| 利津县| 葫芦岛市| 霍山县| 大港区| 云阳县| 原阳县| 扬中市| 托克托县| 英超| 腾冲县| 南通市| 毕节市| 张家港市| 高清| 平顶山市| 同心县| 丽水市| 清镇市| 平遥县| 扎赉特旗| 驻马店市| 平远县| 商城县| 云浮市| 南郑县|