锁定老帖子 主题:代码擂台,特别有请buaawhl
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-07-20
jackyz 写道 如果加入一个中间层次,我是说一个配置文件或者ognl等,总之就是尽量达到1.“封装显示逻辑”,2.无需“更改-编译-重启”,这两个目标。 如果这样的话,页面布局被封装在html中,而且仍能被wysiwyg。数据逻辑被封装在java代码中,能保持相对的稳定。显示逻辑被封装在这个新加入的中间层中,能够方便的调整。让这三个层次和谐共存彼此互不影响。 “简化我们的生活”?呵呵,这永远是我们的梦想。 这是一个好主意。我也这么想过。 用ognl定义PO 业务数据和Template DOM之间的映射关系。 fastm根据这个映射关系自动把PO 业务数据设置到VO(ValueSet DOM)。这样用户就不用自己写代码把数据设置到ValueSet DOM了。 我准备在fastm的stable版本加入: 利用reflection把bean的属性一次设置到ValueSet的方便函数。 利用reflection根据bean list一次生成一个ValueSet List的方便函数。 利用Dynamic Proxy实现“显示逻辑”AOP -- 全局格式化、全局风格统一控制。 这些都会大大减少用户的代码量。 比起脚本语言来,逻辑层次更少,语句个数更少。而且JDK1.5引入的新特性(for each)等也会进一步减少代码量。 这些加强特性对实现ognl映射也是一个很好的基础。 fastm项目本身不引入ognl映射这个特性。 但有可能创建一个fastm扩展项目fastmv中支持这些特性: bean(ognl) --> ValueSet映射, XML (XPath) --> Value Set 映射, fastmv项目作为fastm和其它Web Framework的桥梁项目。 利用bean(ognl) --> ValueSet映射,普通MVC的程序可以直接移植到fastm上。 利用XML (XPath) --> Value Set 映射, XML/XSLT程序可以直接移植到fastm上。 这种方案虽然能够解决编译重启的问题,也节省了设置ValueSet的代码, 但配置文件和步骤多了(每个页面需要一个模板文件和一个映射文件),学习成本增加,结构和效率降低。 其实,我从前也很看好Tapestry,就是因为每个页面的配置太复杂,所以放弃了。因为,配置复杂的技术注定不能应用于大项目。 而且映射关系从代码转到了配置文件里,就不能重用了。 很多特性,AOP,Filter Chain, Pipeline等就不容易使用了。 内心里,我还是希望fastm能以最直接、最灵活强大的方法使用。 这样带来的结果是,更小的代码,更好的重用性,更清楚的结构,更统一的控制,更快的开发速度和运行速度。 其实,很多情况下,脚本带来的代价更大。 比如,JSP、Velocity的编译不过,或抛出一个异常,你很难定位到那段语句。对于复杂的页面逻辑,也很难调试。 而写在Java Code里面的代码,可读性,速度,可调试性,可重用性都非常好。 而且需要重启的情况也并不是很多。如果你只是需要修改静态风格,直接修改fastm模板文件,fastm自动会重新装载模板。 通常需要改动显示代码的原因都是因为业务层数据的修改,这种情况下,脚本编写的程序也需要重启。 另外,fastm的编译速度很快,编译结果很小,重启的代价很小。 |
|
返回顶楼 | |
发表时间:2004-07-20
Xiaohanne 写道 其实,我们应该关注真正的问题本身 -- 动态生成页面内容。 Page Scripting在这方面走的太远了,太复杂了,甚至走入了歧途。 该是技术返朴归真,解决真正问题的时候了。 我们无法说为了开发效率采用成熟的框架技术是不对的;我们不能说为了开发效率使用IDE工具是不对的;我们不能因为追求的方向不同而说别的技术不好或不成熟;只是选择不同。 不过还是比较赞同你的一个观点,不要丢了最基本的技术,基础是很重要。 |
|
返回顶楼 | |
发表时间:2004-07-20
buaawhl 写道 其实,我们应该关注真正的问题本身 -- 动态生成页面内容。
Page Scripting在这方面走的太远了,太复杂了,甚至走入了歧途。 该是技术返朴归真,解决真正问题的时候了。 这段话是我说的。不是Xiaohanne说的。 说明一下,免得Xiaohanne被冤枉。:-) 选择成熟的框架技术,和IDE工具是对的。我没有批评这个。 我批评的,是脚本技术(比如JSP)依靠“修补”自身缺陷的发展之路。 Servlet的不足,产生了JSP;JSP的不足,产生了TagLib;TagLib的不足产生了TagLib可视化插件。整个技术越来越复杂。 而IDE也必须跟着这些发展而发展,不得不支持JSP调试,TagLib可视化。 结果造成技术的学习难度提高,程序结构复杂,对某些特有工具的依赖加强。 表面的好处是: (1)很多技术厂商以此项“修补”业务为生。商业繁荣了。 (2)提高了初学者的技术入门门槛,提高了复杂技术的“熟手”的身价。 但Web开发阵营并不是只有Java。Java的Web开发领域有可能因为技术门槛高,而丧失领地。 特别是当技术的复杂不是为了解决现实世界的问题,而是解决技术自身创造的问题的时候。 你可以认为MVC是解决了真正的问题 -- 开发架构的问题。 但你不能说TagLib解决了真正的问题。TagLib只是解决了JSP的问题。 同样,你也不能说TagLib可视化插件,解决了真正的问题,TagLib可视化插件只是解决了TagLib的问题。 (只有当TagLib成为象HTML, Flash,ActiveX等标准的Web表现格式的时候,你才可以说TagLib可视化插件解决了真正的问题。但我们知道,TagLib只是开发时候用到的。) 更深刻的影响是,甚至整个Webapp开发都会受此影响。 一个技术的发展如果太复杂,很有可能在 寿命还很长的情况下 毁灭自身。 如果Webapp的开发难度比来临的Web Service开发难度高的话,Web Service会迅速夺取Webapp的领地。 那也许是B/S Webapp一个时代,一个行业的终结。 为了避免对这个问题的争论。我说明,这只是个人看法。 我的观点的前提是 Servlet -> JSP -> TagLib 的技术越来越复杂。 (主要是我曾经调试察看过JSP + TagLib产生的Servlet代码,对其混乱冗长的结果惊诧不已) 当然,也许很多人认为这样发展的技术越来越简单,越来越好用。 如果是这样认为,那我承认我前面的观点都是错误的。 毕竟,这只是个人对学习难度和使用难度的观点不同,无伤大碍。和解决真正的问题,没有直接关系。 所以对持“脚本技术越来越简单好用”观点的人来说,我也赞同这样的看法, 并承认我的看法是片面的。 |
|
返回顶楼 | |
发表时间:2004-07-20
goncha 写道 看了大家对fastm, 以及显示控制代码的归属问题的讨论. 感觉fastm应该属于页面显示与业务操作的中间地带, 一个处理页面显示状态和业务操作状态交互的地带. 这似乎也就是MVC中C应该做的一部分工作. 将这份工作彻底地从JSP中独立出来应该就是fastm的目标了;-) 目前还没有什么实践的结果可以证实这样的确可以减少代码量, 增加重用性等. 但也不是不可取. 我还是会关注的.
一个建议: 把模板变量与EL或ognl相结合, 这样可以比较好的利用现有资源. 是的。这也是很多人的建议。你是更早提出来的。多谢。很值得考虑。 |
|
返回顶楼 | |
发表时间:2004-07-20
给buaawhl最后的建议:
好好去研读一下freemarker的文档,特别是第2、3章,你会发现fastm要做的事情人都已经做好了。而且方式方法要比fastm简洁明快,功能也更强大,至于用不用if/else逻辑,随使用者的选择,都可以。 建议你申请加入那个开发团队。 还有一个小建议,下次新的想法付诸实施之前,最好化2星期的时间写一个该方面现状的综述,以免闭门造车。 |
|
返回顶楼 | |
发表时间:2004-07-21
charon 写道 给buaawhl最后的建议:
好好去研读一下freemarker的文档,特别是第2、3章,你会发现fastm要做的事情人都已经做好了。而且方式方法要比fastm简洁明快,功能也更强大,至于用不用if/else逻辑,随使用者的选择,都可以。 建议你申请加入那个开发团队。 还有一个小建议,下次新的想法付诸实施之前,最好化2星期的时间写一个该方面现状的综述,以免闭门造车。 ------ 那么请给出一个例子,使用freemarker,不用if/else, 为Table的奇数行和偶数行,赋不同的颜色。 另外,正数用蓝色,负数用红色。 ------ 这让我怎么说呢? 你如果一开始就拒绝真正理解fastm的思路,总是从Velocity, FreeMarker的思路来理解问题。 当然看到似是而非的 概念提法 就很快的下结论了。 我以前就看过就看过freemarker的文档2-3章。 freemarker是velocity的加强版。和fastm毫无相似之处。 另外,我在blog里面写了一个该方面现状的综述。大概是2年经验的总结。 freemarker支持Data Model Tree。用类似于XPath,ognl等语言(xxx.xxx.xxx),来定位 对象数据层次中的某个数据,然后把它填到模板中的某个变量当中去。和模板本身的结构毫无关系。 fastm现在还不支持Data Model Tree。 fastm只支持模板结构树。和Data Model毫无关系。 fastm只有Template DOM,和ValueSet DOM。 而ValueSet DOM是用来对应Template DOM的。完全是对应文档结构的。 你可以试着用freemarker做这件事。 只有两个文件,page1和page2。不能分出新文件。 Page1里面有一个Table,Page2里面有一个List。 你用freemarker把Page1的Table摘出来,替换到Page2的位置。 你如果能用freemarker做到这一点。那么你说的,完全正确。 fastm能够轻松地做到这一点。 |
|
返回顶楼 | |
发表时间:2004-07-21
你先做,我再做.
我敢确信你根本就没有明白freemarker能干什么。可以那么说,fastm能做的,不管轻松不轻松,freemarker也能以类似的轻松方式实现。 不信你就做个东西出来。 |
|
返回顶楼 | |
发表时间:2004-07-21
至于那个奇数行和偶数行,不就是那个函数吗?如果我也用庄表为那种0,1,2,3方式,也使用那个tableadd函数,在velocity中就不需要用if/else
更何况freemarker了。 我前面好像说过,如果允许使用函数,那么实际上就可以实现if/else。最多把这个逻辑封装到函数里去。问题是velocity,freemarker等成熟的模板技术都支持函数,在这里fastm并没有优势。 |
|
返回顶楼 | |
发表时间:2004-07-21
charon 写道 你先做,我再做.
我敢确信你根本就没有明白freemarker能干什么。可以那么说,fastm能做的,不管轻松不轻松,freemarker也能以类似的轻松方式实现。 不信你就做个东西出来。 这是一个fastm的自由组装页面的例子。需要JDK1.4. 源HMTL文件有两个: Page1.html -- 包含一个Table Page2.html -- 包含一个List. 生成结果 HTML文件有四个: table1.page1.html -- table 在 page1里 list2.page2.html -- list 在 page2里 table1.page2.html -- table 在 page2里 list1.page1.html -- list 在 page1里 源代码说明: src目录下是fastm的源代码。不用看。 test.src包括了所有这个例子相关的代码。 fastmtest包就是fastm组装页面的所有代码。 testdata包是一个可以独立使用的包。只是用来制造假数据的。 你把testdata包直接放到你的工程中当作数据源。 数据源的数据结构说明: 有几个Office, 每个Office里面有一些Person。 当Person的个数少于4个。那么男的爱好运动,女的爱好香水。 当Person的个数大于等于4个。那么男的女的都爱好Party。 请用freemarker实现这个例子。 注意,就用两份HTML文件,不要另外分出文件。 大家也都来试一下,用你们最擅长的模板技术。实现这个例子。 |
|
返回顶楼 | |
发表时间:2004-07-27
hehe,这里还有一份?
关于这个问题,请参见 http://forum.iteye.com/viewtopic.php?t=6292 这个强大的超级无敌大变换违反了所见即所得的常识,hehe. |
|
返回顶楼 | |