老的博客园朋友应该清楚,我在10年前开发了一个基于asp.net的大型开发平台,其中作为开源项目的SilverLight流程设计器也获得了当年的微软开发大奖。时过境迁,当年的设计器早就在技术的更新换代中迭代了很多次。
很久以来就一直有一个想法,要实现不同语言平台下的无差别开发平台使用体验,这一次终于下定决心。当然这个决心也是随着开发平台.Net版本的不断进步带给我的信心,因为整个项目虽然使用asp.net WebForm,但是已经完全抛弃了WebForm的开发习惯,没有ViewStat、不使用微软本身的ajax,有了这些基础,转Java就少了一半的阻碍。
下面我要讲的就是这个过程,也给有相同需要的朋友们提供一种思路。
在开始之前,需要先介绍一个.Net版本的基本功能和技术路线,然后就 开始我们的转换之路,最后我们可以看到一个在两个平台上无差别体验的开发平台,他们甚至可以相互自动转换。
.Net版本具备的功能
目前.Net版本具备以下功能
- 智能表单(所见即所得的可视化设计,自动生成数据库表而不是绑定数据库表)
- 流程设计、监控(所见即所得的可视化设计)
- 智能报表
- 数据中心(以平台为中心,管理各种业务系统)
- 智能适配多(PC,微信小程序,企业微信,钉钉等)
以上是开发平台核心模块,除了这些核心模块还有很多其他的辅助模块,例如
- 系统管理(用户、部门、职务、角色)
- 系统日志(登录、访问、操作、异常)
- 认证中心(OAuth2,门户)
- 等等
.Net版本的开发平台可以被部署在window或Linux上,支持大部分的主流数据库。
.Net版本的技术路线
- 核心模块使用C#编写
- 展现层使用asp.net WebForm
- 客户端使用Jquery
- 移动端页面使用H5
- 使用DataProvider支持多种数据库
以上是.Net版本使用的主要技术,下面我们进行Java转换的时候,就是要根据以上技术进行思考和转换。
转成Java要实现的效果
转成Java最终要实现什么效果,这是在转换之前需要考虑的问题,不同的最终结果会有不同的实现。在考虑到各种情况下,我选择了一条最难的路,就是在客户使用体验上保持百分百的一致。
要怎么实现这个目标呢?最开始的想法是基于现有的java开源产品进行封装,但是这样需要对开源产品有非常熟悉的了解,并且也难免需要对开源产品进行非常多的二次开发。最后下定决心,自己转换。
在.Net版本中有哪些具体的客户体验,我整理一下几点:
- 设计体验
- 设计体验指的是客户使用我们开发平台的功能在产品设计、开发中的体验。在客户将平台从.Net转成java后,客户在.Net平台上形成的习惯和积累的知识会在java平台上无差别的使用。
- 产品体验
- 产品体验指的是客户使用我们平台开发出来的产品交付给最终使用人后,使用人在不同平台上的使用经验也会无差别的保留。
- 数据库体验
- 在.Net和Java两种版本使用完全一样的数据库
转Java的思路
从.Net转Java的目标已经有了,但到底该怎么开始呢?为了理清思路,我们回头看一下前面说的.Net的技术路线。
- 核心模块使用C#编写
- 展现层使用asp.net WebForm
- 客户端使用Jquery
- 移动端页面使用H5
- 使用DataProvider支持多种数据库
以上3、4基本不需要修改就可以使用。
1、5两点是不同语言之间的转换,虽然繁琐,但也并非难事。
最困难的就是第2点,我该怎么把asp.net的WebForm转成Java呢。为此,我缕了一下.Net版本中使用WebForm的情况。
前面说过,虽然使用了WebForm,但是这个历史原因带来的包袱在平台的发展中已经被我丢掉了,我不使用ViewStat,不使用微软的ajax控件,在这种情况下你可以平台看作是前后端分离的(当然没有完全分离)。
为了能转换,我们需要了解WebForm的工作原理。在asp.net的上一代技术平台中,asp,jsp,php等都是用了大致一样的思路,就是在服务器端动态生成HTML控件,然后输出到客户端。在早期的asp程序中,你可以看到大量的这种拼接、生成html的代码。
为了改变这种混乱的局面,asp.net WebForm应运而生了。它把开发windows form的经验带到了web开发,虽说在当时确实先进,但在目前来看已经不适应了。
WebForm的思路是使用服务器端语言来封装各种HTML控件,经过服务器端的封装,可以在后台使用代码方便的控制最终HTML控件的展现方式,例如:
- DropDownList。对应HTML的<select></select>
- CheckBox。对应HTML的<input type="checkbox"/>
- RadioButton。对应HTML的<input type="radio"/>
- TextBox。对应HTML的<input type="input"/>或者<textarea/>
等等,每一个HTML控件都可以找到WebForm的对应项。每一个控件经过服务器的渲染,最终以HTML控件的形式输出。
有了这些了解后,我有一个大胆的想法,就是用Java来实现.Net平台中的各种服务器控件,并保持WebForm的控件生命周期管理。之所以这么做,是为了保持WebForm中我写的大量的逻辑 都能在Java中被保持(因为有些逻辑代码的写法我已经搞不懂最初的想法了)。最终,我完成了以下.Net控件的Java实现(这个只是.Net平台下我用到的控件,并不是全部.Net控件)。

除了以上控件之外,还有一些.Net中没有Java对应的类,比较重要的是DataSet和DataTable。当然还有一些其他很多的不是很关键类的转换,都花了不少力气。
有了这些控件后,我写了一个类似asp.net中的控件生命周期管理类,最终在tomcat中能运行起来一个类似WebForm生命周期管理、以各种服务器控件渲染来生成HTML的java程序,并且这个程序的运行结果和.net完全保持一致,这样我的各种客户端各种js脚本也都基本保持不变,当然我也写了一些js配合类脚本来保证到达和.Net完全一致的效果。
在这个过程中,我主要用到了一个工具:
CSharptToJavaConverter
这个工具帮我做了很多非脑力工作,在这个工具帮我将.Net转成Java后,我在这个基础上进行修改工作。
以上是整个转换工作的主要部分,除了这些还有一些其他的零碎工作,主要 是解决在Java中没有对应.Net实现的部分。
最终产品
最终,我完成了一个asp.net WebForm的大型产品转成Java的实现。现在两个平台有以下的共同点:
- 完全一致的客户使用体验,如果你不注意浏览器的url地址,完全看不出是两套产品
- 两个平台可以连接 同一个数据
除了以上共同点,这两个平台的产品代码还可以相互转换。
例如:我用.Net平台设计出来的各种模块,可以通过中间适配器转成java的实现,这个过程是自动的。
结尾
以现在的眼光来看,一个.Net和Java实现相同功能的产品并非难事。但在十几年前,我没有想到会做java的实现,并且不幸的是,我用了asp.net WebForm这个当时看起来很先进的asp的下一代产品。
经过这样的转化后,在java实现中,HTML控件以类的方式呈现,并且经过生命周期 的优化,所能达到的性能指标比.Net版本高出好几倍。