如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks
           批量系統原有的頁面定時刷新的實現是不太合理的,以RealtimeBatchRunningOfCountwf為例:
           首先在RealtimeBatchRunningOfCountwf.page中定義了屬性refreshUrl:<property-specification name="refreshUrl" type="java.lang.String"/>,RealtimeBatchRunningOfCountwf.html中將refreshUrl插入head部分。實現的重點在RealtimeBatchRunningOfCountwf.java中,getRefreshUrl方法返回httpmeta頭,在這個頭信息中定義了刷新時間和要刷新到的頁面的url:
           public String getRefreshUrl() {
            String t_intervalTime = getIntervalTime();
            if (t_intervalTime == null) {
             t_intervalTime = getRequestCycle().getRequestContext()
             .getParameter("intervalTime");
            }
            if (t_intervalTime == null || t_intervalTime.equals("")) {
             return "";
            }
            String url = "";
            
            try{
             url = "<meta http-equiv=\"Refresh\" content=\""
              + t_intervalTime
              + "; URL="
              + getRequestCycle().getRequestContext().getAbsoluteURL(
              "batch-server/app?service=page/RealtimeBatchCountwf")
              + "&gappid=" + getGappid() + "&gfuncid=" + getGfuncid() + "&intervalTime=" + t_intervalTime
              + "&agentzoneno=" + getAgentzoneno()
              + "\"/>";
            } catch(Exception e){
             setMessage(e.getMessage());
             return "";
            }
            return url;
           }
           可以看到getRefreshUrl的實現是非常復雜的,由于TapeStry的頁面模型是比較復雜的,其中的變量都是通過頁面模型來儲存的,如果只是簡單的刷新頁面,會造成這些頁面變量錯誤,因此在getRefreshUrl方法中將所有的變量拼接到url中,這樣在頁面的getGappid、getAgentzoneno等方法中首先判斷頁面請求(getRequestContext)中是否有此頁面變量,如果有則取頁面請求中的,否則再去取本對象中的變量值。這樣看起來getGappid、getAgentzoneno、getRefreshUrl等方法都非常復雜,一旦頁面中增加新的屬性就需要去修改getRefreshUrl方法,而且這樣造成視圖(View)的邏輯混雜到了模型(Model)中,違反了MVC的隔離原則,最重要的是這樣做違背了Tapestry頁面模型設計的原意。因此我做了一個新的實現方法,可以參考BatchTaskContrlwf:
           首先仍然是在BatchTaskContrlwf.java中定義getIntervalTime方法:
           public String getIntervalTime()
           {
            if (intervalTime == null)
            {
             intervalTime = "60";
            }
            setMessage("數據每 " + intervalTime + " 秒更新一次,更新的速度可以在左上角更改");
            return intervalTime;
           }
           getIntervalTime比以前的實現簡單了。BatchTaskContrlwf.java中也沒有了getRefreshUrl方法,這樣保持了視圖與模型的獨立性。
           在BatchTaskContrlwf.html中body的開頭增加如下的javascript:
          <script>
           //intervalTime表示秒,但是在setTimeout中的單位是毫秒,所以在后邊加三個零
           window.setTimeout("RefreshPage()",<span jwcid="@InsertText" value="ognl:intervalTime"></span>000);
           function RefreshPage()
           {  
            document.getElementById("imgRefresh").click();
           }
          </script>
           這里調用定時器實現每隔intervalTime秒就調用一次RefreshPage方法,在RefreshPage方法中則去模擬點擊imgRefresh控件,這樣就可以達到刷新頁面的目的了。imgRefresh是為“刷新”這個圖形按鈕增加的id屬性,因為圖形按鈕默認是只有name屬性的,而且name屬性生成的也是隨機的,所以為“刷新”按鈕增加id屬性:
          <img jwcid="@ImageSubmit" id="imgRefresh" hspace="20" align="middle" image="ognl:assets.refreshImage" listener="ognl:listeners.refreshAction"/>
           這樣就可以在RefreshPage方法中輕松的取得此控件了。
           在RefreshPage方法中也使用getElementById這個技巧,因為Tapestry生成的html中的表單的名稱也是不可測的,目前的名稱是“$Form0”,但是這個名稱是不保障的,如果我們在RefreshPage方法中使用document.$Form0.$ImageSubmit.click()方式刷新頁面的話,很有可能在Tapestr實現機制改變或者在頁面中加入了新的表單元素后造成代碼錯誤。而getElementById則可以直接根據控件id來定位控件,大大提高了代碼的靈活性。
          注:上邊的文章是我對公司原有產品進行重構的時候發的一篇文章,涉及到了公司的一些私有概念,非公司的人可能讀部分章節起來有點費勁,請諒解。如果以后有時間我會整理成通用的文檔的。
          posted on 2007-06-05 18:40 CowNew開源團隊 閱讀(1275) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 金阳县| 常宁市| 安泽县| 黄山市| 古交市| 佛冈县| 深州市| 永康市| 酒泉市| 泰来县| 阿拉善右旗| 蒲城县| 牙克石市| 鄂伦春自治旗| 九龙县| 中山市| 西华县| 绥棱县| 盘山县| 阿克陶县| 景洪市| 韶山市| 多伦县| 克拉玛依市| 吉隆县| 平度市| 中超| 沂南县| 织金县| 依安县| 黑水县| 佛教| 云霄县| 蒙山县| 班玛县| 天气| 运城市| 郑州市| 长汀县| 栾川县| 枝江市|