该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-27
icewubin 写道 leebai 写道 在正真的B-UI应用中,Browser自己负责界面构造和界面跳转,Server只负责提供business logic 访问,也就是说[size=small; color: #ff0000;]Server上根本就不需要S-UI的Web层(虽然还是HTTP访问),没有所谓的Controler,也就是说MVC不再是真理,Spring MVC/Struts之类的Web层框架完全没有必要[/size]。“server pages”开发者理解B-UI时最大的思路陷阱就是“Web层”,MVC。 B-UI(Ext等界面组件+HTML+JS+ajax)是S-UI(jsp,jsf,asp,asp.net)的完全等价物,不存在什么功能jsf能做, B-UI不能做的问题。
从结构上来说,即使没有Controller层,business logic层不能直接暴露给客户端调用(由此我反对使用DWR框架),也就是说,还是要有一层Fasade,所以还是留着好,虽然名字还叫Controller但是主要职责已经变了。为什么说主要职责,是因为Controller层还是有它的用的,传统的方式比如自定义tag用来“写”(生成)JS的local数据要比发Ajax请求效率要高得多,应用场景是界面上的下拉框不需要频繁从服务端取数据,大多数情况都是取一次的,就没必要用Ajax请求。 或者这么说吧,如果页面上有10个下拉框,而且内容都不能写死,都要从服务端取,纯粹的Ajax方案在这种场景下性能反而是倒退的,因为http请求发得太多了。目前觉得还是结合传统的方式更好一点,可以一个ftl(或jsp)+一个JS文件,ftl(或jsp)中的代码可以很少,比如都是些取数据的tag。进可以完全的不用tag语法,退可以随时大量用传统语法解决变态需求。 并不能说DWR框架就一定导致business logic暴露给客户端。使用Facade和DWR并不矛盾啊。而且我认为Controller如果仅仅是为了解决网络存取效率问题,那并不能算是Facade,只能算一个Proxy。而且如果考虑HTTP支持keep-alive和pipeline的话,可能就不必考虑多个请求的问题了,那样的话又如何?——注意我并非说B端可以直接操控biz logic,但至少你这里的理由不充分。 |
|
返回顶楼 | |
发表时间:2008-04-27
hax 写道
leebai 写道
其实你这jCT中的“存储”型模板,完全可以被7WX框架借用(7WX中也有类似的东西,只是功能没jCT强)。Browser UI模型的“局部界面更新”,除了主流的“组件方式”外,确实还应该包含“模版方式”。
虽然我没有看过jCT和7WX,不过先放个空炮。上次jindw说他要搞客户端模板,我就跟他聊说客户端模板没啥前途,或者说存在一些与服务器端模板类似的问题无法解决。 模板(template)的主要问题是它是一种代码生成方式,因此与最终运行时模型是不匹配的。因此模板虽然有利于方便、安全的生成重复的代码,但是编写运行时脚本时的复杂度却大大上升了。我个人认为native的B端组件(data binding)才是王道,呵呵。
所有这些都是ListView组件Render出来的,界面中每个条目能显示成什么样子,是通过HTML模版定义的, 你想象,单纯的OO Grid组件模式要显示这些形式各异的列表有多困难,这也是7wx ListView与其他js Grid完全不同的地方。
|
|
返回顶楼 | |
发表时间:2008-04-27
leebai 写道 同意“Server business”中,business logic层不能直接暴露给客户端调用(js其实也不可能直接调用Java),你说的那个Fasade层,我原先也将其称作是Controler,但这样容易与MVC的概念混淆,所以现在倾向于这样表述: [size=small;]Ajax +“Server business”应用,就是View [/size]+ Model应用,不存在Controler [size=small;]而你说的那个Fasade层,其实大有文章,远比MVC的Controler[/size]内容丰富,本质上就是V/M框架,虽然7wxAop框架已经实现了V/M之间的很多控制,目前我还没找到合适的词来表达它,这方面可以深入探讨。 我感觉,大家得先定义一下这个Facade也好,Controller也好,它的具体职责是什么,和前后两端是如何配合的。否则很难说大家指的是一个相同的东西。 |
|
返回顶楼 | |
发表时间:2008-04-27
leebai 写道 组件是王道没错,但模板在很多时候能解决组件无法解决的问题,尤其是界面显示的可定制性。举个例子: 7wx的ListView组件主要用于显示各种各样带翻页或不带翻页的内容条目列表,比如: 所有这些都是ListView组件Render出来的,界面中每个条目能显示成什么样子,是通过HTML模版定义的, 你想象,单纯的OO Grid组件模式要显示这些形式各异的列表有多困难,这也是7wx ListView与其他js Grid完全不同的地方。 我没看过代码,我胡乱猜测一下,大概是这样? var myList = new ListView(data, template); container.addComponent(myList); 然后data是一个json数组,每行一个对象,对象中包含对象数据,比如每个都有filed1和field2。这就好象数据表一样。 template是某种格式的模板?比如xslt?或者自定义的html模板语言,比方说: <li class="xxxList"> <div>${field1}</div> <div>${field2}</div> ... </li> 不知道是不是我猜测的那样? |
|
返回顶楼 | |
发表时间:2008-04-27
hax 写道 leebai 写道 同意“Server business”中,business logic层不能直接暴露给客户端调用(js其实也不可能直接调用Java),你说的那个Fasade层,我原先也将其称作是Controler,但这样容易与MVC的概念混淆,所以现在倾向于这样表述: [size=small;]Ajax +“Server business”应用,就是View Controler [size=small;]而你说的那个Fasade层,其实大有文章,远比MVC的Controler[/size]内容丰富,本质上就是V/M框架,虽然7wxAop框架已经实现了V/M之间的很多控制,目前我还没找到合适的词来表达它,这方面可以深入探讨。 [/size]+ Model应用,不存在 我感觉,大家得先定义一下这个Facade也好,Controller也好,它的具体职责是什么,和前后两端是如何配合的。否则很难说大家指的是一个相同的东西。 暂且称它为 X层 吧(这个字母还真有桥梁、联接、中介的意思:-))。 在7wxAop的Aop中,X层 做了以下工作(比较乱,先随便列出来): 1、临时停止和恢复business访问,某些后台维护时要用。 2、对model层掩盖multipart/form-data访问(既俗称的文件上传)和普通访问的区别 3、抽取Request各种信息,记入系统设置的一个数据结构,用于系统调试和排错。 4、在线用户列表维护 5、SSO机制支持 6、错误处理 7、访问日志处理 8、business方法的访问权限控制 9、指定并动态切换Model的数据源,DB连接及释放,事务管理 10、将Model层得到的业务数据封装成前端需要的格式,并返回 11、攻击检测及访问拒绝(实现了一小部分) 12、后台桩线程,用于每日,每周,每月,每年要做的定时处理 计划要在 X 中做的还有: 1、返回数据缓存策略 2、可配置、前端可指定的返回数据格式 有兴趣的同学,可以想想 X层 还要包括哪些功能。 |
|
返回顶楼 | |
发表时间:2008-04-27
hax 写道
leebai 写道
组件是王道没错,但模板在很多时候能解决组件无法解决的问题,尤其是界面显示的可定制性。举个例子: 7wx的ListView组件主要用于显示各种各样带翻页或不带翻页的内容条目列表,比如: 所有这些都是ListView组件Render出来的,界面中每个条目能显示成什么样子,是通过HTML模版定义的, 你想象,单纯的OO Grid组件模式要显示这些形式各异的列表有多困难,这也是7wx ListView与其他js Grid完全不同的地方。 我没看过代码,我胡乱猜测一下,大概是这样? var myList = new ListView(data, template); container.addComponent(myList); 然后data是一个json数组,每行一个对象,对象中包含对象数据,比如每个都有filed1和field2。这就好象数据表一样。 template是某种格式的模板?比如xslt?或者自定义的html模板语言,比方说: <li class="xxxList"> <div>${field1}</div> <div>${field2}</div> ... </li> 不知道是不是我猜测的那样?
|
|
返回顶楼 | |
发表时间:2008-04-27
leebai 写道 模版部分你基本猜对了,就时在HTML里面挖窟窿,填占位符{},没有通常模版的枚举和循环以及程序性代码。 代码部分目前的版本没你想的OO(汗),像这样: XfillTableWithArray(tableTemplateID,arrayData); 页面布局也不是用 container.addComponent()方式,而是直接用HTML,美工画好之后,哪个HTML元素需要成为“组件宿主”,就给它加一个“id=controlName”,然后在代码中引用controlName,这个HTML元素也就成为“7wx组件”。 感觉HTML比js代码更擅长布局、样式、显示定制,故不用js“构造”界面,只用js“操纵”界面。这里的思路与Ext等组件模型完全不同。 你的设计比我想象的更接近我理想中的方式,呵呵。而且我觉得你的设计其实离HTML组件方式很接近啊。 |
|
返回顶楼 | |
发表时间:2008-04-27
leebai 写道 achun 写道 哦明白了,我们说的是不同的东西。
了解讨论对方的工作背景真的很重要,很多低效的讨论是因为参与者不愿深入了解他人的工作。 其实你这jCT中的“存储”型模板,完全可以被7WX框架借用(7WX中也有类似的东西,只是功能没jCT强)。 Browser UI模型的“局部界面更新”,除了主流的“组件方式”外,确实还应该包含“模版方式”。 难得能得到一句称赞的话,有了你这句话,我才敢继续围绕我的模版方式说下去。 可以看出楼主也有要加大模版方式强壮度的想法(不是猜错了吧!) 我现在已经有了初步的使用方案,因为是初步形成,而且文字表达起来我还没有组织好。 方便的话我们可以语音聊聊,效率高省时间。 现在初步说说我的方案: 1.技巧 这个方案完全是编程的技巧, 2.就模板来说,模板就是模板不应该显示的在功能上负责DOM树的问题 3.完整的说这个方案涉及了前后台所有的变量命名规则。 4.核心:这个说来不配合项目大家是不会明白我说什么的,还是要说说。 我定义了一个表达式,这个表达式完成了绝大多数的需求。 [selectors::][jct Function][..foo function name] 临时起个名字叫3P表达式(3段表达式,千万别想别的) 解释: selectors====DOM选择表达式,就是jQuery,prototype或者w3c标准定义的选择子 ::=========定界符号,选择这个是因为不会和selectors产生冲突 jct Function====jCT解析后的对象,当然也可能式存储对象 ..=========定界符号,选择这个是因为不会和selectors或jct Function产生冲突 foo function name=======用什么方法完成装配。这个根据前面的两个值的不同有多种变化。 可以看出这个表达式涉及了DOM树,表现和数据的组装,表现的具体方式(foo function name)。 5.jCT在这里的作用: 除了表现和数据的组装(解析)这个模板固有的功能外,就是jCT里面的 引用 FixDat:发生在数据Load前 当然是对数据的前期处理,例如排序,或者更改属性名称等,说白了,就是为达到这样的效果做的前期准备:写一个(类)模板,能适应不同数据的变化做的数据预处理接口. ViewBefore:发生在数据Load后,装配到页面(视图)前 这里面有个要商榷的问题,传入什么参数呢?这直接影响到ViewBefore的作用. 我认为应传入 *视图* 对象或与 *视图* 对象相关的DOM对象. 做什么呢?当然是做表现层(视图)的前期处理. ViewAfter:发生在装配到页面后 明白了ViewBefore的作用,这个就顺推了. 传入 *视图* 对象或与 *视图* 对象相关的DOM对象. 做什么呢?当然是做表现层(视图)的后期处理.有些DOM对象的具体值只有装配上以后才能确定下来, 比如样式对DOM结构的影响,装配上以后再分析处理要当然要轻松很多. 这三个模板设施了。 可以看出这三个设施就是配合最终表现的法宝。 现在看看我上面说的东西,她贯穿了前台页面表现中的逻辑要点。 自己都不知道我说明白没有。 |
|
返回顶楼 | |
发表时间:2008-04-27
hax 写道 icewubin 写道 leebai 写道 在正真的B-UI应用中,Browser自己负责界面构造和界面跳转,Server只负责提供business logic 访问,也就是说[size=small; color: #ff0000;]Server上根本就不需要S-UI的Web层(虽然还是HTTP访问),没有所谓的Controler,也就是说MVC不再是真理,Spring MVC/Struts之类的Web层框架完全没有必要[/size]。“server pages”开发者理解B-UI时最大的思路陷阱就是“Web层”,MVC。 B-UI(Ext等界面组件+HTML+JS+ajax)是S-UI(jsp,jsf,asp,asp.net)的完全等价物,不存在什么功能jsf能做, B-UI不能做的问题。
从结构上来说,即使没有Controller层,business logic层不能直接暴露给客户端调用(由此我反对使用DWR框架),也就是说,还是要有一层Fasade,所以还是留着好,虽然名字还叫Controller但是主要职责已经变了。为什么说主要职责,是因为Controller层还是有它的用的,传统的方式比如自定义tag用来“写”(生成)JS的local数据要比发Ajax请求效率要高得多,应用场景是界面上的下拉框不需要频繁从服务端取数据,大多数情况都是取一次的,就没必要用Ajax请求。 或者这么说吧,如果页面上有10个下拉框,而且内容都不能写死,都要从服务端取,纯粹的Ajax方案在这种场景下性能反而是倒退的,因为http请求发得太多了。目前觉得还是结合传统的方式更好一点,可以一个ftl(或jsp)+一个JS文件,ftl(或jsp)中的代码可以很少,比如都是些取数据的tag。进可以完全的不用tag语法,退可以随时大量用传统语法解决变态需求。 并不能说DWR框架就一定导致business logic暴露给客户端。使用Facade和DWR并不矛盾啊。而且我认为Controller如果仅仅是为了解决网络存取效率问题,那并不能算是Facade,只能算一个Proxy。而且如果考虑HTTP支持keep-alive和pipeline的话,可能就不必考虑多个请求的问题了,那样的话又如何?——注意我并非说B端可以直接操控biz logic,但至少你这里的理由不充分。 不好意思,没有说全,这个问题我犹豫了很久,因为我不了解DWR,去年9月决定要不要上DWR的时候非常痛苦。当时北京分公司的JS第一高手推荐DWR,但是看到fins在有一个贴子说了原生Ajax设计的不应该出现DWR的框架。我看了很多DWR的用法和评论,也没有说将来一定不用。直接暴露算是一个很不好的DWR的应用,你说得对,谈不上是矛盾。 主要因为以下3点: 1.DWR还是属于服务端生成代码式的框架结构,感觉不够灵活。 2.使用配置文件的方式,我很讨厌配置文件,我认为配置就是代码,但是IDE对配置文件的支持远不如对代码的。 3.因为我们使用Hibernate,为了performance tune,我必须要精确控制对象图的导航模式,一定要非常非常灵活,最后的方式,是我自己写了个工具类来进行对象导航,生成JSON数组。DWR在这点上可能满足不了我的要求,也有可能是我不了解DWR。 keep-alive和pipeline要经过封装才能降低使用成本,目前用tag的方式一次性取数据也是偷懒的方法,架构上不优雅,但是蛮简单的,呵呵,过渡性的,我就等着有好的而且成熟的解决方案出现呢。 |
|
返回顶楼 | |
发表时间:2008-04-27
hax 写道
你的设计比我想象的更接近我理想中的方式,呵呵。而且我觉得你的设计其实离HTML组件方式很接近啊。
|
|
返回顶楼 | |