先说些与标题貌似无关的话.

随着prototype DWR 等ajax框架的流行,
服务器端生成js代码返回客户端,由客户端调用(直接调用或eval)似乎已经成为了一种很正常的做法(是否流行我不知道).

这种做法(其实是一种设计)本身无可厚非,但是常常被人错误的理解和应用
(此处所谓的"错误"是基于我的立场,也许更多的人会认为我的观点才是错的 呵呵).


用过DWR的人都知道,实际上DWR传给客户端的JS并不是包含了很复杂的业务逻辑和表现逻辑,他只不过是向客户端发送了一些信息,
这些信息告诉了客户端如何调用服务端暴露出的服务.这些信息本质上只是一些数据,确切的说只是一些参数.
DWR实现的web remoting,只是对下面这种做法的一个变种.
ajax.request("service对应的url","service需要的参数","service调用结束后要做的事情")

DWR传过来的JS,实际上的只是扮演着"service对应的url","service需要的参数","service调用结束后要做的事情"这些参数所扮演的角色.
对于真正的业务逻辑还是包含在服务端的service里.

所以我不止一次的说过"没什么事情是必须要用DWR那种方式来做,而用prototype + servlet做不了或是做起来很困难的".
因为两者都能够做到而且也都正做着同样的事情.


但是DWR的这种做法有时候会产生一些不良暗示:服务端生成js供客户端调用是一件很不错的事.
甚至容易让人把这种做法和JSF的事件机制混为一谈.
于是通过ajax请求返回的信息变得丰富多彩.其中最可怕的就是返回复杂的HTML和JS脚本.

现在还有一种可怕的事情是 客户端提交js脚本,服务端用rhnio运行
(我曾就就做过这种可怕的事 呵呵,但是那个系统尤其客观性,不过其实完全可以避免的,只是当时懒了).


在一个ajax的请求与响应中,服务端与客户端交互的信息应该只是作为数据载体的字符串(xml json序列等).
这些数据会告诉对方要去做什么 以及为对方提供必要的参数,而不应该包含告诉对方怎么做.
传递js语句也可以,但是这些js语句一定要是能够和json划等号的,任何夹杂了 if for = 等操作的js都是应该极力避免的.

在服务器端生成HTML的做法实在是为了照顾羸弱的浏览器而做出的让步,其实这种做法本身完全是个错误,
不过在相当长一段时间内,我们还将继续错下去.

当然我这里说的完全是ajax相关的东西,JSP、tag不在讨论范畴之内,
但我还是要补充一句: 我虽然曾大量是使用和开发tag,但我对它是非常厌恶的,
使用上也许还比较愉快,但是开发起来真够恶心的.我讨厌一切在服务器端生成html代码的行为.
关于tag这是另外一个很大的话题了,以前在javaeye上的相关讨论并不少,在这里就不再多废话了.



好了,现在该说些和标题有关的东西了(晕).
我先问几个问题:
当你要整合两个分别使用 j2ee 和 php 编写的系统时,
当你要在一个j2ee系统中使用php系统中的一部分功能时,
当你要从一个j2ee系统向另一个.net系统中传递数据时,
你会怎么做?
会变态的用java重写另外一个系统?
会更变态的将j2ee系统用php/.net重写吗?
会用j2ee生成php/.net可以理解的代码,让对方运行吗?

不会的,你首先想到的会是WS,会是MQ,会是REST,会是SOA.....


其实服务端 与 客户端 就是两个独立的系统,而且是两个独立的异构系统.
处理他们之间的关系和处理两个大型的异构系统的关系非常类似,应该咬住"服务"二字不放.
所谓"服务"应该是: 生产者提供,消费者享用.
而不是: 你告诉我我每一步要怎样做,然后我再一步步的做给你看. 这不叫服务,这叫"奴役".
任何企图在一端生成另一端代码的做法都是欠妥当的.

因为世上没有B/S系统,只有B系统和S系统.

多说一句,GWT如果设计成是在运行期生成最终html/js代码的,那么他将是愚蠢的,幸好他们没那么,但是现在的他离愚蠢也不远.


这篇文章同样比较凌乱,也不知道我说明白我想说的没.

其实我只是想告诉大家(主要是新手),应该站在服务的角度来看待系统的层次和结构,
每一层只是向其他层提供服务,并享用其他人的服务,而无权干涩别人提供的服务的细节,也不应该让别人干涉自己.
有了这样的认识,如何传递数据,如何做到系统层次件的解耦就是很自然的事情了.

当然本着"世事没有绝对,凡事都有例外"的原则,我这些观点不适用于所有系统.



以上观点只代表我个人看法(当然有一些观点不是我首创),欢迎大家提出反对意见 :).
评论
ltian 2008-04-19
Andy_Fay 写道
太长了
看了一下,其实很简单
只传递数据,不传递行为


精炼,就是这个意思。只让数据在应用的不同层之间穿过。
Andy_Fay 2008-04-19
太长了
看了一下,其实很简单
只传递数据,不传递行为
Ben.Sin 2008-04-13
好文,同意楼主的观点

就比如你去餐厅吃饭,你可以点一份5成或者7成熟的牛扒
但餐厅不会答应你,假如你点的菜色是红烧的水煮鱼
kerne 2007-12-11
fins 写道
pikachu 写道
楼主的意思就是,两个系统之间,传递的就应该是VO,不管这个VO是java的,xml的还是json的.
强烈鄙视楼主的标题!!


我的标题绝对不是标题党,只是比较"写意",

我只是建议大家先在主观上把你要设计的B/S系统 看作是对两个异构系统B 和 S的融合,
只有这样才能设计出更好的 松耦合b/s系统.


而让他们松耦合,就要先从彼此传递的数据入手, 如果传递的总是对方的代码片段,让对方去执行,这样的做法就很可怕,我主要反对的就是这种做法.


:?如果要这样说的话,LZ是否说得不清楚?而在别人提问后,LZ才明白自己所以表达的观点?
我支持pikachu的说法,主要是LZ的标题让大家产生了问题并且观点表示不明确。
其实S端就是s端,B端就是B端,不要把业务搞到B端去,不要把B端不美观的东西搞到S端去。
就这么简单
bellstar 2007-12-11
虽然自己也一直推崇把前台做成不针对某种后台的可易构的客户端,但却没有深入的想到楼主所说的B系统和S系统的看法,非常感激。
chenjf2k 2007-11-30
对于习惯javascript编程的我,对楼主的这篇文章非常认同,非常的佩服
hred 2007-11-23
从REST的角度看

B就是负责呈现数据,传送对数据的操作的平台。

S就是一系列的定义良好的资源。(资源某种程度上跟WebService有所重合)

B应该做甚么,S应该做甚么,都应明确规定,这样避免许多设计上的胶合代码(传递,调用,匹配,别名诸如此类)。系统生命期才能更长。
cowskin 2007-11-21
分久必和,合久必分。 没有绝对的!适应才是硬道理!
12True 2007-11-16
abo 写道
12True 写道
完完整整的看完了,蛮喜欢Javaeye的这种氛围

你不觉得这地方博士太多,专家过少?

至少有一些能写出些东西
能让我停留一两小时
protti 2007-10-26
renavatio 写道
抛出异常的爱 写道
flyromza 写道
我很认同楼主的观点,server除了完成自身的逻辑之外,最多也就是为不同的client多做一些数据策略罢了(JSON、XML。。。)

虽然AJAX存在三种交互模式:数据、内容和行为,但我认为在80%+的情况下应该尽可能的使用数据交互,而内容交互与行为交互总是需要server端做一些“本该client端完成的事情”。试想,如果是这种设计逻辑,那么分层还有什么意义?关注分离还有什么意义?


分离在一开始是由于网络不稳定与传输速度的限至
现在这种限至还存在
但越来越小。
忠有一天B/S会变回C/S去的


赞同,网速上去了,基本上就没有必要B/S了。


我一直感觉 给机器里塞太多东西是个很蠢的办法 也许以后没有C/S了 都是B/S呢 因为机器里不需要硬盘了也说不定 一起都在服务器处理 只需要一个薄薄的屏幕看结果就好了
caoyi1983 2007-10-25
JSP,不只可以生成HTML,也可以生成XML,我想这就是AJAX里的X提示我们的,M交给S(通过JSP),V和C交给B(通过js).
abo 2007-10-23
12True 写道
完完整整的看完了,蛮喜欢Javaeye的这种氛围

你不觉得这地方博士太多,专家过少?
12True 2007-10-21
完完整整的看完了,蛮喜欢Javaeye的这种氛围
12True 2007-10-21
fins 写道
其实小事情也能反应出大问题

只是我所反应出的大问题 引起了你在理解上的错误
我只好把问题的高度降低了.

你要是不愿意,那我再把问题的高度提升一些:

你只有在主观上先把B 和 S 分离,你才能更好的让他们在松耦合的情况下进行融合.
所以,在设计B/S系统前,你应该忘掉你在设计B/S系统,而要把他们当成两个独立的系统来设计
这么说扣题了吧?
说复杂了你不理解,说简单了你说我标题党 ,唉 做人难啊

你早这么说,我就不会看到40几楼了。
还好你没一开始这么说
lz精神可嘉,继续发扬啊。关注ing
12True 2007-10-21
ray_linn 写道
fins 写道
为了让你更好的明白我的意思, 我把我的观点的高度下降一些, 把语言说的再直白一些:

请各位新同学,不要在S端生成复杂的JS代码传递给B端执行, 更不要在B端生成JS代码交给S端运行,这么做是在绝大多数情况下是不对的.

如果我这么说了, 你还是拿"握手协议 报文"来说事,那我就真是无话可说了.



你要谈的东西很小,近似是设计范式的问题,却扯了面很大的旗。标题党么?俗话说扯虎皮当大旗是也。

一个很大很大的标题,放一个很小小的东西,不意外有人会误解。


其实那些很多很多钻石的牛人

讨论的帖子

就是让我们咬的,咬到只剩下很小很小的原理

在咬的过程当中,我们就吃饱了。顺便赞一句,这个汉堡比较大。

我们本来就是那样的,你最牛,也不过0和1
12True 2007-10-21
lihengxin 写道
既然存在,就有它的合理性.


不应该是合理性

应该是无奈性

开发的时候还要加上人性
12True 2007-10-21
[quote="fins"][quote="pikachu"]
而让他们松耦合,就要先从彼此传递的数据入手, 如果传递的总是对方的代码片段,让对方去执行,这样的做法就很可怕,我主要反对的就是这种做法.
[/quote]
是很可怕

封装tag的时候实在太恶心了

貌似又深入的了解了点

收回我楼上的话。

呵呵
12True 2007-10-21
至于应该不应该在S端拼凑js,html代码
我暂时还没有什么想法

因为js实在是郁闷。
用java写多舒服。。
呵呵
12True 2007-10-21
初看,还真是标题党
看到32L
貌似lz还真有点诗意。
还真不是一般技术人员能达到的

我的理解是
尽可能的把b端和s端看作独立的系统
也就是所谓的尽可能的松 BS之间的耦合
但是BS之间又必须遵循B和S之间的达成的某种协议,或者说标准吧。
实在不喜欢用“标准” 这个词。

貌似我和没说,没理解一样 - -#
sslaowan 2007-10-20
Sean220 写道
在我的努力下应用页面也全是HTML了,利用MSXMLHTTP与后台页面用XML通讯数据。
那么协议就是包含了控制信息的业务数据格式化后的结果,那么回到AJAX系统,PAGE/B端与Server端看作两个系统的话,一个设计良好的WEB系统,重点考虑的部分就是协议的制订,这样就被迫程序员连带着去理解HTTP是这么一种无状态的协议,以前后台两个系统的思维方式来设计WEB系统,应该会事半功倍。可以少犯一些构架上难以补救的错误。


我在想,这是不是就是REST的思想。B端就是HTML+CSS+Javascript,然后“按需代码”从服务器端Download Applet或者Flash加以扩充,中间的协议就是HTTP。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论