莊周夢(mèng)蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          ??? 今天算是又玩了回心跳,周六,門戶用的人比較少,所有更新了上星期開發(fā)的一些東西到一個(gè)子系統(tǒng),通過websphere控制臺(tái)重啟此應(yīng)用后,使用門戶訪問進(jìn)去,一直報(bào)一個(gè)session過期的錯(cuò)誤,自動(dòng)跳轉(zhuǎn)重新登錄。認(rèn)真檢查了下發(fā)布的類,都是在本地上測試通過的,怎么就一直報(bào)錯(cuò)呢?而我對(duì)websphere portal的理解僅限于啟動(dòng)、關(guān)閉服務(wù)的......一下子有點(diǎn)慌了,趕忙打電話請(qǐng)同事過來幫忙看看,手心冒汗啊。同事過來看也找不到問題所在,把原來更新上去的類,重新恢復(fù)到測試環(huán)境原始版本,發(fā)現(xiàn)還是同樣的問題。大家都有點(diǎn)摸不著頭腦了,門戶這一塊一直是公司的一個(gè)牛人負(fù)責(zé)的,立馬打電話過去問,根據(jù)文檔重啟,無效;殺進(jìn)程,無效;必殺技,重啟兩臺(tái)機(jī)器,意味著oracle、DB2、portal server、websphere應(yīng)用服務(wù)器全部要重新啟動(dòng)。煎熬地等待重啟后,郁悶的是問題依舊。一幫人想了想,應(yīng)該還是代碼問題,而不是環(huán)境上的問題,再認(rèn)真檢查更新上去的幾個(gè)類,終于發(fā)現(xiàn)問題所在,門戶調(diào)用這個(gè)子系統(tǒng)的URL錯(cuò)誤!!!不知道CVS上的代碼什么時(shí)候被人改過,此全局變量被改成了測試環(huán)境的,導(dǎo)致portal server訪問應(yīng)用的時(shí)候發(fā)生訪問被拒絕要求重新登錄的錯(cuò)誤。更改類,重新部署,重啟應(yīng)用,終于一切正常了,阿門。

          ??? 總結(jié)下教訓(xùn):
          1.發(fā)布關(guān)乎應(yīng)用全局的類時(shí)需要認(rèn)真閱讀發(fā)布文檔,并檢查各關(guān)鍵變量,認(rèn)真仔細(xì)
          2.目前CVS上的代碼需要進(jìn)行代碼審查,并統(tǒng)一發(fā)布一個(gè)新版本
          3.對(duì)portal應(yīng)該進(jìn)行更多的了解,可惜公司不進(jìn)行這方面的培訓(xùn),自己摸索真是沒頭緒
          4.遇到問題還是需要冷靜,盡量做到不慌,問題出現(xiàn)了,總可以解決,急也沒用,反而打亂了解決問題的思路。說的容易,做起來難啊。

          posted @ 2007-03-17 12:55 dennis 閱讀(682) | 評(píng)論 (0)編輯 收藏

          ??? 在W3C新的事件模型框架中,IE和Mozilla都實(shí)現(xiàn)了相應(yīng)的版本,IE的是attachEvent和detachEvent來實(shí)現(xiàn)元素事件的添加和刪除,而Mozilla則是標(biāo)準(zhǔn)的addEventListener和 removeEventListener。在傳統(tǒng)的javascript事件模型中,我們沒辦法為一個(gè)頁面元素注冊(cè)多個(gè)事件,只有靠自己來實(shí)現(xiàn)觀察者模式。代碼來自《ajax in action》,我添加了注釋
          //命名空間
          var?jsEvent?=?new?Array();

          //構(gòu)造函數(shù)
          jsEvent.EventRouter?=?function(el,eventType){
          ?
          //內(nèi)部維護(hù)一個(gè)事件列表
          ?this.lsnrs?=?new?Array();
          ?
          this.el?=?el;
          ?el.eventRouter?
          =?this;
          ?
          //注冊(cè)回調(diào)函數(shù)
          ?el[eventType]?=?jsEvent.EventRouter.callback;
          };

          //添加事件
          jsEvent.EventRouter.prototype.addListener?=?function(lsnr){
          ?
          this.lsnrs.append(lsnr,true);?
          }?;

          //移除事件
          jsEvent.EventRouter.prototype.removeListener=
          function(lsnr){?
          this.lsnrs.remove(lsnr);?
          };?

          //通知所有事件
          jsEvent.EventRouter.prototype.notify?=?function(e){
          ?
          var?lsnrs?=?this.lsnrs;
          ?
          for(var?i=0;i<lsnrs.length;i++){
          ??
          var?lsnr?=?lsnrs[i];
          ??lsnr.call(
          this,e);
          ?}
          };
          //回調(diào)函數(shù)調(diào)用notify
          jsEvent.EventRouter.callback=function(event){
          ?
          var?e?=?event?||?window.event;
          ?
          var?router?=?this.eventRouter;
          ?router.notify(e);
          };

          Array.prototype.append?
          =?function(obj,nodup){
          ?
          if(nodup){?
          ??
          this[this.length]=obj;
          ?}
          };
          Array.prototype.remove?
          =?function(o)
          {
          ???
          var?i?=?this.indexOf(o);
          ???
          if?(i>-1)
          ??{
          ????
          this.splice(i,1);
          ???}
          ?????
          return?(i>-1);
          ???}??
          };?

          這里比較巧妙的就是
          ?el.eventRouter?=?this;
          //注冊(cè)回調(diào)函數(shù)
          ?el[eventType]?=?jsEvent.EventRouter.callback;

          首先給el元素添加屬性
          eventRouter是當(dāng)前的EventRouter對(duì)象,然后,比如eventType假設(shè)為onclick,el是一個(gè)button元素,那么這里就是el[onclick]=jsEvent.EventRouter.callback;相當(dāng)于el.onclick=jsEvent.EventRouter.callback;
          而請(qǐng)注意這個(gè)回調(diào)函數(shù)
          callback將首先得到元素的eventRouter對(duì)象,再調(diào)用此對(duì)象的notify方法觸發(fā)所有注冊(cè)的事件。

          再請(qǐng)注意notify函數(shù)里面這一行:
          ?lsnr.call(this,e);

          我們把event對(duì)象傳入此函數(shù)作參,而
          var?e?=?event?||?window.event;那么所有事件函數(shù)的第一個(gè)參數(shù)都將是event對(duì)象,避免了IE需要通過window.event得到的事件對(duì)象的瀏覽器不一致行為。

          使用此對(duì)象方式:
           var?mat=document.getElementById('mousemat');
            cursor
          =document.getElementById('cursor');
            
          var?mouseRouter=new?jsEvent.EventRouter(mat,"onmousemove");
            mouseRouter.addListener(writeStatus);
            mouseRouter.addListener(drawThumbnail);?


          posted @ 2007-03-16 09:19 dennis 閱讀(1900) | 評(píng)論 (0)編輯 收藏

          來自javayeye的帖子,http://www.javaeye.com/topic/18648?page=1,運(yùn)用設(shè)計(jì)模式很重要一點(diǎn):模式應(yīng)該帶來清晰并且易于理解的結(jié)構(gòu),而非大堆大堆的麻煩。如果是你發(fā)現(xiàn)變麻煩了,那是你的方法錯(cuò)了。設(shè)計(jì)模式的異同不是通過結(jié)構(gòu),而是通過意圖和場景來理解,當(dāng)然,如果真能達(dá)到應(yīng)用中重神而非形的境界,就玄而又玄了。


          工廠模式是最重要的模式,因?yàn)榇蠖鄶?shù)模式都需要用到工廠模式。如果不能正確的運(yùn)用工廠模式,那么可以說無法成為合格的架構(gòu)師。
          多數(shù)設(shè)計(jì)模式的內(nèi)容講解的都是如何設(shè)計(jì)接口。
          接口如何產(chǎn)生呢?如果在客戶代碼(類庫的使用者稱之為客戶)中直接使用具體類,那么就失去了接口的意義。因?yàn)榻涌诘氖褂媚康模褪且档涂蛻魧?duì)具 體類的依賴程度。如果在客戶代碼中直接使用接口,那么就造成了客戶對(duì)具體類名稱的依賴。(客戶最終需要以某種方式指明所需要的具體類,如配置文件或代碼, 但是只需要指出一次,所以說降低對(duì)具體類的依賴程度)。要使客戶代碼不依賴具體類,唯一的方法,就是讓客戶代碼不依賴具體類的部分不知道具體類的名稱。知 道具體類名稱的部分,僅僅是配置部分。(配置文件或者配置代碼)。
          依賴不可能完全消除,除非二者毫無聯(lián)系。但是可以將這種依賴的程度降到最低。
          既然不能直接創(chuàng)建具體類,那么就需要通過一個(gè)創(chuàng)建者類來創(chuàng)建接口的實(shí)現(xiàn)類。這樣就產(chǎn)生了工廠類。
          那么現(xiàn)在已經(jīng)知道工廠類存在的理由,抽象創(chuàng)建接口的過程。
          這樣,就可以使用簡單工廠。
          簡單工廠,一般是兩級(jí)結(jié)構(gòu)。工廠類創(chuàng)建接口。
          隨著接口創(chuàng)建復(fù)雜性的增強(qiáng),可能在接口創(chuàng)建的過程中,一個(gè)創(chuàng)建者類,無法承擔(dān)創(chuàng)建所有的接口類的職責(zé)。
          可能會(huì)有這樣的情況,我們定義了一個(gè)接口,有6個(gè)實(shí)現(xiàn)類分別是123456號(hào)。但是,這六個(gè)實(shí)現(xiàn)類不可能用一個(gè)工廠創(chuàng)建出來,因?yàn)?23號(hào)是 windows下的實(shí)現(xiàn),而456號(hào)是linux上的實(shí)現(xiàn)。(假設(shè)我們使用的語言不是廣大人民群眾熱愛的java語言),那么這個(gè)時(shí)候,我還需要客戶方用 相同的方式來創(chuàng)建這個(gè)借口,而不是在代碼中到處寫

          代碼
          ???? if ?(操作系統(tǒng) == " windows " ){??
          ??????
          ????}??
          ?????
          else {??
          ??????
          ????}??

          那樣就太麻煩了。設(shè)計(jì)模式就是為了減少麻煩,而不是什么別的廢話,比如什么太極八卦、天人合一、面向xx之類的。因?yàn)榕侣闊?b>所以搞出設(shè)計(jì)模式這個(gè)咚咚減少麻煩。如果你發(fā)現(xiàn)用了設(shè)計(jì)模式更麻煩了,那么肯定是你用錯(cuò)了。
          這個(gè)時(shí)候?yàn)榱耸∈拢揖桶压S也抽象成一個(gè)接口(因?yàn)槲矣袃蓚€(gè)相似的工廠,如果只有一個(gè),我還廢話什么呢),這樣就成了工廠方法。
          當(dāng)然,既然工廠方法成了一個(gè)接口,那么當(dāng)然也需要用一個(gè)工廠來創(chuàng)建它。這個(gè)時(shí)候,創(chuàng)建是三級(jí)結(jié)構(gòu),簡單工廠(此時(shí)是工廠的工廠)創(chuàng)建工廠接口(本來是個(gè)類,現(xiàn)在因?yàn)檫M(jìn)一步的抽象,成為接口了),工廠接口創(chuàng)建產(chǎn)品。
          過了一段時(shí)間,隨著我們的工廠業(yè)務(wù)不斷發(fā)展,我們有了很多產(chǎn)品。
          比如,我們有錘子和釘子兩種產(chǎn)品。這兩種產(chǎn)品都有windows品牌和linux品牌的。我們給錘子和釘子各自定義了一個(gè)創(chuàng)建的接口。
          代碼
          ????interface?錘子工廠{??
          ????造錘子();??
          ????}??
          ????
          interface?釘子工廠{??
          ????造釘子();??
          ????}??

          可是,我們發(fā)現(xiàn)某些用戶,用windows的錘子去敲linux的釘子,從而把程序敲出了bug。這當(dāng)然是我們的錯(cuò)誤,因?yàn)槲覀冞`反了一條金科玉律:
          要想使你的程序穩(wěn)定運(yùn)行,你假設(shè)用戶是豬。
          所以,我們把錘子和釘子的工廠合并,讓一個(gè)工廠只能造出配套的錘子和釘子,這樣豬就沒有犯錯(cuò)誤的機(jī)會(huì)了。
          于是我們搞出一個(gè)抽象工廠:
          interface?鐵匠鋪{
          造錘子();
          造釘子();
          }?

          當(dāng)然,這個(gè)鐵匠鋪是個(gè)接口,所以同樣需要用一個(gè)工廠來創(chuàng)建它。所以,這個(gè)時(shí)候,工廠還是三級(jí)結(jié)構(gòu)。
          我們的工廠,業(yè)務(wù)很多,而且產(chǎn)品一般都是配套使用的(這樣可以多騙點(diǎn)錢),所以,我們大多數(shù)情況下,都是使用抽象工廠和簡單工廠。簡單工廠用來創(chuàng)建工廠,抽象工廠創(chuàng)建產(chǎn)品。
          工廠的作用,就是創(chuàng)建接口。
          其實(shí)我們不知道什么是設(shè)計(jì)模式,我們只是怕麻煩。什么是麻煩呢?
          我們覺得把同樣的代碼寫兩遍就非常麻煩。所以,我們寧可多寫幾句,也要解決麻煩。豬不怕麻煩,可以日復(fù)一日的重復(fù)相同的事情,可是我們不是豬。

          posted @ 2007-03-15 15:47 dennis 閱讀(1629) | 評(píng)論 (0)編輯 收藏

          ??? 近幾日重讀《ajax實(shí)戰(zhàn)》,對(duì)AJAX技術(shù)的理解有點(diǎn)改變。當(dāng)ajax開始火熱的時(shí)候,其實(shí)那時(shí)我呆的那家公司早在02年時(shí)就已經(jīng)開始用XmlHttpRequest做前后臺(tái)的異步通信,因?yàn)樽龅氖莾?nèi)部網(wǎng)應(yīng)用,通過統(tǒng)一安裝一個(gè)delphi寫ActiveX表格控件來進(jìn)行數(shù)據(jù)的展現(xiàn)和報(bào)表的打印,使用xml作為前后臺(tái)交換數(shù)據(jù)的格式。所以當(dāng)ajax技術(shù)開始火熱的時(shí)候,我以為,我所做的就是ajax應(yīng)用。買了《ajax實(shí)戰(zhàn)》,讀的也不深入,特別是前面幾個(gè)章節(jié)讀的半懂不懂,因?yàn)槟菚r(shí)的我對(duì)javascript和設(shè)計(jì)模式等方面還沒有深入系統(tǒng)的學(xué)習(xí)過。

          ??? 我們都知道ajax是javascript、css、DOM和XmlHttpRequest的結(jié)合體,可使用了這些技術(shù)的應(yīng)用就一定是ajax嗎?《ajax實(shí)戰(zhàn)》提出了衡量是否是ajax應(yīng)用的四條標(biāo)準(zhǔn):

          1 瀏覽器中的是應(yīng)用,而不是內(nèi)容;
          2 服務(wù)器交付的是數(shù)據(jù),而不是內(nèi)容;
          3 用戶和應(yīng)用的交互是連續(xù)的,大部分對(duì)于服務(wù)器的請(qǐng)求是隱式的而不是顯式的;
          4 代碼庫式巨大的、復(fù)雜的,而且式組織良好的,這個(gè)特點(diǎn)對(duì)于架構(gòu)來說非常重要,需要認(rèn)真對(duì)待。

          如果以這樣的標(biāo)準(zhǔn)衡量,其實(shí)我們的很多自以為是ajax應(yīng)用并非是嚴(yán)格意義上的ajax應(yīng)用,軟件的應(yīng)用可以劃分為瞬態(tài)的和獨(dú)占的,比如china-pub網(wǎng)站,這只是個(gè)瞬態(tài)應(yīng)用,我們只是偶爾去訪問它,對(duì)交互的連續(xù)性也沒有很強(qiáng)的要求;而另外如word、excel之類的應(yīng)用,需要持續(xù)不斷的交互,我們點(diǎn)下某個(gè)按鈕,總是期待能馬上有個(gè)效果出來,這樣的應(yīng)用就是所謂的獨(dú)占應(yīng)用。ajax技術(shù)已經(jīng)在很廣泛的瞬態(tài)應(yīng)用中實(shí)施,而ajax的趨勢(shì)是否就是獨(dú)占式應(yīng)用?gmail和google map給出了答案,以及現(xiàn)在比較火熱的web office等。可我對(duì)于此類應(yīng)用的前景并不看好,像word之類的應(yīng)用,對(duì)于實(shí)時(shí)性和安全性的要求是比較高的,而當(dāng)前網(wǎng)絡(luò)環(huán)境下的延遲和安全問題,會(huì)給此類應(yīng)用帶來相當(dāng)大的隱憂。而實(shí)現(xiàn)這樣的獨(dú)占式應(yīng)用,帶來的也是服務(wù)器非常巨大的并發(fā)量,gmail就是個(gè)典型的例子,當(dāng)你操作非常頻繁的時(shí)候,容易出現(xiàn)莫名其妙的錯(cuò)誤。

          ??? 我仍然認(rèn)為ajax應(yīng)該成為目前web應(yīng)用的潤滑劑,它應(yīng)該應(yīng)用在細(xì)節(jié)上改善用戶體驗(yàn)上,而非徹底取代桌面應(yīng)用,也不可能取代。

          posted @ 2007-03-14 18:56 dennis 閱讀(1263) | 評(píng)論 (3)編輯 收藏

               摘要: Apache和tomcat的集群和負(fù)載均衡配置  閱讀全文

          posted @ 2007-03-13 18:05 dennis 閱讀(4410) | 評(píng)論 (10)編輯 收藏

          1.讀完《javascript高級(jí)程序設(shè)計(jì)》后,自己覺的js功力大有長進(jìn),準(zhǔn)備再重讀下《ajax in action》,去年讀這本書的時(shí)候,對(duì)javascript、dom、css、XmlHttpRequest和設(shè)計(jì)模式的了解還很有限,對(duì)于前面幾個(gè)章節(jié)特別是介紹重構(gòu)ajax的章節(jié)讀的半懂不懂,是需要重新思考下ajax技術(shù)的位置。

          2.繼續(xù)讀《設(shè)計(jì)模式》,將書中的C++例子改寫為java例子加深理解。

          3.學(xué)習(xí)rails 1.2,rails1.2出來有一段時(shí)間了,我機(jī)器上的版本仍然停留在1.1.6,準(zhǔn)備徹底搞明白到底什么是REST架構(gòu)

          4.對(duì)java高級(jí)主題的探索學(xué)習(xí),如portal、JTS、web service等。

          posted @ 2007-03-12 11:56 dennis 閱讀(679) | 評(píng)論 (0)編輯 收藏

          表格排序,一般的處理方法是傳遞排序的字段到后臺(tái)進(jìn)行重新查詢并排序,javascript也可以做到簡單的表格排序,備忘代碼:
          ?????????? //類型轉(zhuǎn)換器,將列的字段類型轉(zhuǎn)換為可以排序的類型:String,int,float
          ????????????function?convert(sValue,?sDataType)?{
          ????????????????
          switch(sDataType)?{
          ????????????????????
          case?"int":
          ????????????????????????
          return?parseInt(sValue);
          ????????????????????
          case?"float":
          ????????????????????????
          return?parseFloat(sValue);
          ????????????????????
          case?"date":
          ????????????????????????
          return?new?Date(Date.parse(sValue));
          ????????????????????
          default:
          ????????????????????????
          return?sValue.toString();
          ????????????????
          ????????????????}
          ????????????}
          ????????????
          ????????????
          //排序函數(shù)產(chǎn)生器,iCol表示列索引,sDataType表示該列的數(shù)據(jù)類型
          ????????????function?generateCompareTRs(iCol,?sDataType)?{
          ????????
          ????????????????
          return??function?compareTRs(oTR1,?oTR2)?{
          ????????????????????????????
          var?vValue1?=?convert(oTR1.cells[iCol].firstChild.nodeValue,?sDataType);
          ????????????????????????????
          var?vValue2?=?convert(oTR2.cells[iCol].firstChild.nodeValue,?sDataType);
          ????????
          ????????????????????????????
          if?(vValue1?<?vValue2)?{
          ????????????????????????????????
          return?-1;
          ????????????????????????????}?
          else?if?(vValue1?>?vValue2)?{
          ????????????????????????????????
          return?1;
          ????????????????????????????}?
          else?{
          ????????????????????????????????
          return?0;
          ????????????????????????????}
          ????????????????????????};
          ????????????}
          ????????????
          ????????????
          //排序方法
          ????????????function?sortTable(sTableID,?iCol,?sDataType)?{
          ????????????????
          var?oTable?=?document.getElementById(sTableID);
          ????????????????
          var?oTBody?=?oTable.tBodies[0];
          ????????????????
          var?colDataRows?=?oTBody.rows;
          ????????????????
          var?aTRs?=?new?Array;
          ????????????????
          ????????????????
          //將所有列放入數(shù)組
          ????????????????for?(var?i=0;?i?<?colDataRows.length;?i++)?{
          ????????????????????aTRs[i]?
          =?colDataRows[i];
          ????????????????}
          ?????????????????
          ????????????????
          //判斷最后一次排序的列是否與現(xiàn)在要進(jìn)行排序的列相同,是的話,直接使用reverse()逆序
          ????????????????if?(oTable.sortCol?==?iCol)?{
          ????????????????????aTRs.reverse();
          ????????????????}?
          else?{
          ????????????????????
          //使用數(shù)組的sort方法,傳進(jìn)排序函數(shù)
          ????????????????????aTRs.sort(generateCompareTRs(iCol,?sDataType));
          ????????????????}
          ????????
          ????????????????
          var?oFragment?=?document.createDocumentFragment();
          ????????????????
          for?(var?i=0;?i?<?aTRs.length;?i++)?{
          ????????????????????oFragment.appendChild(aTRs[i]);
          ????????????????}
          ???????
          ????????????????oTBody.appendChild(oFragment);
          ????????????????
          //記錄最后一次排序的列索引
          ????????????????oTable.sortCol?=?iCol;
          ????????????}

          完整例子:
          <html>
          ????
          <head>
          ????
          <title>Table?Sort?Example</title>
          ????????
          <script?type="text/javascript">
          ????????????
          ????????????
          //轉(zhuǎn)換器,將列的字段類型轉(zhuǎn)換為可以排序的類型:String,int,float
          ????????????function?convert(sValue,?sDataType)?{
          ????????????????
          switch(sDataType)?{
          ????????????????????
          case?"int":
          ????????????????????????
          return?parseInt(sValue);
          ????????????????????
          case?"float":
          ????????????????????????
          return?parseFloat(sValue);
          ????????????????????
          case?"date":
          ????????????????????????
          return?new?Date(Date.parse(sValue));
          ????????????????????
          default:
          ????????????????????????
          return?sValue.toString();
          ????????????????
          ????????????????}
          ????????????}
          ????????????
          ????????????
          //排序函數(shù)產(chǎn)生器,iCol表示列索引,sDataType表示該列的數(shù)據(jù)類型
          ????????????function?generateCompareTRs(iCol,?sDataType)?{
          ????????
          ????????????????
          return??function?compareTRs(oTR1,?oTR2)?{
          ????????????????????????????
          var?vValue1?=?convert(oTR1.cells[iCol].firstChild.nodeValue,?sDataType);
          ????????????????????????????
          var?vValue2?=?convert(oTR2.cells[iCol].firstChild.nodeValue,?sDataType);
          ????????
          ????????????????????????????
          if?(vValue1?<?vValue2)?{
          ????????????????????????????????
          return?-1;
          ????????????????????????????}?
          else?if?(vValue1?>?vValue2)?{
          ????????????????????????????????
          return?1;
          ????????????????????????????}?
          else?{
          ????????????????????????????????
          return?0;
          ????????????????????????????}
          ????????????????????????};
          ????????????}
          ????????????
          ????????????
          //排序方法
          ????????????function?sortTable(sTableID,?iCol,?sDataType)?{
          ????????????????
          var?oTable?=?document.getElementById(sTableID);
          ????????????????
          var?oTBody?=?oTable.tBodies[0];
          ????????????????
          var?colDataRows?=?oTBody.rows;
          ????????????????
          var?aTRs?=?new?Array;
          ????????????????
          ????????????????
          //將所有列放入數(shù)組
          ????????????????for?(var?i=0;?i?<?colDataRows.length;?i++)?{
          ????????????????????aTRs[i]?
          =?colDataRows[i];
          ????????????????}
          ?????????????????
          ????????????????
          //判斷最后一次排序的列是否與現(xiàn)在要進(jìn)行排序的列相同,是的話,直接使用reverse()逆序
          ????????????????if?(oTable.sortCol?==?iCol)?{
          ????????????????????aTRs.reverse();
          ????????????????}?
          else?{
          ????????????????????
          //使用數(shù)組的sort方法,傳進(jìn)排序函數(shù)
          ????????????????????aTRs.sort(generateCompareTRs(iCol,?sDataType));
          ????????????????}
          ????????
          ????????????????
          var?oFragment?=?document.createDocumentFragment();
          ????????????????
          for?(var?i=0;?i?<?aTRs.length;?i++)?{
          ????????????????????oFragment.appendChild(aTRs[i]);
          ????????????????}
          ???????
          ????????????????oTBody.appendChild(oFragment);
          ????????????????
          //記錄最后一次排序的列索引
          ????????????????oTable.sortCol?=?iCol;
          ????????????}

          ????????
          </script>
          ????
          </head>
          ????
          <body>
          ????????
          <p>Click?on?the?table?header?to?sort?in?ascending?order.</p>
          ????????
          <table?border="1"?id="tblSort">
          ????????????
          <thead>
          ????????????????
          <tr>
          ????????????????????
          <th?onclick="sortTable('tblSort',?0)"?
          ????????????????????????style
          ="cursor:pointer">Last?Name</th>
          ????????????????????
          <th?onclick="sortTable('tblSort',?1)"?
          ????????????????????????style
          ="cursor:pointer">First?Name</th>
          ????????????????????
          <th?onclick="sortTable('tblSort',?2,?'date')"?
          ????????????????????????style
          ="cursor:pointer">Birthday</th>
          ????????????????????
          <th?onclick="sortTable('tblSort',?3,?'int')"?
          ????????????????????????style
          ="cursor:pointer">Siblings</th>
          ????????????????
          </tr>
          ????????????
          </thead>
          ????????????
          <tbody>
          ????????????????
          <tr>
          ????????????????????
          <td>Smith</td>
          ????????????????????
          <td>John</td>
          ????????????????????
          <td>7/12/1978</td>
          ????????????????????
          <td>2</td>
          ????????????????
          </tr>
          ????????????????
          <tr>
          ????????????????????
          <td>Johnson</td>
          ????????????????????
          <td>Betty</td>
          ????????????????????
          <td>10/15/1977</td>
          ????????????????????
          <td>4</td>
          ????????????????
          </tr>
          ????????????????
          <tr>
          ????????????????????
          <td>Henderson</td>
          ????????????????????
          <td>Nathan</td>
          ????????????????????
          <td>2/25/1949</td>
          ????????????????????
          <td>1</td>
          ????????????????
          </tr>
          ????????????????
          <tr>
          ????????????????????
          <td>Williams</td>
          ????????????????????
          <td>James</td>
          ????????????????????
          <td>7/8/1980</td>
          ????????????????????
          <td>4</td>
          ????????????????
          </tr>
          ????????????????
          <tr>
          ????????????????????
          <td>Gilliam</td>
          ????????????????????
          <td>Michael</td>
          ????????????????????
          <td>7/22/1949</td>
          ????????????????????
          <td>1</td>
          ????????????????
          </tr>
          ????????????????
          <tr>
          ????????????????????
          <td>Walker</td>
          ????????????????????
          <td>Matthew</td>
          ????????????????????
          <td>1/14/2000</td>
          ????????????????????
          <td>3</td>
          ????????????????
          </tr>
          ????????????
          </tbody>
          ????????
          </table>????????
          ????
          </body>
          </html>

          posted @ 2007-03-10 17:26 dennis 閱讀(6329) | 評(píng)論 (1)編輯 收藏

               摘要: javacript中對(duì)xml dom的支持,與其他任何特性一樣面臨著瀏覽器兼容問題。一 IE中的XML DOM1.微軟通過ActiveX的MSXML庫提供了支持,通過:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->?var?oXmlDom?=?new...  閱讀全文

          posted @ 2007-03-09 10:21 dennis 閱讀(4281) | 評(píng)論 (1)編輯 收藏

               摘要: 使用MyEclipse編寫web service,并通過java與C#調(diào)用  閱讀全文

          posted @ 2007-03-07 18:13 dennis 閱讀(11136) | 評(píng)論 (17)編輯 收藏

          ??? 最近一直在讀《javascript高級(jí)程序設(shè)計(jì)》的正則表達(dá)式章節(jié),終于對(duì)我一直搞不明白的正則表達(dá)式開始有點(diǎn)感覺了,別人寫的表達(dá)式基本也能看懂了,可要自己熟練地寫還需要多多練習(xí)。推薦一個(gè)學(xué)習(xí)正則表達(dá)式的地方,javaeye的正則表達(dá)式專欄以及正則表達(dá)式工作室

          常用正則表達(dá)式,掌握了規(guī)則,看懂這些表達(dá)式并不困難,當(dāng)然,要達(dá)到熟練寫的程度就不那么容易了。

          匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]

          匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]

          應(yīng)用:計(jì)算字符串的長度(一個(gè)雙字節(jié)字符長度計(jì)2,ASCII字符計(jì)1)

          String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

          匹配空行的正則表達(dá)式:\n[\s| ]*\r

          匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*<\/\1>|<(.*) \/>/

          匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)

          應(yīng)用:javascript中沒有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來實(shí)現(xiàn),如下:

          String.prototype.trim = function()
          {
          return this.replace(/(^\s*)|(\s*$)/g, "");
          }

          利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:

          下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值的Javascript程序:

          function IP2V(ip)
          {
          re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達(dá)式
          if(re.test(ip))
          {
          return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
          }
          else
          {
          throw new Error("Not a valid IP address!")
          }
          }

          不過上面的程序如果不用正則表達(dá)式,而直接用split函數(shù)來分解可能更簡單,程序如下:

          var ip="10.100.20.168"
          ip=ip.split(".")
          alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

          匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

          匹配網(wǎng)址URL的正則表達(dá)式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

          利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:

          var s="abacabefgeeii"
          var s1=s.replace(/(.).*\1/g,"$1")
          var re=new RegExp("["+s1+"]","g")
          var s2=s.replace(re,"")
          alert(s1+s2) //結(jié)果為:abcefgi

          我原來在CSDN上發(fā)貼尋求一個(gè)表達(dá)式來實(shí)現(xiàn)去除重復(fù)字符的方法,最終沒有找到,這是我能想到的最簡單的實(shí)現(xiàn)方法。思路是使用后向引用取出包括重復(fù)的字符,再以重復(fù)的字符建立第二個(gè)表達(dá)式,取到不重復(fù)的字符,兩者串連。這個(gè)方法對(duì)于字符順序有要求的字符串可能不適用。

          得用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1

          s="http://www.gzcynet/page1.htm"
          s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
          alert(s)

          利用正則表達(dá)式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:

          用正則表達(dá)式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

          用正則表達(dá)式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

          用正則表達(dá)式限制只能輸入數(shù)字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          用正則表達(dá)式限制只能輸入數(shù)字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


          posted @ 2007-03-07 09:54 dennis 閱讀(1753) | 評(píng)論 (1)編輯 收藏

          僅列出標(biāo)題
          共56頁: First 上一頁 45 46 47 48 49 50 51 52 53 下一頁 Last 
          主站蜘蛛池模板: 七台河市| 大厂| 分宜县| 嘉祥县| 尖扎县| 丘北县| 游戏| 通化市| 定州市| 抚远县| 丹阳市| 辽中县| 休宁县| 靖江市| 长丰县| 恩平市| 福泉市| 鹤峰县| 赣州市| 广平县| 黎城县| 宁河县| 六枝特区| 宁波市| 颍上县| 余庆县| 肥东县| 黄平县| 玉环县| 惠东县| 滨州市| 若羌县| 丽水市| 南召县| 中方县| 河南省| 长泰县| 宝山区| 洪泽县| 城步| 曲松县|