| eric's profile我的地盘,我做主!PhotosBlogLists | Help |
我的地盘,我做主!Flex, .Net and Java Interoperability以前见到不少.NET and Java Interoperability的书籍,一直感觉只有吃饱撑着的人才会在一个系统中采用多种异构的技术平台,然后在通过WebService之类进行不同技术平台的交互。但随着各种各样的前端技术逐渐成熟强大(Flex、Silverlight、Swing、JavaFX、QT、Web...),后台可选择性越来越多(J2EE、.NET、Rails、PHP...),使得实现一个系统的可选前后台技术的排列组合相当之多,如今可交互性变得原来越重要了。
最近做了几个互操作的例子,后台分别用Java和.NET起了两种WebService,前台用Java、Flex和Silverlight三种客户端方式实现了6中交互:Java-Java, Java-.NET, Flex-Java, Flex-.NET, Silverlight-Java, Silverlight-.NET,以下列了些主要步骤和需要注意的问题:
1、.NET通过WCF可以很容易WebService服务,为了提供给Silverlight客户端所以选择了Silverlight-enable WCF Service,需要注意的是在web.config默认提供的是customBinding和mexHttpBinding的endpoint的binding方式,需要改成basicHttpBinding的方式,如果你的客户端是WPF可以不用改动。
<services>
<service name="SliverlightWithWS.Web.CustomerService" behaviorConfiguration="SliverlightWithWS.Web.CustomerServiceBehavior"> <endpoint address="" binding="basicHttpBinding" contract="SliverlightWithWS.Web.CustomerService"/> </service> </services> 2、Java创建WebService可以通过JDK6的bin目录中的apt对标注为javax.jws.WebService的服务类生成相应的封装类
@WebServiceJDK6的javax.xml.ws.Endpoint直接就具备发布服务功能,你可以将其理解成一个简单的Tomcat容器 public static void main(String[] args){通过以上工作你已经发布了一个web服务,可以通过http://localhost:8080/service?wsdl查看具体的服务细节,另外你也注意到我还多发布了个clientaccesspolicy.xml这个注意是为了解决Flex和Silverlight跨域访问的权限问题,Flex通过http://domain/crossdomain.xml获取是否允许跨域访问权限,Silverlight通过http://domain/clientaccesspolicy.xml查看,当然作为RIA市场的后来者MS还是得照顾一下已经广为传播的Flash应用,因此Silverlight当找不到clientaccesspolicy.xml路径后也会尝试读取adobe的crossdomain.xml格式定义的访问权限配置,这里就不再细展开权限话题,好奇的话你可以看看http://twitter.com/crossdomain.xml的内容@WebServiceProvider
@ServiceMode(value=Service.Mode.PAYLOAD) public class CrossDomainProvider implements Provider<Source> { @Override
public Source invoke(Source request) { System.out.print(request); String replyData =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<access-policy>" + "<cross-domain-access>" + "<policy>" + "<allow-from http-request-headers=\"*\">" + "<domain uri=\"*\"/>" + "</allow-from>" + "<grant-to>" + "<resource path=\"/\" include-subpaths=\"true\"/>" + "</grant-to>" + "</policy>" + "</cross-domain-access>" + "</access-policy>"; StreamSource reply = new StreamSource(new StringReader(replyData)); return reply; } } 除了以上通过直接通过JDK6的javax.xml.ws.Endpoint进行发布外,你也可以通过https://metro.dev.java.net/将服务发布到任意支持Servlet的J2EE容器中,具体的说下载https://metro.dev.java.net/1.5/metro-1_5.jar,然后java -jar metro-1_5.jar解压metro内容,将解压后的metro/lib目录下的所有jar包拷贝到apache-tomcat-5.5.27\shared\lib下面,在web.xml中配置如下 <listener> 增加一个sun-jaxws.xml文件,配置如下<?xml version="1.0" encoding="UTF-8"?>这样就可以将服务发布到J2EE容器中了,如果你用Netbeans工具以上这个步骤将会更加简化,当然你也可以选择CXF的解决方案http://cxf.apache.org 3、Java客户端可以通过JDK6\bin\wsimport -p client -keep http://localhost:8080/services/twaver?wsdl 生成相应客户端的包装代码,至于调用就非常简单了基本和操作POJO没有区别,这里需要注意的是我用Java连接.NET的WCF服务时,死活出com.sun.org.apache.xerces.internal.util.SymbolTable.hash的空异常,查了一下应该是JDK的bug,现在JDK6引入的是JAX-WS 2.0,你可以通过GlassFish更高的版本解决这个问题,不过后来试了将.NET的[ServiceContract(Namespace = "")]随便改成[ServiceContract(Namespace = "sailing8036")]的非空的Namespace就ok了 4、.NET客户端主要就是前面提到的跨越问题,如果是Silverlight访问跨域的Web服务需要提供clientaccesspolicy.xml或者crossdomain.xml的访问权限,另外Silverlight必须采用basicHttpBinding的方式,我用其他方式创建的WCF服务,用wsimport生成Java客户端代码时会出现java access wcf it uses non-standard SOA it uses non-standard SOAP 1.2 binding问题,反正basicHttpBinding可以走得通我就没细研究了,有知道原因者不妨回帖赐教一下。 5、Flex的客户端主要考虑跨域的crossdomain.xml权限提供即可,由于ActionScript的动态性其客户端代码相比Java和C#真是简洁舒服很多,以下寥寥几行已经是全部客户端代码 <?xml version="1.0" encoding="utf-8"?> 以上只是简单的实现互通,没有考虑效率和安全问题,不少其他好文可以参考一下:C# usingC#的using不仅可以引入包,还可以定义别名,这个可以用来实现不改动核心代码切换单元测试框架。如以下代码所示,如果你定义了NUNIT那么TestClass和TestMethod用的就是Uunit的,否则用的就是Microsoft.VisualStudio.TestTools.UnitTesting的。
这里注意一下你可以在文件头#define NUNIT,不过这样只有该文件起作用,为了让所有文件都起作用你需要在编译参数/define上定义
http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx 这样如果喜欢SharpDevelop的小巧开发环境的可以继续用NUnit工作,喜欢VS的环境者继续可以享受集成的好处,只不过每个测试文件头有点“大”,我想不到更精简的做法了,有更好的解决方案者还请告之一下。
#if NUNIT using NUnit.Framework; using TestClass = NUnit.Framework.TestFixtureAttribute; using TestMethod = NUnit.Framework.TestAttribute; #else using Microsoft.VisualStudio.TestTools.UnitTesting; #endif namespace TWaver { [TestClass()] public class DataTest { [TestMethod()] public void PropertiesTest() { } } } C# quiz - lambda expressionclass Test
{ public delegate void HandleMessage(string message); public void handleMessage(string message) { } public HandleMessage create() { return (message) => { //this.ToString(); }; } static void Main(string[] args) { HandleMessage listener1 = new Test().handleMessage; WeakReference w1 = new WeakReference(listener1); HandleMessage listener2 = new Test().create();//(message) => { }; WeakReference w2 = new WeakReference(listener2); Console.WriteLine("w1.Target:\t[" + w1.Target + "]"); Console.WriteLine("w2.Target:\t[" + w2.Target + "]"); listener1 = null; listener2 = null; GC.Collect(); Console.WriteLine("after GC"); Console.WriteLine("w1.Target:\t[" + w1.Target + "]"); Console.WriteLine("w2.Target:\t[" + w2.Target + "]"); Console.ReadLine(); } } http://stackoverflow.com/questions/535972/lambda-expression-cause-weakreferences-target-cannot-be-gc/
stackoverflow.com是个不错的程序员提问网站,在自己问题如此快速的得到《C# in Depth》作者正确答复之后,感觉有必要在此推荐一下。 随便在此批评一下sun、adobe、microsoft三大UI平台巨头:
sun:bug管理系统反馈比较即时,提交的bug很快会得到相应负责人的mail联系,不过bugs.sun.com做得比较烂,提交的bug找不到提交人的信息链接,同样我提交了十来个bug,可是哪怕我登陆了也无法找到我自己提交的哪些bug的链接,每次要关注一下提交的bug的进展情况,只能通过search mail找sun的相应bug负责人和我交流的mail,bugs.sun.com这个这么重要的开发者交流窗口,这么多年了一成不变,实在应该学学facebook这些成功sns社区的信息关联功能
adobe:采用了jira平台管理得还是不错,基本功能都很完备,可惜俺提交的三个问题都好几个月了也不见有任何反馈,究竟是不是bug,是否要改进,哪个版本需要fix,好歹也想sun那样给俺一个mail答复吧。Flex和AIR已经打下了很好的底子,AS既有静态语言的严谨性且不失动态语言的灵活性,加上Flash插件的普及性,adobe是可以将触角从flash小动画广告领域渗透入大规模游戏以及企业应用领域,前景虽很好不过目前就目前的flex健壮性来说,如果你要上个稳定严肃为前提的系统我还是建议你考虑已经被无数程序员无数项目洗礼过十几年Swing(I don't mean JavaFX)
http://bugs.adobe.com/jira/browse/SDK-17343 http://bugs.adobe.com/jira/browse/SDK-18542 http://bugs.adobe.com/jira/browse/FP-891 microsoft:windowForms这几年几乎没啥动静,这么有钱的巨头实在应该继续花钱投入个团队不断完善windowForms,WPF/Silverlight的RIA路线固然需要重点投入介入互联网以及各种非PC终端平台,不过WPF/Silverlight目前的性能以及组件的丰富性还是和Flex有差距,更不用提纯2D的Swing和windowForms的性能比较,当然WPF和Flex这种不提供2D画笔绘制,完全组件化封装一切也带来了很多例如旋转甚至扭曲组件等以前Swing和windowForms这类框架很难容易实现的效果,不过要走到效率达到和超过以前UI框架的那一天估计还不知道要多少年,现在这么早就不再发展windowForms这个依然还有很大市场的技术平台实在可惜,而且会催生出竞争对手,这不Delphi 2009又来了。另外对于俺这种MFC-Swing-Flex-.NET路线的人实在看不下去vs这种开发工具老大的产品怎么这么多年都没从Eclipse这些后期的java好工具上进行改进,对于开发工具中查找类函数以及各种各样的重构功能习以为常的javaer实在很别扭在vs2008下工作(vs2010俺还没试用也许有所惊喜)。不过ms的文档还是比较丰富的,forum也是挺热闹,不过要不是此贴长时间没有得到回复俺也不会发现stackoverflow.com这个好去处。
总之这三巨头的你追我赶2009年RIA应该会非常热闹,作为开发应用的程序员也是比较幸福的,我们有很多选择同时可以见证和学习UI框架的成长过程。对我个人来说我不在乎“R”不“R”,“I”不“I”,“A”不“A”,我只希望能看到让大家很愉快轻松编程,只要想得到就能很快做得到,并且代码易读易管理易扩展的UI框架。扯蛋得有点远,这个UI话题应该另辟个blog细谈。 |
|
|||||||||||||
|
|