关闭

一个关于 B/S 开发模式的讨论

616人阅读 评论(0) 收藏 举报

来源: http://bbs.51js.com

我们知道:B/S 开发模式越来越受推崇,我所在的公司近2年中较大的一些case都是基于B/S模式开发的。
其优势我这里不多加论述了。

但不可否认,传统的B/S系统有几大缺点

1. 表现层的代码不易复用
2. 网络上跑着大量重复的数据
3. 服务器几乎要处理所有业务逻辑和动态交互,经常执行重复的操作,负载过重。
4. 从人机对话的界面上,难以要求客户的操作规范化。
5. 服务器只能被动接受请求,而不能通过“推”的方式把数据主动发送给客户端。
...

为解决这些问题,我们必须用一种全新的开发模式来开改造 B/S。

针对上面几个问题,我分别制定了以下几个步骤来解决:(具体细节就不写了)

1.客户端的脚本及html 必须以“类”或“可复用的组件”的方式存在。

        说明:        面向过程的 JavaScript -> “基于对象”的 JavaScript
                原子型的 dhtml -> 组件模式的 htc, wsc

2.在客户端建立一块公共的存储空间(内存中),即:存在一个全局对象(类似delpehi、c++ builder中的 Application),所有应用页面都共享该对象,并能通过这个对象交换数据或复杂对象。

        说明:        构建 appliation 对象实现上面的功能,该对象的生存期和整个应用保持一致。(注意:这 appliation 是指客户端的,并不是 asp/jsp 中在服务器端的application对象)

3.实现 客户端和服务端 的数据同步机制,减少客户端的数据丢失率,避免对服务器作重复请求。

        说明:        所有类在客户端实现cache,重启IE或重启系统皆不必重新从服务器加载类资源。
                采用 RMI/RPC 方式,实现客户端 的 js 对象 能远程调用 服务器端的一个对象(或应用)的方法,并能保存其状态和数据。对开发者来讲,这种调用机制是透明的。
                代码和数据分离,所有涉及UI的页面均用静态页面形式存在(减轻server负载,且这些静态资源会被IE自动cache,下次不会被重复下载),所有动态交互部分的数据,除了以RMI的方式返回给客户端以外,皆以 XML 形式返回,并在客户端建立cache机制。


4.用 “模式/同步” 的操作方式,代替传统中 “非模式/异步” 的操作方式,从而约束用户的操作步骤,使其规范化。

        说明:        浏览器很多操作默认都是 异步/非模式 方式的(比如:form的提交,window.open,等等)这样可以实现多线程请求数据,会比较快,但有时侯在处理单个流程,却会带来不少麻烦。
                比如:某个操作要等数据提交成功后执行,我们希望能有一个阻塞,待执行完提交后,接下来执行后面的操作,然而异步方式只能用回调的方式实现,中途的各种情况处理的逻辑判断太多,着实麻烦。
                解决办法:对数据请求或发送:用 xmlhttp xmldom 的同步方式调用。
                          对窗体模块的调用:用 showModalDialog 方式调用。

5.启动“扫描线程”侦听服务器的“推”动作,或者利用 ClientSocket 组件(我已封装成一个htc)和服务器进行有连接的通讯。


我下面摘一段客户端的 code,展示一下这种开发模式的代码风格。(比如:xxx.htm)

<html>
<script src="/common/jslib/jsvm.js"></script>
<script>

_import("js.lang.System");        // 可以在一开始就加载一些类或包
_import("js.graphics.*");


function init(){
        try{
               
                ...
                _import("cn.x86.common.user.Login");         // 也可以在过程中动态决定是否要加载一个类或包
                var login = new cn.x86.common.user.Login();

                login.loadInfo();        //远程调用,直接从服务器端得到登录者信息
               
                ...
                var cav = new Canvas(); // 画布类,实现 UI 作图  这里也可以用完整的类名来实现: var cav = new js.graphics.Canvas();
               
                cav.pen.color = "blue";
                cav.outText(100,100,"Out Text");
                cav.pen.color = 'red';
                cav.lineTo(500,300);
                ...

        }
        catch(ex){
                System.out.printError(ex);
        }
}


</script>
<body>
        --  从事 Java 开发工作的人看完后是不是觉得很亲切? --
</body>
</html>



上面设计涉及到的优缺点

缺陷:

1.对developer的客户端的技术功底要求较高。        (可预见)
2.客户端的负载较传统的模式要高。                (可预见)
3.对客户端的浏览器版本及运行环境要求比较规范。        (已确认)       
4.对复杂对象的序列化工作将会增多。                (可预见)

优势:

1.服务器负载,和网络流量能大幅度减少。                (已确认)
2.模块的粒子度,灵活性,复用性将大大增强。        (可预见)
3.模块(类)之间的依赖性清晰,且易维护。        (可预见)
4.整个系统运行性能将提高。                        (适客户端的环境而定)
5.系统开发周期能减少                                (视项目具体情况而定)




整个框架的设计工作已近尾声,我提前把它拿出来让大家讨论一下,看看同志们有什么意见或好的建议,也好修正。
待2.0版本全部完成以后,与大家一起分享!
欢迎有兴趣的同志发表一下观点。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:694863次
    • 积分:8143
    • 等级:
    • 排名:第2567名
    • 原创:3篇
    • 转载:584篇
    • 译文:0篇
    • 评论:129条
    最新评论