JavaFX RIA企业应用简要

JavaFX结合Hessian可以访问服务器端Web应用,JavaFX等RIA和Struts等是同一个层面的,都属于表现层,架构应该是这样:JavaFX + Hessian + Servlet + Spring/Seam/Jdon。

Hessian主要是一个Proxy开源项目,可以让远程富客户端RIA可以象调用本地Java代码一样调用,类似RMI,不过是基于Http的RMI。

这里关键是要自己做一个Servlet,也就是Hessian通讯的服务器端,Servlet是一个业务层服务的代理,Flamingo开源项目已经提供Seam/Spring的现成Servlet(http://exadel.com/web/portal/flamingo),而Jdon框架的Servlet需要参考Flamingo做一个,我会拓展到下一个版本发布。

首先看看步骤:
一. 客户端代码分两个,一个JavaFX 相当于MVC模式中的View,与B/S架构中的html类似;一个是Java客户端代码,相当于MVC的Controller,主要用来和服务器通讯调用(通过Hessian)。

下面是Java客户端控制器代码:


public class HelloworldClient {

public static HelloworldClient CLIENT;

private String _url;

private HelloworldClient(String string) {
_url = string;
}
private HelloService _service;

public static void setServerUrl(String url) {
CLIENT = new HelloworldClient(url);
}

private HelloService getService() {
if (_service == null) {
try {
//通过Hessian调用服务器端服务
HessianProxyFactory factory = new HessianProxyFactory();
_service = (HelloService) factory.create(HelloService.class, _url);
} catch (MalformedURLException ex) {
System.out.println(ex);
}

}

return _service;
}

//供JavaFX调用
public String hello(String s) {
return getService().hello(s);
}
}

下面是JavaFX代码:


class Hello {
attribute name:String;
attribute str:String;
}

var helloModel = new Hello();

HelloworldClient.setServerUrl(ARGUMENTS:String);

Frame {
width: 300
height: 200
title: "Exadel Flamingo Helloworld Spring Sample"
centerOnScreen: true
onClose: operation(){ System.exit(0);}
content: GridPanel {
border: EmptyBorder {
top: 30
left: 30
bottom: 30
right: 30
}
rows: 3
columns: 1
vgap: 10
cells:
[TextField {
value: bind helloModel.name
},
Button {
text:
"Say Hello!"
action: operation() {
//调用Controller控制器HelloworldClient的hello方法
//将返回结果赋值给JavaFX的数据对象helloModel
helloModel.str = HelloworldClient.CLIENT.hello(helloModel.name);
}
},
Label {
text: bind
"Server says: {helloModel.str}"
}]
}
visible: true
};


二. 服务器端主要是配置Servlet,在Web.xml中配置如下Servlet:

<servlet>
<servlet-name>Exadel Flamingo Hessian2Spring Remote Servlet</servlet-name>
<servlet-class>com.exadel.flamingo.service.spring.HessianToSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Exadel Flamingo Hessian2Spring Remote Servlet</servlet-name>
<url-pattern>/flamingo/hessian/*</url-pattern>
</servlet-mapping>

以上Servlet是针对Spring框架的,Flamingo 也有Seam框架,当然,Flamingo不会提供Jdon框架的Servlet,不过参考Spring的Servlet实现起来应该很方便,我会加入Jdon框架下一个版本。

这样,使用JavaFX我们就可以方便实现一个富客户端的新型多层C/S架构应用,JavaFX当然不会替代AJAX,但是拥有一些自己的独特特点,对于一些领域应用还是有市场的,加上简洁的类似JavaScrpt的表达方式,无缝和java结合,真的是Swing或Applet的替代物。


[该贴被banq于2009-06-29 10:02修改过]
[该贴被banq于2009-06-29 10:02修改过]

Jdon的Remote Access已经整入JdonFramework 5.8中,在线演示:http://www.jdon.com:8080/jdonremote/

JavaFX + Hessian + Jdon 源码下载:
https://sourceforge.net/project/showfiles.php?group_id=126953&package_id=138962

开发简要步骤:
在web.xml配置Hessian Servlet Proxy如下:
<servlet>
<servlet-name>Hessian2Jdon</servlet-name>
<servlet-class>com.jdon.bussinessproxy.remote.HessianToJdonServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hessian2Jdon</servlet-name>
<url-pattern>/remote/*</url-pattern>
</servlet-mapping>

这样,当远程客户端调用http://localhost:8080//remote/helloService,那么这个Servlet 将在jdonframeowrk.xml查找服务名称为helloService的服务:
<app>
<services>
<pojoService name="helloService" class="sample.HelloServiceImpl"/>
</services>
</app>
远程客户端代码如下:
HessianProxyFactory factory = new HessianProxyFactory();
HelloService _service = (HelloService)
factory.create(HelloService.class, _url);
_service.hello(s);
客户端调用HelloService的hello方法时,将激活HelloServiceImpl.hello方法。Demo在线演示网址:http://www.jdon.com:8080/jdonremote/

[该贴被banq于2009-07-01 17:35修改过]

测试成功。 不知道 javafx 的前景如何?

JavaFX前景难料,细分市场还是有的,现在看,大家都喜欢JavaScript,然后结合U3D等进行二维三维表现,因为SUN毕竟不是媒体公司,而是语言公司,而JavaFX之类是面向媒体的语言,所以,除非SUN转型媒体,或者完全开放JavaFX,让民间专业媒体公司使用JavaFX,非常就没有出路。