天才日记

喳喳鸟的个人博客
posts - 5, comments - 74, trackbacks - 0, articles - 0

web程序模板的各种实现方式

Posted on 2007-06-25 08:23 喳喳鸟 阅读(3672) 评论(41)  编辑 收藏 网摘 所属分类: 论坛开发
现在很多程序为了追求界面的可定制,都提供了模板功能。用户可以选择自己喜欢的界面。模板的实现方法很多,如何找到一个克定制性强且高效率,基本不影响性能的方法呢?

我先例举几种都被使用过的方法

1、css控制
准确的说这种方法不算模板了,就是html是固定的,但提供了多个css文件,完全依赖css来控制背景图片、图片或者表格和层的样式。这个方法的实现我就不说了,非常简单,只要给不同的用户链接不同的css文件就可以了

优点:对性能完全没有影响
缺点:有局限性,不能改动页面布局

2、读取模板文件,把标识符替换为内容并输出
可以使用多个文件夹,每个文件夹都是一套模板,每个文件夹里都有文件名一样的html文件。但他们的内容是不一样的。当需要显示页面时,服务器端的程序根据用户的选择,去读取相应的模板文件夹里的文件内容,然后替换模板里的一些标识符(例如 $subject 被替换为文章标题,$content 被替换为文章内容),最后输出。当然我主要只是阐述原理,实际上的实现比这要复杂一些,包括缓存的处理,否则每次去读取.html模板文件性能很差。

优点:模板灵活程度很高,可以随便改动页面布局
缺点:即使对读取模板使用缓存,也仍然影响性能。因为替换标识符的性能显然也好不到哪里去。同时,模板里只能使用标识符,不能直接调用.cs代码文件中的任何变量和方法。

3、动态载入.ascx用户控件
这是cs一直采用的做法,受cs影响,也是国内很多人采用的做法。此做法也可以使用多个文件夹,也是每个文件夹一套模板。只是模板文件名不是.html而是.ascx。当需要显示页面时,服务器端的程序根据用户的选择,直接使用 LoadControl() 方法来载入.ascx文件。

优点:模板灵活程度很高,可以随便改动页面布局,可以直接调用.cs代码文件中的变量和方法
缺点:影响性能,且模板可读性不高,因为模板里不是使用类似$subject这样的标识符,而直接使用了代码快(比如<%=subject%>)

4、读取模板文件,不替换标识符,直接生成一个aspx文件供系统使用
对用户来说,这个方法实现出来的效果和第二种方法完全一样。也是多个文件夹多套模板,同样是html文件做模板。唯一不同的是,html模板文件只有在系统启动的时候才会被读取一次,然后自动转换为aspx文件并保存在硬盘上。举个例子: 模板中的 $subject 用正则表达式找出并替换成 <%=subject%>。当然,新生成的aspx文件应该和原来的html模板保持同样的文件夹结构。

关键是用户怎么切换界面。其实说白了就一个字:Url重写。多套不同的模板,现在通过处理,其实就是多套不同的aspx文件了,在不同的文件夹下,显然,可以在url重写之前就获得用户的设置,根据用户的选择rewrite到相应的目录中去。

当然,实际实现起来比我讲的要复杂很多。

优点:模板灵活程度很高,可以随便改动页面布局,可以直接调用.cs代码文件中的变量和方法,几乎不影响性能,模板可读性和方法2一样。
缺点:增加启动时间。


欢迎大家补充其它方法。


---------------------------------------------------------------------------
bbsMax 2.0 即将发布 http://www.bbsmax.com

Feedback

#1楼   回复  引用  查看    

2007-06-25 08:33 by GoGoSonny      
2.0的主题皮肤?

#2楼[楼主]   回复  引用  查看    

2007-06-25 08:37 by 喳喳鸟      
楼上说的也是一种,不过这个方法其实类似第一种,只能改变css,对页面布局是没有办法改变的

#3楼   回复  引用  查看    

2007-06-25 08:41 by GOFI XIAO      
不错,挺详细的,不过更加企盼作者能够出一个更加详细的实现方案,有demo最好不过了.

#4楼   回复  引用    

2007-06-25 08:53 by 流年[未注册用户]
bbsmax用的是最后一种了?

#5楼[楼主]   回复  引用  查看    

2007-06-25 08:55 by 喳喳鸟      
bbsmax 用的是第五种,还没公布出来,哈哈,发布产品要留点悬念。bbsmax 用的方法理论上效果和第四种一样,只是硬盘上看不到aspx文件,也不会增加系统启动时间。但会增加单页面的首次启动时间

#6楼   回复  引用  查看    

2007-06-25 08:56 by kiler      
web程序模板最好把一些通用的业务做成Dreamweaver的插件,这样的话就可以直接给美工用了。程序员不用操心。

#7楼   回复  引用    

2007-06-25 08:58 by evilpaw[未注册用户]
不同意
1、css控制
缺点:有局限性,不能改动页面布局
这个有待商榷!
调用不同css完全可以改变页面的布局,特别是想pjblog的blog切换一个css,页面的布局可以完全不一样了(视觉上)

#8楼[楼主]   回复  引用  查看    

2007-06-25 09:00 by 喳喳鸟      
但不可否认局限性是相当大的。最多做成绝对定位好了,每块地方都可以定不同位置。但你不可以在不同模板中使用不同html

#9楼   回复  引用  查看    

2007-06-25 09:01 by 网魂小兵      
不错,不错
学习中...

#10楼   回复  引用    

2007-06-25 09:05 by 帅帅[未注册用户]
很好,很有才。

#11楼   回复  引用    

2007-06-25 09:07 by 随风随云
传说中的BBSMAX?

#12楼   回复  引用  查看    

2007-06-25 09:16 by dudu      
建议调整一下摘要的排版。

#13楼   回复  引用    

2007-06-25 09:38 by Grave[未注册用户]
bbsmax 估计 是把html模板直接存入缓存中, 根据URL(urlrewriter)读取相关数据正则替换模版关键字,最后直接显示替换后的模版~~我现在有个项目就是这么做

#14楼[楼主]   回复  引用  查看    

2007-06-25 09:44 by 喳喳鸟      
楼上的你说的其实是第二种方法。这对于cms等可以这么做,因为内容固定。对于 bbs 不行,因为bbs每个人看到的页面都不同,而且内容随时变化

#15楼   回复  引用    

2007-06-25 09:54 by Grave[未注册用户]
回楼上 我说的东西有点简单~单根你说的还是有很大区别的~说个简单的例子:
比如我在模版中载入某个文件文本 只需要在模版中<#loadfiletext(filename)#>
载入个数据只需要 <#loadDate(filename,date)#>,要定义的东西还很多~有些东西光凭几句话说不清楚。

#16楼   回复  引用    

2007-06-25 10:12 by azmo[未注册用户]
好。。。来学习了

#17楼   回复  引用    

2007-06-25 10:13 by ruanyp[未注册用户]
研究了下楼主的论坛,无意中发现HTML里没有ViewState和PostBack?

楼主所说的第五种还未公布的方法,是否也可以直接调用.cs代码文件中的变量和方法?

#18楼   回复  引用    

2007-06-25 10:25 by lovebanyi[未注册用户]
第五种方法.. url重写到不同的文件夹(模板文件) cs可以共同继承于同一个cs.

#19楼   回复  引用  查看    

2007-06-25 10:28 by 风云.NET      
优点:爱什么改就什么改.
缺点:url重写的规则复杂一点. 另可以把不同的版块处理成不同的二级域名.

#20楼   回复  引用  查看    

2007-06-25 10:35 by 风云.NET      
速度 好象比原来的快了一些.

#21楼   回复  引用    

2007-06-25 11:30 by 流年[未注册用户]
我猜第五种应该是动态编译吧

#22楼   回复  引用    

2007-06-25 12:48 by sigmazel[未注册用户]
第一种的说法不太准确,好的css设计可以实现内容与显示分离,可以切换页面布局。

我补一种xml+xslt方式,xslt是标准的模板语言,其功能就不说了。只是性能也不是想像的那样好。

利用传统的asp.net的运行方式我个人觉得控制器分离,aspx只做页面显示,url重写是比较不错的方案。

#23楼   回复  引用    

2007-06-25 12:57 by Jeffer[未注册用户]
第五种不就是 Discuz NT 的做法么?
前一段时间不是很多人骂 Discuz NT 么?

干嘛模仿???

#24楼[楼主]   回复  引用  查看    

2007-06-25 13:02 by 喳喳鸟      
楼上的,拜托discuzNT 是第四种,但不全是……而且他不是生成标准aspx,而是生成一个 Response.Write 出来的页面,连控件都不能用了。第五种我并没有公布,因为不会生成aspx

#25楼[楼主]   回复  引用  查看    

2007-06-25 13:03 by 喳喳鸟      
第五中方案我会在bbsmax开源后再公布

#26楼   回复  引用    

2007-06-25 13:14 by 学习[未注册用户]
期待你的第5种方法~呵呵~学习学习

#27楼   回复  引用    

2007-06-25 13:32 by ttvnc[未注册用户]
我建议你们研究一把JavaEye的功能设计,我觉得很好。他们把Blog/BBS什么的糅合在一起,本来就都是文章,只是角度不同而已。

#28楼   回复  引用  查看    

2007-06-25 14:35 by YAO.NET℡      
说的很神秘哦..

#29楼   回复  引用  查看    

2007-06-25 15:02 by 戏水      
@sigmazel
xml+xslt 功能强大 ,但是对于普通站长学习成本太高了。
其再客户端解释 ,效率么,不好说

@喳喳叫
您所说的第五种方式 不方在硬盘上 就放在内存中缓存起来吧。。
不过 我不明白aspx既然是模板生成 , 还用控件做什么, 为什么那么多人执着于用控件捏?
期待您给大家带来新的思路 :)

#30楼   回复  引用  查看    

2007-06-25 17:17 by 达达      
鸟人,很久没看到你了,路过顶一下

楼上说的有些道理,既然是模板了控件好像没什么用途。

WordPress的模板就是让你自己写PHP代码,只是系统定义了一些获取数据的函数,WordPress把这些数据源函数叫做“标签”,这种机制要求做模板的人要会编写一些程序。

我觉得做模板的人他既然会HTML,CSS,和Javascript,那会一些编程其实也很正常的。并且模板的代码大部分是Copy来Copy去的,可能程序逻辑没有变,只是变些HTML或者CSS的内容。这样对做模板的人的编程能力要求又降低很多。

WordPress的模板做出来不一定就只有一个样子了,模板可以定义一些可变选项,并在系统里面添加一个模板设置页面,让使用模板的用户可以不改模板代码做一些自己的设置。

所以我觉得你可以不用太过考虑用户是不是会看不懂模板,试一试这种机制。

#31楼   回复  引用  查看    

2007-06-25 17:24 by 达达      
鸟人交换链接啊~~我的Blog搬到www.unbe.cn了

#32楼   回复  引用    

2007-06-25 17:38 by sigmazel[未注册用户]
@戏水

一般不会放在客户端,客户端做UI组件用XSLT,因为一些安全信息不能给用户看。所以一般在服务端解释xml+xslt。

还有一种方式是自定义编译方式。我没有用过。它说的四种和我说的xml+xslt我都用过。

自定义编译方式估计还不错。

#33楼   回复  引用    

2007-06-25 20:36 by 藏金阁[未注册用户]
有的见解,呵呵,只是看不懂写的是什么了,Web程序模板,我还以为是说怎么做这些模板,以后可以更快的制作出成品网站来的。

#34楼   回复  引用    

2007-06-26 18:13 by xjboy[未注册用户]
1.css也可以改变布局
2。用拖动来改变布局

所以拖动+css来实现

上述几种基本都用过

#35楼   回复  引用  查看    

2007-06-26 23:35 by Cat Chen      
基于ASP.NET的BuildProvider插件形式,你完全可以发明一种新的语言去描述你的界面,而完全抛弃WebForm。

只要你有足够的能力去做词法分析、语法分析,通过BuildProvider能够扩招到类似自己写一个ASP.NET编译器的水平,你喜欢怎样模板都可以,反正都是你自己设计的新语言。

#36楼   回复  引用  查看    

2007-06-27 00:38 by 杨正祎      
1、css控制

缺点:有局限性,不能改动页面布局

你太小看css了。

#37楼   回复  引用  查看    

2007-06-27 11:07 by 暗香浮动      
1、css控制
准确的说这种方法不算模板了,就是html是固定的,但提供了多个css文件,完全依赖css来控制背景图片、图片或者表格和层的样式。这个方法的实现我就不说了,非常简单,只要给不同的用户链接不同的css文件就可以了

优点:对性能完全没有影响
缺点:有局限性,不能改动页面布局

看到这儿觉得有待商榷。

#38楼   回复  引用    

2007-06-28 13:47 by wkjrakskl[未注册用户]
@帅帅
@Jeffer
asdfasf

#39楼   回复  引用    

2007-08-03 15:58 by 晴天水族
倒是比较了一下,但没有提具体可行性方案.呵呵,我满心欢喜的进来看看,以为能学习一些东西.失望了

#40楼   回复  引用  查看    

2008-11-18 10:41 by 蓉青姚      
后面几种看似不错,但想过没有,如果模板很多,不是要写N多CS文件?
可以问下 DUDU 的 博客园 的 模板系统如何实现的?

#41楼   回复  引用  查看    

2008-11-22 17:03 by clefoo      
@蓉青姚
博客园 不也是ascx控件吗?看源码



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 794377




相关文章:

相关链接: