發(fā)表于:2007-9-13 21:42 標(biāo)題:JsJava發(fā)布2.0版本 <上一帖 | 下一帖>2007年9月11日,JsJava團(tuán)隊(duì)發(fā)布了JsJava2.0版本,該版本不僅增加了許多新的類庫,而且參照J(rèn)2SE1.4,大量使用了類的繼承和實(shí)現(xiàn)機(jī)制,更加符合面向?qū)ο蟮脑瓌t,也更加方便用戶使用和擴(kuò)充,而且對(duì)原來版本中存在一些bug進(jìn)行了修改,下面主要介紹一下2.0版的主要功能。 1,實(shí)現(xiàn)了完整的聚集(collections)框架,主要包括列表(List)、哈西表(Hashtable)、集合(Set)、位集合(BitSet)、屬性表(Properties)、迭代器(Iterator)、堆棧(Stack)、枚舉器(Enumeration)、比較器(Comparator)等等,這大大方便了與聚集相關(guān)的操作,例如: 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,實(shí)現(xiàn)了xml的處理,主要是對(duì)主流瀏覽器的內(nèi)置xml解析做了封裝,2.0版本中對(duì)非IE的Xpath做了很好的封裝,因此可以直接使用JsJava2.0的xpath來處理xml文本,下面舉一個(gè)使用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);
4 ,實(shí)現(xiàn)了對(duì)日期和數(shù)字的格式化處理,這個(gè)在實(shí)際編程中是非常方便的,例如: var df=new SimpleDateFormat(); df.applayPattern("MM-dd-yyyy hh:mm:ss"); var str=df.format(new Date()); alert(str);//結(jié)果形式形如: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,實(shí)現(xiàn)了數(shù)據(jù)驗(yàn)證,并默認(rèn)支持了多種驗(yàn)證器,包括URL、Email、范圍、IP等驗(yàn)證器。例如: var urlValidator=new URLValidator(); var flag=urlValidator.validate("http://www.jsjava.com"); alert(flag);//the result is true 而且提供了一個(gè)通用的驗(yàn)證工具類ValidatorUtils,里面提供許多實(shí)用類方法,另外針對(duì)中國(guó)地區(qū)用戶我們實(shí)現(xiàn)了許多常用的一些驗(yàn)證器,例如漢字驗(yàn)證、居民身份證驗(yàn)證、Oicq號(hào)碼驗(yàn)證等等。 6,實(shí)現(xiàn)了頁面動(dòng)畫的支持,動(dòng)畫的播放原理,借鑒了Flash的思想,即一個(gè)動(dòng)畫是有一系列場(chǎng)景組成,每個(gè)場(chǎng)景是由一系列關(guān)鍵幀組成,而每一個(gè)幀則代表了一個(gè)實(shí)際控制點(diǎn),那么當(dāng)時(shí)間線流過的時(shí)候,多個(gè)場(chǎng)景的幀依次播放,就形成了任意線程合成動(dòng)畫效果,具體可以參考http://jsjava.sourceforge.net/solutions/webpageanimation.html。 7,實(shí)現(xiàn)了對(duì)Ajax的支持,JsJava2.0中對(duì)Ajax做了一層面向?qū)ο蟮姆庋b,留出了許多接口,可以讓編程人員更多的控制Ajax的細(xì)節(jié),舉例如下: 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,實(shí)現(xiàn)了對(duì)地理信息的封裝,JsJava2.0主要實(shí)現(xiàn)了對(duì)中國(guó)省級(jí)、市級(jí)行政區(qū)的信息封裝,可以方便獲取相關(guān)信息,例如:
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(); for(var i=0;i
顯示如下:
9,實(shí)現(xiàn)了對(duì)日歷和農(nóng)歷的支持,日歷對(duì)象Calendar是參照java.util.Calendar實(shí)現(xiàn)的,農(nóng)歷僅實(shí)現(xiàn)對(duì)中國(guó)農(nóng)歷的支持,舉例如下: var c = new GregorianCalendar(); c.setTime(new Date(2007,2,8)); document.write("Calendar.WEEK_OF_YEAR:"+c.get(Calendar.WEEK_OF_YEAR); 通過JsJava的日歷對(duì)象,你可以方便的獲得與日期相關(guān)的許多方面,例如可以知道某個(gè)日期是所在月的第幾周,知道是這一年中的第幾天等等,如果你對(duì)Java的Calendar很熟悉,你就明白它的強(qiáng)大了。 輸出為:Calendar.WEEK_OF_YEAR:10 另外,為了方便中國(guó)區(qū)用戶對(duì)農(nóng)歷的計(jì)算,我們特別定義了一個(gè)ChinaLunarCalendar對(duì)象,該對(duì)象可以方便將公歷轉(zhuǎn)換為農(nóng)歷,例如下面的例子:
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+" "); }
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); }
Console.open(); System.out.println("This is very good!"); System.out.println("Now ok!"); function getNowTime(){ System.out.println("start method"); for(var i=0;i 顯示結(jié)果為:
var xmlStr='eye_of_back的專欄 - IT技術(shù)經(jīng)驗(yàn)交流中心http://blog.csdn.net/eye_of_back/category/245118.aspxaf.Text Version 1.0.1.1http://counter.csdn.net/pv.aspx?id=72回眸IT技術(shù)經(jīng)驗(yàn)交流中心簡(jiǎn)介...(rss xml內(nèi)容較多省略)'; 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 顯示結(jié)果為: {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技術(shù)經(jīng)驗(yàn)交流中心簡(jiǎn)介,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=面對(duì)未來我們更需要思考,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=介紹目前中心關(guān)注的群,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=中心知識(shí)庫建成!,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=面向大學(xué)生IT技術(shù)培訓(xùn),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技術(shù)經(jīng)驗(yàn)交流中心,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,實(shí)現(xiàn)了對(duì)頁面打印的支持,當(dāng)然了調(diào)用的window.print就可以實(shí)現(xiàn)頁面整體打印,但是在實(shí)際應(yīng)用中,我們用的更多的則是對(duì)頁面中某個(gè)部分進(jìn)行打印,例如只想打印文章正文內(nèi)容,對(duì)于上面的邊框和下面的一些按鈕就不需要,那如何實(shí)現(xiàn)局部的打印呢? 當(dāng)然通常的做法有兩種,一種是打印前將不需要的頁面部分隱藏,打印完成后在放開,這個(gè)只要定義document的onbeforeprint和onafterprint事件即可,另外一種方式,就是將需要打印的內(nèi)容拷貝到事先準(zhǔn)備好的一個(gè)隱藏的iframe之中,然后調(diào)用iframe的打印即可。 那么JsJava之中如果方便的對(duì)打印提供支持呢?如下面的代碼: var print=new HtmlPrint(); var printArea=new HtmlPrintArea("info");//打印區(qū)域的頁面id,例如可能是某個(gè)div的標(biāo)識(shí) print.setArea(printArea); print.print(); 具體使用和方案,可以訪問http://www.jsjava.com網(wǎng)站,參看其中的solutions。 13,實(shí)現(xiàn)了對(duì)光標(biāo)的操作,尤其是web程序員們都非??鄲赖墓鈽?biāo)定位等問題,JsJava2.0都做了很好的實(shí)現(xiàn),通過JsJava的API,你可以方便的獲得光標(biāo)在文本輸入域中的具體位置,可以方便的將光標(biāo)移動(dòng)到文本框的指定位置,也可以任意選擇指定范圍的文本,例如下面的例子:
function getCursorPosition(textObj){ alert(CursorUtils.getCursorPosition(textObj)); } function setCursorPos(){ CursorUtils.moveCursorTo(document.getElementById("t"),8); } function setSelectText(){ CursorUtils.textSelect(document.getElementById("t"),8,12); }
function getData(){ var data=ClipboardUtils.getTextFromClipboard(); t.value=data; } function setData(){ ClipboardUtils.copyTextToClipboard("This is a copy test!"); }