為Struts 2應用程序創建進度條(等待頁面)

 

 

Struts 2模擬進度條的原理

 

      對於一些需要較長時間才能完成的任務,在Web開發中,會由HTTP協議會因為超時而斷開而面臨許多風險,這是在桌面開發不曾遇到的。Struts 2提供的execAndWait攔截器就是為瞭處理和應付這種情況而設計的。註意,該攔截器不在"defaultStack"中,所以必須在使用它的動作裡聲明它,並且必須放在攔截器棧的最後一個。

 

      使用瞭該攔截器後,動作依然正常執行,隻是該攔截器會分配一個後臺線程處理動作的運行,並在動作完成之前把用戶帶到一個"等待"頁面。,該頁面每隔一段時間刷新一次,直到那個後臺線程執行完畢為止。如果用戶隨後又觸發瞭同一個動作,但頂一個動作尚未執行完畢,這個攔截器將繼續向用戶發送"等待"結果;如果他已經執行完畢,用戶會看到該動作的最終結果。

 

      "等待"結果的行為與"dispatcher"結果的行為很相似,但是要註意的是,"等待"結果對應的視圖帶有如下的meta標簽:

 

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

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

 

  Struts 2是一個靈活強大的框架,如果你不喜歡Struts 2提供的默認"等待頁面",你也可以自己設計自己的等待頁面,若在動作聲明中,沒有找到"等待"結果,將使用默認值。

 

execAndWait攔截器

 

execAndWait攔截器 可以接收以下參數:

 

threadPriority:分配給相關線程的優先級,默認值為Thread.NORM_PRIORITY。

delay:向用戶發送"等待"結果前的毫秒數,默認值為0。如果你不想立刻發送"等待"結果,可以將該參數設置為一個值。例如,你想讓動作超過2秒還未完成時才發送"等待"結果,需要將其值設置為2000.

delaySleepInterval:每隔多少毫秒喚醒主線程(處理動作的後臺線程)去檢查後臺線程是否已經處理完成,默認值是100。這個值設為0時無效。

示例:使用默認視圖與自定義視圖

 

創建一個動作類,該動作類的工作為掛起30秒:

 

public class ProgressbarAction extends ActionSupport

{

    private static final long    serialVersionUID    = 7441785390598480063L;

 

    private int                    complete            = 0;

 

    // 獲取進度值

    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>

測試頁面:

 

<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元素才是重點,其他的沒什麼影響,是IDE自帶的  –>

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

    <!–

    <link rel="stylesheet" type="text/css" href="styles.css">

    –>

 

  </head>

 

  <body>

    <p>

        Please wait…(<s:property value="complete"/>)% complete

    </p>

  </body>

</html>最終結果頁面:

 

	<body>
    OK!
</body>

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

首先點擊,"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>

這次點擊"customer_view"鏈接:

這是自定義界面,最後動作執行完畢後,都會獲得最終頁面

我們使用Struts 2模擬進度條就完成瞭!

 

摘自 消逝の紙屑

發佈留言