1. 程式人生 > >JavaScript進階(十一)JsJava2.0版本

JavaScript進階(十一)JsJava2.0版本

JavaScript進階(十一)JsJava2.0版本

      2007911日,JsJava團隊釋出了JsJava2.0版本,該版本不僅增加了許多新的類庫,而且參照J2SE1.4,大量使用了類的繼承和實現機制,更加符合面向物件的原則,也更加方便使用者使用和擴充,而且對原來版本中存在一些bug進行了修改,下面主要介紹一下2.0版的主要功能。

1. 實現了完整的聚集(collections)框架

   主要包括列表(List)、哈西表(Hashtable)、集合(Set)、位集合(BitSet)、屬性表(Properties)、迭代器(Iterator)、堆疊(Stack)、列舉器(Enumeration

)、比較器(Comparator)等等,這大大方便了與聚集相關的操作,例如:

    var list=new ArrayList();

    list.add("a");

    list.add("b");

    list.add(new Date());

    Iterator it=list.iterator();

    while(it.hasNext()){

      var elem=it.next();

   }

   var hash=new Hashtable();

   hash.put("key1","value1");

   hash.put(new Date(),"value2");

   var set=new TreeSet();

   set.add("a");

2. 實現了xml的處理

   主要是對主流瀏覽器的內建xml解析做了封裝,2.0版本中對非IEXpath做了很好的封裝,因此可以直接使用JsJava2.0xpath來處理xml文字,下面舉一個使用JsJava xml處理的例子:

    var xp=new XmlBrowserParser();

    var xml="user1user2user3";

    xp.loadXml(xml);

    var xmlDoc=xp.toDocument();

    var usersElem=xmlDoc.getElementsByTagName("user");

    document.write("The number of user tag:"+usersElem.length);

    //You can alse use xpath

   var usersElem= xmlDoc.documentElement.selectNodes("user");

   document.write("The number of user tag:"+usersElem.length);

3. 實現了對部分高等數學算的支援

    包括矩陣、概率分佈、統計、複數等等,具體可以參考http://jsjava.sourceforge.net/solutions/mathsolution.html ,下面舉一個簡單例子:

    var c=new Complex(3,5);

    document.write(c.abs()+"");

    document.write(c.add(new Complex(5,7))+"");

    document.write(c.conjugate()+"");

    document.write(c.isInfinite()+"");

    document.write(c.isNaN()+"");

    document.write(c.multiply(new Complex(6,6)).getReal()+"");

    document.write(c.negate()+"");

    document.write(c.subtract(new Complex(2,4)));

4. 實現了對日期和數字的格式化處理

      這個在實際程式設計中是非常方便的,例如:

    var df=new SimpleDateFormat();

    df.applayPattern("MM-dd-yyyy hh:mm:ss");

    var str=df.format(new Date());

    alert(str);//結果形式形如:11-25-2006 13:23:35

    var df=new DecimalFormat();

    df.applayPattern("00.000%");

    var str=df.format(0.0678567);

    alert(str);// the result is 6.786%

5. 實現了資料驗證,並預設支援了多種驗證器,包括URLEmail、範圍、IP等驗證器

      例如:

    var urlValidator=new URLValidator();

    var flag=urlValidator.validate("http://www.jsjava.com");

    alert(flag);//the result is true

而且提供了一個通用的驗證工具類ValidatorUtils,裡面提供許多實用類方法,另外針對中國地區使用者我們實現了許多常用的一些驗證器,例如漢字驗證、居民身份證驗證、Oicq號碼驗證等等。

6. 實現了頁面動畫的支援

      動畫的播放原理,借鑑了Flash的思想,即一個動畫是有一系列場景組成,每個場景是由一系列關鍵幀組成,而每一個幀則代表了一個實際控制點,那麼當時間線流過的時候,多個場景的幀依次播放,就形成了任意執行緒合成動畫效果,具體可以參考http://jsjava.sourceforge.net/solutions/webpageanimation.html

7. 實現了對Ajax的支援

      JsJava2.0中對Ajax做了一層面向物件的封裝,留出了許多介面,可以讓程式設計人員更多的控制Ajax的細節,舉例如下:

    var req=new AjaxRequest();

    req.setRequestMethod("post");

    req.setRequestURL("ajaxresponse.jsp");

    req.setAsync(true);

    req.setMethodOnSuccess(parseXml);

    req.setRequestHeader("Content-Type","text/html;charset=gb2312");

    req.send();

    function parseXml(){

      alert(req.getResponseText());

   }

8. 實現了對地理資訊的封裝

      JsJava2.0主要實現了對中國省級、市級行政區的資訊封裝,可以方便獲取相關資訊,例如:

    function w(str){

        document.write(str+"");

    }

    var country=ChinaInformationLoader.load();

    w(country);

    w("---------------");

    var province=country.getProvinceById("Guangxi");

    w(province);

    w("---------------");

    var cities=province.getCities();

9. 實現了對日曆和農曆的支援

      日曆物件Calendar是參照java.util.Calendar實現的,農曆僅實現對中國農曆的支援,舉例如下:

var c = new GregorianCalendar();

c.setTime(new Date(2007,2,8));

document.write("Calendar.WEEK_OF_YEAR:"+c.get(Calendar.WEEK_OF_YEAR);

通過JsJava的日曆物件,你可以方便的獲得與日期相關的許多方面,例如可以知道某個日期是所在月的第幾周,知道是這一年中的第幾天等等,如果你對JavaCalendar很熟悉,你就明白它的強大了。

  輸出為:Calendar.WEEK_OF_YEAR:10

  另外,為了方便中國區使用者對農曆的計算,我們特別定義了一個ChinaLunarCalendar物件,該物件可以方便將公曆轉換為農曆,例如下面的例子:

    var c=new ChinaLunarCalendar();

    c.setTime(new Date(2005,5,6));

    out(c.getTianGan()+":"+c.getDescOfTianGan());

    out(c.getDiZhi()+":"+c.getDescOfDiZhi());

    out(c.getShengXiao()+":"+c.getDescOfShengXiao());

    out(c.getYear()+":"+c.getDescOfYear());

    out(c.getMonth()+":"+c.getDescOfMonth());

    out(c.getDate()+":"+c.getDescOfDate());

    out(c.getDay()+":"+c.getDescOfDay());

    out(c.getHours()+":"+c.getDescOfHours());

    function out(str){

        document.write(str+"");

    }

輸出結果為:

1:

9:

9:

2005:乙酉年

4:四月

30:

1:星期一

1:子時 

10. 實現了對I/O的支援

      I/O是重量級程式語言中都支援的輸入/輸出的各種操作,例如讀取系統中的檔案,或者將內容輸入到本地檔案系統中,當然I/O的概念的外延很廣,例如可以從某個URL來獲取URL所代表的資源的內容,那麼這就代表了一個輸入。

那麼I/O體現到Web介面之中,又該如何解釋呢?我們知道在HTML之中,有文字輸入空間text inputtextarea,這個可以理解為輸入裝置,而等則可以看做是輸出裝置,當然了對於text inputtextarea而言,它們也可以被看做是輸出裝置,我們看一個JsJava中的一個實現:

    window.onload=function(){

        var outputDevice=new HTMLTextDevice("info");

        var append=true;

        Var outputStream=new HTMLTextOutputStream(new OutputStream(outputDevice),append);

        outputStream.println("This is a text output stream!");

        outputStream.println("Is append:"+append);

    }

  另外我們為JS添加了一個類似系統命令列視窗的JS控制檯,使用方式如下:

    Console.open();

    System.out.println("This is very good!");

    System.out.println("Now ok!");

    function getNowTime(){

        System.out.println("start method");

}

11. 實現了對blogrss內容的解析

      並將解析後的結果生成為一系列的JsJava物件,操作起來很方便,如下例子所示:

    var xmlStr='eye_of_back的專欄 - IT技術經驗交流中心http://blog.csdn.net/eye_of_back/category/245118.aspxaf.Text Version 1.0.1.1http://counter.csdn.net/pv.aspx?id=72回眸IT技術經驗交流中心簡介...rss xml內容較多省略)';

    var reader=new BlogRssReader();

    var blogRss=reader.readRss(xmlStr);

    var channel=blogRss.getRssChannel();

    document.write(channel.getImage()+"

");

    var items=channel.getItems();//獲取該頻道所有的文章

    for(var i=0;i

顯示結果為:

  {title=undefined,link=undefined,url=http://counter.csdn.net/pv.aspx?id=72}

{id=http://blog.csdn.net/eye_of_back/archive/2007/02/28/1517453.aspx,creator=回眸,title=IT技術經驗交流中心簡介,link=http://blog.csdn.net/eye_of_back/archive/2007/02/28/1517453.aspx,pubDate=Wed, 28 Feb 2007 20:00:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1517453.aspx,itemId=undefined,commentRss=undefined}}

{id=http://blog.csdn.net/eye_of_back/archive/2007/02/25/1514302.aspx,creator=回眸,title=面對未來我們更需要思考,link=http://blog.csdn.net/eye_of_back/archive/2007/02/25/1514302.aspx,pubDate=Sun, 25 Feb 2007 21:39:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1514302.aspx,itemId=undefined,commentRss=undefined}}

{id=http://blog.csdn.net/eye_of_back/archive/2007/02/09/1506668.aspx,creator=回眸,title=介紹目前中心關注的群,link=http://blog.csdn.net/eye_of_back/archive/2007/02/09/1506668.aspx,pubDate=Fri, 09 Feb 2007 22:24:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1506668.aspx,itemId=undefined,commentRss=undefined}}

{id=http://blog.csdn.net/eye_of_back/archive/2007/02/09/1506666.aspx,creator=回眸,title=中心知識庫建成!,link=http://blog.csdn.net/eye_of_back/archive/2007/02/09/1506666.aspx,pubDate=Fri, 09 Feb 2007 22:21:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1506666.aspx,itemId=undefined,commentRss=undefined}}

{id=http://blog.csdn.net/eye_of_back/archive/2006/10/10/1328096.aspx,creator=回眸,title=面向大學生IT技術培訓,link=http://blog.csdn.net/eye_of_back/archive/2006/10/10/1328096.aspx,pubDate=Tue, 10 Oct 2006 07:44:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1328096.aspx,itemId=undefined,commentRss=undefined}}

{id=http://blog.csdn.net/eye_of_back/archive/2006/10/09/1327718.aspx,creator=回眸,title=歡迎大家訪問IT技術經驗交流中心,link=http://blog.csdn.net/eye_of_back/archive/2006/10/09/1327718.aspx,pubDate=Mon, 09 Oct 2006 21:11:00 GMT,comments={id=http://blog.csdn.net/eye_of_back/comments/1327718.aspx,itemId=undefined,commentRss=undefined}}

12. 實現了對頁面列印的支援

      當然了呼叫的window.print就可以實現頁面整體列印,但是在實際應用中,我們用的更多的則是對頁面中某個部分進行列印,例如只想列印文章正文內容,對於上面的邊框和下面的一些按鈕就不需要,那如何實現區域性的列印呢?

當然通常的做法有兩種,一種是列印前將不需要的頁面部分隱藏,列印完成後再放開,這個只要定義documentonbeforeprintonafterprint事件即可,另外一種方式,就是將需要列印的內容拷貝到事先準備好的一個隱藏的iframe之中,然後呼叫iframe的列印即可。

那麼JsJava之中如果方便的對列印提供支援呢?如下面的程式碼:

var print=new HtmlPrint();

var printArea=new HtmlPrintArea("info");//列印區域的頁面id,例如可能是某個div的標識

print.setArea(printArea);

print.print(); 

13. 實現了對游標的操作

      尤其是web程式設計師們都非常苦惱的游標定位等問題,JsJava2.0都做了很好的實現,通過JsJavaAPI,你可以方便的獲得游標在文字輸入域中的具體位置,可以方便的將游標移動到文字框的指定位置,也可以任意選擇指定範圍的文字,例如下面的例子:

      function getCursorPosition(textObj){

        alert(CursorUtils.getCursorPosition(textObj));

    }

    function setCursorPos(){

        CursorUtils.moveCursorTo(document.getElementById("t"),8);

    }

    function setSelectText(){

        CursorUtils.textSelect(document.getElementById("t"),8,12);

    }

14. 實現了對系統剪貼簿的操作,可以方便的將內容放到到剪貼簿以及從剪貼簿中獲取內容

      例如下面的例子:

    function getData(){

        var data=ClipboardUtils.getTextFromClipboard();

        t.value=data;

    }

    function setData(){

        ClipboardUtils.copyTextToClipboard("This is a copy test!");

    }

15. 實現了對顏色的相關操作

      例如實現了RGB顏色以及灰度的控制,可以方便的在RGB和十六進位制顏色之間進行轉換,也提供了相關方法,可以方便的得到一個隨機的顏色矩陣,這為顏色面板的製作提供了很好的資料,例如:

    var hexColors=ColorUtils.toPaletteDatum(9,9);

    var str="";

    for(var i=0;i";

        for(var j=0;j  ";

        }

        str+="";

    }

    str+="";

    document.write(str); 

    顯示結果為:

[attach]58362[/attach]

16. 除上面之外,JsJava2.0還實現了許多其他的功能

  JsJava發展到2.0版本,已經完全可以作為一個JS基礎框架和應用框架,支援介面端JS產品的開發,也適合於web專案和產品的日常開發與應用,JsJava的關注點是資料結構的完整和類庫體系的完整,這與目前流程的portotype.js等是不太一樣,因此JsJava是更適合為應用服務的...