发表于:2007-9-13 21:42 标题:JsJava发布2.0版本 <上一帖 | 下一帖>2007年9月11日,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版本中对非IE的Xpath做了很好的封装,因此可以直接使用JsJava2.0的xpath来处理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);
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,实现了数据验证,并默认支持了多种验证器,包括URL、Email、范围、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(); for(var i=0;i
显示如下:
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的日历对象,你可以方便的获得与日期相关的许多方面,例如可以知道某个日期是所在月的第几周,知道是这一年中的第几天等等,如果你对Java的Calendar很熟悉,你就明白它的强大了。 输出为: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+" "); }
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"); for(var i=0;i 显示结果为:
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就可以实现页面整体打印,但是在实际应用中,我们用的更多的则是对页面中某个部分进行打印,例如只想打印文章正文内容,对于上面的边框和下面的一些按钮就不需要,那如何实现局部的打印呢? 当然通常的做法有两种,一种是打印前将不需要的页面部分隐藏,打印完成后在放开,这个只要定义document的onbeforeprint和onafterprint事件即可,另外一种方式,就是将需要打印的内容拷贝到事先准备好的一个隐藏的iframe之中,然后调用iframe的打印即可。 那么JsJava之中如果方便的对打印提供支持呢?如下面的代码: var print=new HtmlPrint(); var printArea=new HtmlPrintArea("info");//打印区域的页面id,例如可能是某个div的标识 print.setArea(printArea); print.print(); 具体使用和方案,可以访问http://www.jsjava.com网站,参看其中的solutions。 13,实现了对光标的操作,尤其是web程序员们都非常苦恼的光标定位等问题,JsJava2.0都做了很好的实现,通过JsJava的API,你可以方便的获得光标在文本输入域中的具体位置,可以方便的将光标移动到文本框的指定位置,也可以任意选择指定范围的文本,例如下面的例子:
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!"); }