http://developers.sun.com.cn/blog/functionalca/date/20090804 星期二 2009年08月04日

JavaCC语法分析器

JavaCC(Java Compiler Compiler)是Java实现的语法分析器,用以根据用户自定义规则进行上下文无关语法内容的分析工作,以简化编译器开发时编写涉及词法、语法、语义规则处理代码时的工程量。[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 八月 04, 2009 12:49 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20090620 星期六 2009年06月20日

Java开源GIS项目OpenJUMP

在开源Java GIS领域中,OpenJUMP无疑是敏捷小巧,且功能全面的GIS客户端代名词,能为使用者带来类似ESRI ArcExploer般的地图浏览、编辑和空间分析功能。[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 六月 20, 2009 10:42 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20090604 星期四 2009年06月04日

TPC-C基准的Java数据库Benchmark工具

Author:Gao Ang

事务处理性能委员会(TPC)是创建于1988年的非盈利组织,其宗旨是为了制定事务处理和数据库性能测试基准程序的Benchmark标准规范,目前被广泛用于计算机系统和数据库性能评估。

基准程序TPC-C用于测试联机事务处理(OLTP)的性能,规范的最新版本是5.10。测试过程模拟一个真实的货物管理环境,批发公司有N个仓库,每个仓库供应M个地区,在每个地区为上千名客户提供服务。在测试启动后,N×M个终端操作员向数据库发出新订单(New-Order)、付款(Payment)、订单状态(Order-Status)、库存级别(Stock-Level)、发货(Delivery)等5类事物请求,而性能指标tpmC则代表事务在满足响应时间要求的前题下,每分钟系统处理新订单(New-Order)的数目。

面向数据库系统的TPC-C基准测试,有多种程序实现,商用软件有QUEST公司的Benchmark Factory,以及HP的 LoadRunner,但用TPC-C标准测试数据库性能,也有小巧的开源工具来帮助我们完成这样的工作。

针对Oracle的性能测试,Java编写的SwingBenchHammerora都是不错的选择。但对于Ingres和PostgreSQL等小众数据库的测试,需要其他基于JDBC驱动的通用数据库测试工具来完成。

Apache JMeter是基于Swing的系统性能和负载能力测试工具,同样也可以测试数据库的吞吐能力,并且JMeter在NetBeans 6.7中可以同Profiler工具集成使用,在IDE环境下创建并运行JMeter装载测试脚本。JMeter内置的数据库测试,可以在JMeter的多线程框架下,帮助用户分析数据库所能承载的并发用户数和负载能力,并提供图形化结果反馈,但这款功能全面的测试工具没有提供基于TPC-C基准的数据库测试功能。

作为专用的TPC-C测试工具,开源Java工具BenchmarkSQL更为适合,可以通过JDBC驱动添加各种数据源进行基准测试。工具里面内置了sqlTableCreates、sqlIndexCreates等SQL脚本,在推荐的测试条件下,使用预置脚本创建10个Warehouse,并在数据库中生成100万条测试数据,执行时间最小为1分钟,之后会生成包含5种不同操作的执行时间统计,以及最终tpmC值的结果报表。

感兴趣的用户还可以将默认的索引方式(如ISAM)更改为数据库支持的其他索引(如B树R树索引),来比较不同索引方式下事务处理的性能差异。



发表于 Sun Functional 校园大使 [JavaSE] ( 六月 04, 2009 01:46 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20090320 星期五 2009年03月20日

SwingLabs实验室项目

Author: Gao Ang

Swing是用于开发Java程序GUI界面的工具包,以AWT抽象窗口工具包为基础,帮助开发者只用很少量代码,就可以利用Swing丰富、灵活的功能和模块化组件,构建优雅的程序外观风格。

Swing的架构设计优秀,生成界面的跨平台特性也是目前最完善的,并且运行在JDK 6上,一直制约Swing应用的性能问题得到了显著改善。

SwingLabs开源实验室项目提供了许多简化Swing设计的工具,以帮助开发者改进Swing应用的性能和界面外观。SwingLab提供的组件有:拓展UI界面的SwingX项目,辅助DataSet数据绑定的Databinding项目,面向Web服务集成的SwingX-WS项目,Swing界面布局管理器Swing Layout,Java桌面应用的网络组件JDNC等等,当然还有演示SwingLabs各个开源组件功能的SwingLabs Demos项目。

其中的SwingX项目提供一组强大的Swing桌面UI拓展组件。包括增强的用户登陆对话框JXLoginDialog、每日提醒组件JXTipOfTheDay,以及具备过滤、排序和高亮提示的JXTable、JXTree、JXList等组件。 SwingX提供的界面增强组件都可以非常方便的帮助开发者来改善最终用户的体验。

目前最新的SwingX是0.9.5版本,根据使用者的反馈对JXLoginPane、JXLabel、JXHeader、JXDatePicker、JXMonthView、JXComboBox、JXTable、JXTreeTable等组件进行了修改,使其更加易用。

 

对于Eclipse的使用者,进行Swing的可视化设计需要购买名为Swing Designer的商业收费软件。国内的开发者创建了VisualSwing4Eclipse项目 ,为开发者提供集成在Eclipse中的开放源代码Swing设计器,使得Eclipse中创建Swing项目如同使用NetBeans一样方便。



发表于 Sun Functional 校园大使 [JavaSE] ( 三月 20, 2009 09:52 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20090221 星期六 2009年02月21日

初初级程序员的学习Java编程语言的方案

本文针对Java初初学者,介绍一些学习Java的工具和教程

[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 二月 21, 2009 06:37 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080820 星期三 2008年08月20日

如何在不安装JMF软件包的情况下使用JMF

最近有同学问我一个问题,就是如何在不安装JMF软件包的情况下使用JMF来做多媒体应用程序的开发。我之前曾做过相关的项目开发,一点经验和大家分享。

[Read More]

发表于 Hai-Ou Jiang [JavaSE] ( 八月 20, 2008 01:29 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080615 星期日 2008年06月15日

JavaFX最新发展动态

JavaFX的主页中,我们看到从2007年到2008年这一年时间里JavaFX的发展.在这个网站上,我们仿佛又看到了几乎被多数人遗忘的Java Applet。JavaFX又把它重新带回了Java的世界里.在2008年JavaOne大会上, Denny Craward和Ken Russial为Java开发者们展示了JavaFX的强大:http://news.zdnet.com/2422-13568_22-200560.html

另外,为了提高运行效率,openJFX项目正在开发一个JavaFX编译器,目前的版本是Milestone3,并提供了新的JavaFX SDK以及编译器的Netbeans插件.更令人兴奋的是,JavaFX手机版(JavaFX Mobile)以及TV版将会在09年春季推出,届时,JavaFX的酷炫RIA应用就可以在桌面,浏览器,手机,TV上出现了!

[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 六月 15, 2008 12:50 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080609 星期一 2008年06月09日

物理运动模拟引擎

作者:Gao Ang
邮箱:tomgaoang # gmail.com

Phun源自于瑞典UMU大学硕士生的毕业论文,可以模拟物体的各种物理运动规律。使用者可以通过鼠标绘图来创建物体,并让物体实验重力、摩擦力、弹力、加速度等等不同的物理规律。

C++编写的Phun使用了OpenGLGLEWSDL(用于窗口管理)SDL_image(用于读取图像)以及boost等类库,目前Phun提供了Windows和Linux版的免费下载。Phun为我们展现二维物理规律的模拟,实现运动引擎的开源库还有Java实现的Phys2D和C++实现的Box2D项目。

三维物理运动模拟方面,在Playstation 3,XBox 360,Nintendo Wii等平台的游戏设计上,曾有不错表现的3D游戏引擎Blender同样使用C++实现,使用Java实现的类似引擎还有JBullet,JBullet给出了在线演示的3D。

除此之外,还有大力推荐的Ubigraph,这是一个图论动画生成工具,可以快速生成图论模型并展示其三维结构,演示各种图论算法推算的过程。

相关的项目还有很多,在iPhone平台上,类似的运动模拟引擎是Oolong Engine 2,开发者在站点上放置了在iPhone上模拟的视频。好玩的东东还有Bullet等等,以后或许一有用,先记录在这里。



发表于 Sun Functional 校园大使 [JavaSE] ( 六月 09, 2008 03:31 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080524 星期六 2008年05月24日

拨动 Java 的琴弦

开源 JFrets(一款基于 Java 的吉他教学工具)的创建者 Matt Warman 来到了 JavaOne!他将举办一期技术会议和 BOF。在演讲厅,我们对他进行了单独采访。然后,我们谈到了他们的项目。

本文通过记录记者和 Matt之间的谈话介绍了JFrets项目。

注:

本采访原作者:,翻译自: http://java.dzone.com/news/jfrets-learning-play-guitar-ja。

 

[Read More]

发表于 jerry [JavaSE] ( 五月 24, 2008 03:34 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080522 星期四 2008年05月22日

SOA概念的一些个人见解

    以前接触过一些SOA(Service Oriented Architecture)的概念,也过做一些这方面的应用,但还是觉得不好理解,最近阅读了一些资料,有了更深一层的理解,故得此文,希望能对大家理解SOA有一些帮助。

    其实SOA并不是一种技术,他是一种软件设计的架构和思想,他的根本目的在于把零散的“孤岛系统”整合起来,最大化地做到软件的重用性。我们首先来看一下使用SOA前软件的架构:[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 五月 22, 2008 03:06 上午 ) Permalink | 评论[1]
http://developers.sun.com.cn/blog/functionalca/date/20080519 星期一 2008年05月19日

SCJP完全攻略

很多学校的同学都会问如何申请、准备和考取SCJP,这个月初,自己把相关的资料整理了一下,希望对关注SCJP的CA和同学有帮助。

[Read More]

发表于 SEU [JavaSE] ( 五月 19, 2008 10:30 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080516 星期五 2008年05月16日

Java和电影

  上次去帮南京农业大学的黄珊做技术讲座,我准备了我的关于Java的新课件。当然,这里有一些我找到的电影,是跟Java特性有相似性的。[Read More]

发表于 SEU [JavaSE] ( 五月 16, 2008 07:35 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080511 星期日 2008年05月11日

在JavaSE 6中发布和测试Web服务的实例

    对Webservice的支持是JavaSE6的一大新特性。我们知道,想要发布一个Webservice,首先要创建相关的业务逻辑类,然后把这些业务 逻辑类部署到SOAP服务器上,生成客户端访问的代码,最后部署到客户端进行测试。这是创建一个简单Webservice的主要步骤,事实上,部署和发布 Webservice要复杂的多。而JavaSE6中实现了一个内置的轻量级SOAP服务器,我们可以把Webservice部署到Java平台中,并进 行简单的测试。另外,JavaSE 6中加入了@Webservice等注解(Annotation),有了这些注解,创建Webservice变得十分简单。本实验将在JavaSE 6中创建和发布一个Webservice,并通过Netbeans创建Webservice客户端对已发布的Service进行测试,通过实验来理解 JavaSE 6对Webservice的支持。[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 五月 11, 2008 02:16 上午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080420 星期日 2008年04月20日

Hello Spring (第 2 部分)

NetBeans IDE 6.1 新增了对 Spring 的支持,其好处之一便是可以对它进行扩展。使用 Spring 框架的一个非常简单的入口点就是它的专用 MIME 类型 x-springconfig+xml。通过此 MIME 类型,您可以在编辑器或资源管理器视图的节点中添加新菜单项目,尤其是针对 Spring 配置文件。使用该技巧,我添加了一个名称为 "Generate Java from Beans" 的菜单项:

选择该菜单项时会发生什么呢?我们在文件末尾生成了一些 Java 代码,用于访问各个 Bean。随后,您可以根据需要将它们复制到自己的 Java 类中。将它集成到 Java 类中可能会比较好,这样 bean 就可以出现在代码完成中。但这些操作对我来说要求还比较高,我还需要研究一段时日。目前,我只支持 util:list bean,但是可以方便地将它扩展到所有其他类型。也就是说,选择上面的菜单项之后,IDE 将生成所有注释掉的内容,如下所示:

参见 CookieAction 中的相关 performAction。需要特别注意 org.openide.xml.XMLUtil,它确实是非常有用的(即便您没有意识到这点):

protected void performAction(Node[] activatedNodes) {

//Figure out the name of the configuration file,
//plus its packages, plus "src",
//which is what the org.springframework.core.io.FileSystemResource class needs:

DataObject dobj = activatedNodes[0].getLookup().lookup(DataObject.class);
FileObject fo = dobj.getPrimaryFile();
setFileName(fo.getPath().substring(fo.getPath().indexOf("src")));

try {
//Figure out the document and parse it:
EditorCookie editorCookie = activatedNodes[0].getLookup().lookup(EditorCookie.class);
StyledDocument styledDoc = editorCookie.openDocument();
String allText = styledDoc.getText(0, styledDoc.getLength());
InputSource source = new InputSource(new StringReader(allText));
//No validation, not namespace aware, no entity resolver, no error handler:
Document doc = XMLUtil.parse(source, false, false, null, null);

//Figure out the list of elements:
NodeList list = doc.getElementsByTagName("*");
int docLength = list.getLength();
for (int i = 0; i < docLength; i++) {
org.w3c.dom.Node node = list.item(i);

//Figure out the list of attributes:
NamedNodeMap map = node.getAttributes();
int mapLength = map.getLength();
for (int j = 0; j < mapLength; j++) {
org.w3c.dom.Node attr = map.item(j);

//Insert the template, with values filled in,
//if the attribute is "id":

if (attr.getNodeName().equals("id")) {
setBeanId(attr.getNodeValue());
styledDoc.insertString(styledDoc.getLength(),
"\n<!-- How to access the \"" + attr.getNodeValue() +
"\" bean:\n" + getTemplate(), null);
}

}
}
} catch (SAXException ex) {
Exceptions.printStackTrace(ex);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}

}

另外,模板如下所示:

private String getTemplate() {
template =
"\nBeanFactory factory = new XmlBeanFactory(new FileSystemResource(\"" + getFileName() + "\"));" +
"\nArrayList list = (ArrayList) factory.getBean(\""+getBeanId()+"\");" +
"\nIterator it = list.iterator();" +
"\nint count = 0;" +
"\nwhile (it.hasNext()) {" +
"\n count = count + 1;" +
"\n System.out.println(\""+getBeanId()+" \" + count + \": \" + it.next().toString());" +
"\n}" +
"\n-->\n";
return template;
}

注:本篇文章翻译自 Geertjan's Weblog。原文地址:http://blogs.sun.com/geertjan/entry/hello_spring_part_2

    
    

 



发表于 jerry [JavaSE] ( 四月 20, 2008 01:14 下午 ) Permalink | 评论[0]

Hello Spring (第 1 部分)

我第一次结识 Spring 框架是通过它的 Util 模式。我一直使用 NetBeans IDE 6.1 Beta,因此这一版本的 NetBeans IDE 支持一组专门针对 Spring 的特性,这是史无前例的。它不仅提供了对 Web 应用程序的支持(我将在未来的博客文章中讨论这一点),还提供了对 Java SE 应用程序的支持。下面是我在 Java SE 应用程序中创建的第一个配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-2.5.xsd">
           
    <util:list id="emails">
        <value>john@smith.org</value>
        <value>jack@harry.org</value>
        <value>peter@piper.org</value>
        <value>pavel@prochazka.org</value>
    </util:list>
    
</beans>

在编写上述文件时,上下文相关的代码完成功能为我提供了帮助:

使用新模板创建它:

我需要选择一个或多个名称空间,这样便完全不用考虑Spring配置文件的报头:

我使用下面这个简单的 Java 类访问(和使用)上述 Spring 配置文件:

 

package hellospring;

import java.util.ArrayList;
import java.util.Iterator;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class Main {

    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new FileSystemResource("src/hellospring/demo.xml"));
        ArrayList list = (ArrayList) factory.getBean("emails");
        Iterator it = list.iterator();
        int count = 0;
        while (it.hasNext()) {
            count = count + 1;
            System.out.println("Email " + count + ": " + it.next().toString());
        }
    }
    
}

我还能够在 Spring 配置文件中使用 Java 代码完成功能,特别是针对类的属性:

然后,我可以单击类引用,这将在编辑器中打开该类。

 

最后,我可以组织自己的 Spring 文件。在 Java SE 应用程序的 Project Properties 节点中,当 Spring JAR 位于类路径中时会出现一个新节点,用于组合 Spring 配置文件。

 

最后,有关新 Spring 支持的更多信息,请参阅 Ramon Ramos 的博客文章 Improved Spring Framework Support in NetBeans 6.1: XML-Config Files

注:本篇文章翻译自 Geertjan's Weblog。原文地址:http://blogs.sun.com/geertjan/entry/hello_spring



发表于 jerry [JavaSE] ( 四月 20, 2008 12:58 下午 ) Permalink | 评论[0]
http://developers.sun.com.cn/blog/functionalca/date/20080411 星期五 2008年04月11日

DWR详解(二)——反向AJAX

   上一篇文章(DWR详解一)提到DWR允许javascript访问服务器端的Java方法,这使得AJAX使用起来会比较容易,而在DWR2.0里面添加了一个非常强大的功能——反向AJAX,也就是说,服务器端的Java方法可以取得浏览器端的Web上下文,并可以调用javascript的方法,将服务器端的数据异步地传输给浏览器。本文将通过一个demo展示这种特性。这个demo实现了类似股票交易系统中实时更新数据的功能,事实上是通过发布-订阅模式去实现的。也就是说,客户端订阅一个主题,服务器端通过一个线程向订阅这个主题的浏览器定时、异步地发送数据,从而实现了这种实时更新的功能。工程代码请点击这里下载:reverseAjaxDemo

    我们知道,客户端浏览器可以随时连接到web服务器,并向服务器请求资源,而服务器却没有这种能力,它不能主动地于客户端浏览器建立连接,并主动地将数据发送给浏览器。DWR支持3种从服务器端发送数据给客户端的方式:

1、轮询。客户端在每个时间周期内向服务器发送请求,看看服务器端有没有数据更新,如果有,就向服务器请求数据。

2、Comet:基于HTTP长连接的服务器推动方式。客户端向服务器发送请求后,服务器将数据通过response发送给客户端,但并不会将此response关闭,而是一直通过response将最新的数据发送给客户端浏览器,直到客户端浏览器关闭。

3、PiggyBack(回传)。服务器端将最新的数据排成队列,然后等待客户端下一次请求,接收到请求后就将等待更新的数据发给客户端。

这3种方式各有优劣,而DWR可以同时支持轮询和Comet。

首先,我们要让DWR程序支持反向AJAX。只需要在web.xml中DWRServlet里添加一个初始化参数:

<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>

...
</servlet>

另外,这个demo使用了TIBCO General Interface(GI)的AJAX框架,因此需要引入JSX这个组件库以及在gidemo目录下在config.xml和appCanvas.xml定义需要使用的组件(主要是用到Matrix数据表格这个组件),关于TIBCO GI,请参考http://www.tibco.com/devnet/index.html

这个demo的核心之处在于服务器端的发布者——Publisher.java,在这个类里面,首先通过org.directwebremoting.WebContext来获得访问这个应用的Web上下文:

WebContext webContext = WebContextFactory.get();
ServletContext servletContext = webContext.getServletContext();
serverContext = ServerContextFactory.get(servletContext);

webContext.getScriptSessionsByPage("");

这里主要通过WebContext类获得DWR应用的WEB上下文,用ServletContext获得DWRServlet的上下文,以及通过WEB上下文获取访问本应用的客户端浏览器的ScriptSession。通过ScriptSession,可以在服务器端向客户端浏览器发出执行js方法的指令,并把服务器端数据传送给js方法,具体的用法如下:

Collection sessions = serverContext.getScriptSessionsByPage("/reverseAjaxDemo/index.html");
ScriptProxy proxy = new ScriptProxy(sessions);
Corporation corp = corporations.getNextChangedCorporation();
proxy.addFunctionCall("OpenAjax.publish", "gidemo", "corporation", corp);

这段代码首先通过getScriptSessionsByPage方法获得所有访问/reverseAjaxDemo/index.html这个资源的客户端浏览器的ScriptSession,并为这些session建立代理(ScriptProxy),通过这个代理,让客户端执行OpenAjax.publish的js方法(见OpenAjax.js)。其中addFunctionCall就是向客户端发送执行js方法的服务器端方法,第一个参数是js方法的签名,后面的都是js方法的参数。其中"gidemo"是服务器端发布的主题(topic),"coporation"是要发布的变量,而corp则是要发布的即时数据。corp这个对象是随机生成的(见Corporation和Corporations类),Publish.java这个类启动了一个线程(worker),这个线程不断地生成corporation的数据,并发布给客户端。

以下是html页面的核心部分的代码:

<div style="width:100%; height:280px;" id="gidemo">
      <script type="text/javascript"
              src="JSX/js/JSX30.js"
              jsxapppath="gidemo"
               jsxlt="true"> </script>
</div>

这一块代码主要是使用了GI的matrix组件,该组件可以动态加载数据。另外,页面引入了index.js,里面有两个个主要方法:


function giLoaded() {
  OpenAjax.subscribe("gidemo", "corporation", objectPublished);
  dwr.engine.setActiveReverseAjax(true);
}

function objectPublished(prefix, name, handlerData, corporation) {
  var matrix = giApp.getJSXByName("matrix");
  var inserted = matrix.getRecordNode(corporation.jsxid);
  matrix.insertRecord(corporation, null, inserted == null);

  // There are many ways to get a table to repaint.
  // One easy way is to ask it to repaint:
  // matrix.repaintData();

  // But we are going for a fancy option that does highlighting
  for (var property in corporation) {
    if (property != "jsxid") {
      var ox = matrix.getContentElement(corporation.jsxid, property);
      if (ox) {
        var current = ox.innerHTML;
        if (current != "" + corporation[property]) {
          ox.style.backgroundColor = "#FDE4EB";
          var callback = function(ele) {
            return function() { ele.style.backgroundColor = "#FFFFFF"; };
          }(ox);
          setTimeout(callback, 1000);
          ox.innerHTML = corporation[property];
        }
      }
    }
  }
}

giLoaded方法通过OpenAjax.subscribe方法订阅主题为"gidemo"的数据(这些数据由服务器端的Java方法进行发布)。其中objectPublished是一个回调方法,表示取得数据后页面的改变。该回调方法非常简单,只是将matrix组件中发生变化的数据改变一下颜色,实现了实时提醒数据更新的功能。

另外,服务器端还有一个监听器PublisherServletContextListener,这是为了在适当的时候关闭发布者的线程。这个监听器要结合其他两个DWR的监听器使用,只需在web.xml里面声明就行了:

<listener>
     <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class>
</listener>
<listener>
        <listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>gidemo.PublisherServletContextListener</listener-class>
    </listener>

最后,看一下dwr的映射关系dwr.xml:

<dwr>
  <allow>
    <create creator="new" javascript="JDate">
      <param name="class" value="java.util.Date"/>
    </create>
    <create creator="new" javascript="Publisher" scope="application">
      <param name="class" value="gidemo.Publisher"/>
    </create>
    <convert converter="bean" match="gidemo.Corporation"/>

    <!-- this is a bad idea for live, but can be useful in testing -->
    <convert converter="exception" match="java.lang.Exception"/>
    <convert converter="bean" match="java.lang.StackTraceElement"/>
  </allow>
</dwr>

注意红色部分的配置,dwr允许将自定义的Java类型与js对象进行相互转换,但要声明转换器。

以下是程序运行的结果:


 

 

这个例子比较复杂,旨在让大家对反向AJAX的原理有所了解。下一篇文章开始,将用一些简单的例子来说明DWR反向AJAX的用法。

参考资料:

http://getahead.org/dwr/reverse-ajax

 



发表于 Sun Functional 校园大使 [JavaSE] ( 四月 11, 2008 01:17 上午 ) Permalink | 评论[1]
http://developers.sun.com.cn/blog/functionalca/date/20080406 星期日 2008年04月06日

DWR详解——会变魔术的Javasript(一)

Javascript在AJAX(Asyncronize Javascript And XML)技术中扮演者非常重要的角色,但是对于Java程序员来说,编写Javascript并不是一件容易的事情,而要做到Javascript与服务 器端的Java对象交互更是困难。DWR(Direct Web Remoting)帮助我们解决了这个问题,让Javascript能够非常简便地与Java对象进行交互,让程序员感觉在Javascript中调用一 个方法就像调用一个Java对象里的方法一样。[Read More]

发表于 Sun Functional 校园大使 [JavaSE] ( 四月 06, 2008 03:25 上午 ) Permalink | 评论[0]