论坛首页 Web前端技术论坛

从JSF和Ext看WebUI开发--给对JavaScript 有恐惧感的朋友

浏览 75307 次
该帖已经被评为良好帖
作者 正文
   发表时间: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,但至少你这里的理由不充分。
0 请登录后投票
   发表时间:2008-04-27  
hax 写道
leebai 写道
其实你这jCT中的“存储”型模板,完全可以被7WX框架借用(7WX中也有类似的东西,只是功能没jCT强)。Browser UI模型的“局部界面更新”,除了主流的“组件方式”外,确实还应该包含“模版方式”。


虽然我没有看过jCT和7WX,不过先放个空炮。上次jindw说他要搞客户端模板,我就跟他聊说客户端模板没啥前途,或者说存在一些与服务器端模板类似的问题无法解决。

模板(template)的主要问题是它是一种代码生成方式,因此与最终运行时模型是不匹配的。因此模板虽然有利于方便、安全的生成重复的代码,但是编写运行时脚本时的复杂度却大大上升了。我个人认为native的B端组件(data binding)才是王道,呵呵。




组件是王道没错,但模板在很多时候能解决组件无法解决的问题,尤其是界面显示的可定制性。举个例子:

7wx的ListView组件主要用于显示各种各样带翻页或不带翻页的内容条目列表,比如:

 7wx ListView 演示

 

所有这些都是ListView组件Render出来的,界面中每个条目能显示成什么样子,是通过HTML模版定义的, 你想象,单纯的OO Grid组件模式要显示这些形式各异的列表有多困难,这也是7wx ListView与其他js Grid完全不同的地方。

 

  • 大小: 256 KB
0 请登录后投票
   发表时间: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也好,它的具体职责是什么,和前后两端是如何配合的。否则很难说大家指的是一个相同的东西。
0 请登录后投票
   发表时间: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>

不知道是不是我猜测的那样?
0 请登录后投票
   发表时间:2008-04-27  
hax 写道

leebai 写道

同意&ldquo;Server business&rdquo;中,business logic层不能直接暴露给客户端调用(js其实也不可能直接调用Java),你说的那个Fasade层,我原先也将其称作是Controler,但这样容易与MVC的概念混淆,所以现在倾向于这样表述:
[size=small;]Ajax +&ldquo;Server business&rdquo;应用,就是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层 还要包括哪些功能。


0 请登录后投票
   发表时间: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>

不知道是不是我猜测的那样?




模版部分你基本猜对了,就时在HTML里面挖窟窿,填占位符{},没有通常模版的枚举和循环以及程序性代码

代码部分目前的版本没你想的OO(汗),像这样:

XfillTableWithArray(tableTemplateID,arrayData);

页面布局也不是用 container.addComponent()方式,而是直接用HTML,美工画好之后,哪个HTML元素需要成为“组件宿主”,就给它加一个“id=controlName”,然后在代码中引用controlName,这个HTML元素也就成为“7wx组件”。

感觉HTML比js代码更擅长布局、样式、显示定制,故不用js“构造”界面,只用js“操纵”界面。这里的思路与Ext等组件模型完全不同。



 

0 请登录后投票
   发表时间:2008-04-27  
leebai 写道

模版部分你基本猜对了,就时在HTML里面挖窟窿,填占位符{},没有通常模版的枚举和循环以及程序性代码。

代码部分目前的版本没你想的OO(汗),像这样:

XfillTableWithArray(tableTemplateID,arrayData);

页面布局也不是用 container.addComponent()方式,而是直接用HTML,美工画好之后,哪个HTML元素需要成为&ldquo;组件宿主&rdquo;,就给它加一个&ldquo;id=controlName&rdquo;,然后在代码中引用controlName,这个HTML元素也就成为&ldquo;7wx组件&rdquo;。

感觉HTML比js代码更擅长布局、样式、显示定制,故不用js&ldquo;构造&rdquo;界面,只用js&ldquo;操纵&rdquo;界面。这里的思路与Ext等组件模型完全不同。


你的设计比我想象的更接近我理想中的方式,呵呵。而且我觉得你的设计其实离HTML组件方式很接近啊。
0 请登录后投票
   发表时间: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结构的影响,装配上以后再分析处理要当然要轻松很多.

这三个模板设施了。
可以看出这三个设施就是配合最终表现的法宝。

现在看看我上面说的东西,她贯穿了前台页面表现中的逻辑要点。

自己都不知道我说明白没有。
0 请登录后投票
   发表时间: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]。&ldquo;server pages&rdquo;开发者理解B-UI时最大的思路陷阱就是&ldquo;Web层&rdquo;,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的方式一次性取数据也是偷懒的方法,架构上不优雅,但是蛮简单的,呵呵,过渡性的,我就等着有好的而且成熟的解决方案出现呢。
0 请登录后投票
   发表时间:2008-04-27  
hax 写道


你的设计比我想象的更接近我理想中的方式,呵呵。而且我觉得你的设计其实离HTML组件方式很接近啊。



过奖,一切都还在探索中。

如果新的 HTML Specification 能包含treeview、listview、grid。。。等大粒度组件,web UI模式之争其实没有任何悬念,甚至RIA都不是对手(flex/javafx等要达到HTML/CSS同等的表达能力几乎是不可完成的任务,如果达到了,就是另外一个浏览器引擎了),虽然多媒体及图形方面RIA将会保持自己的价值。

在HTML升级之前,我认为最好的办法是以现有的,形式最接近的HTML元素骨架,组合其他合适的HTML元素,通过扩充骨架HTML元素属性、方法、事件,来构造大粒度的UI组件。目前的7wx组件已经很老了,新版本将会融合近来的一些想法,应该会有比较大的更新。

 

0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics