免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4360 | 回复: 7
打印 上一主题 下一主题

mod_perl:选择模板系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-02 16:58 |只看该作者 |倒序浏览
1、模板系统的功能区别:
(1)运行模式:
为了提供最大的灵活性,大部分的模板系统提供两种执行模式:管道式和回调式。
在回调的执行模式下模板中会有应用程序的控制逻辑。它使用回调的方式来得到要显示的数据或执行一些动作(如用户验证)。使用回调式的模板系统有:Mason, Embperl, and Apache::ASP等。
管道式在CGI和mod_perl前作所有的工作,然后决定运行哪个模板,并把数据传递给这个模板。这个模本没有控制逻辑,只有显示逻辑。支持这种运行模式的模板系统有:HTML::Template和Template Toolkit。
回调模式在面向发布的站点上运行的很好。这种站点上的页面本质上是混合的,是由主题和列表组成。通常一个站点可以被分成不同的组件。使用回调模式的结果是可以减少文件的数目
管道模式比较像传统的mvc结构,使用这种模式可以提供更多的性能调优的可能。通常来讲文件的数目会比较多。
许多模板系统提供了改变运行模式的方法。如:Mason用户可以为应用逻辑和显示逻辑写不同的组件。Template Toolkit可以使用一个Handler来进行开发,把所有的应用逻辑放在模板中,这样就是在使用一个回调
运行模式。HTML::Template在这个方面上不是很灵活。
(2)模板系统的语言:

一些模板系统使用内嵌的perl语句。这些模板系统可以提供一些额外的语法,像Embperl中用来指定是不是显示代码输出的操作符或Mason的<%init>(用来指定什么时候运行perl代码)。
其他模板系统提供了特定的语言来代替内嵌的perl语句。
(3)解析器和缓冲:

这些模板系统的解析器是使用以下三种方式的其中一种来实现:(1)每次都解析模板。(2)解析模板,缓冲解析树。(3)解析模板,转换成Perl代码,编译。
第三种方式可以可以更好的利用perl语言本身的能力。它分析模板,产生perl代码,运行这些代码。然后以后的request就会使用已经编译好的perl代码,这样就提高了性能。这种方式与jsp的方式相同。
HTML::Template, HTML_Tree和Embperl 2.0beta版本都使用第二种方式,他们把模板解析成各自的内部数据结构,然后这个结构保存在内存中。Template Toolkit从2.0开始使用第三种方式。
第一种方式在没有一个长时间运行perl解释器时,效率比较好,在内存比较紧张的情况下,这种方式也比较合适。

2、开发框架和模板系统的比较

一些模板系统为web开发提供了一套完整的解决方案;一些只是提供了模板相关的解决方案,需要开发人员自己决定使用那个开发框架,开发框架提供的特性一般包括:

(1)url映射

所有的开发框架都提供一种把url映射到模板文件的方法。
(2)跟踪Session

大多数的交互站点都需要某种Session跟踪机制来把用户和相应的数据关联起来,一些工具通过操纵Cookie或url来把当前用户的Session数据放入一个对象或哈希表中。通常是使用模块Apache::Session。
(3)输出缓存

虽然输出的缓冲超出了模板系统的范围,但是Mason还是提供了这个功能。
(4)操作Form
许多工具提供了解析Form数据的能力,并把它们放入到一个非常方便的数据结构中。一些还提供Form的验证功能。
(5)纠错

为了改善模板系统难以纠错的问题,一些系统提供了内嵌的纠错支持,包括输出日志,和perl的Debugger整合。

如果你想使用模板系统,而且不想自己实现这些功能,那么在CPAN上已经有了一些工具来提供这种开发框架如libservle(和Java Servelt API类似)。 Apache:ageKit和CGI::Application也是可以选择的,但是

他们是和HTML::Template结合的。 OpenInteract是和Template Toolkit结合的。
3、模板简介
(1)SSI

SSI是其他模板系统的祖先。在mod_perl安装的情况下mod_include获得了额外的好处。如:可以使用#perl指示符来调用子过程;也可以使用Apache::Include模块包含Apache::Registry脚本的输出。

Apache::SSI使用perl来实现mod_include模块的全部功能,包括#perl的新的指示符。

SSI使用的是回调的运行模式,而且有自己的表示语言。因为SSI使用的是每次都解析模板的解析方式,所以在文件数目非常多的情况下,也不需要考虑内存的问题。

当对模板的需求比较简单的情况下SSI是一个好的选择,特别是只是在页面中共享标准的头和脚注的情况。
(2)HTML::Mason

Mason已经存在几年了,主要的功能是把页面分成可重用的组件。Mason使用内嵌的perl,但是提供了一种方式来把perl代码和html代码分开。组件(模板)可以在文件的末尾包括一段perl代码,然后可以使用tag

来在模板其他部分运行前运行这段代码。这样可以允许把程序逻辑放在文件的末尾来和html代码区分开,这样就可以使用简短的perl代码来向html页面中插入值和循环List等。

Mason是一个站点的开发框架,而不仅仅是一个模板系统。他包括一个非常方便的缓冲特性来扑捉组件的输出或存储费时的数据。目前他是唯一一个提供内建缓存机制的工具。他还实现了参数解析的能力,用来指定

组件的名字,类型和缺省值(包括传递方式从其他的组件还是通过Url)。

Mason可以以回调方式,管道方式运行。这是通过几种方式实现的:把组件看做在某个目录结构中的“autohandler”,让他首先运行。 autohandler可以为了显示模板来准备数据。它还支持面向对象的途径,应用继承的概念到站点的目录结构上。例如:在/store/book/目录下的组件可以继承一个在/store/目录下的组件的标准布局,但是覆盖了背景颜色和导航条。而且/store/music/可以做同样的事情,只是使用不同的颜色。这种特性为开发大型的站点提供了非常方便的能力。Mason的debug能力是通过在web环境外创建debug文件来达到的。
Mason的另一个特殊的能力是把一个大模板的静态部分放在硬盘上,只有在需要的时候才读入。

在这个包中还包括其他许多功能,如:HTML输出过滤、页面预览。对于Session的支持不是内置的,需要整合Apache::Session模块。Mason的特性对于新手来说可能太多了,他的高质量的文档和友好的用户群才是

他成功的真正的关键。
(3)HTML::Embperl

他是最流行的内嵌Perl的模版系统之一。也是存在最久的。他在速度和易用性方面享有盛名。E

他通常使用回调方式,解析URI和处理请求的文件。然而他也可以通过子过程来调用,这样就是在一个管道模式在运行。模板被编译成Perl字节码,然后被缓存。他支持扩展的debug工具包括像管理员发送电子邮件来报告错误。把Embperl与其他内嵌Perl的模版系统区别开的主要特点是他和HTML结合的紧密程度。他通过遍历数组还生成Table,在Href或Src后的查询字符串末尾放入数组或哈希表的引用,会被自动扩展成name=value

的格式。META HTTP-EQUIV标签会被真正的转换成HTML的HEAD。

喜欢Embperl的另一个原因是他把一些通常的任务简单化了。如:所有的Form数据通过%fdat都可以访问到,Session的数据都可以在%udat中访问到。在Embperl中还有一个哈希表用来存储应用程序的持久状态。

HTML-escaping是自动的。

Embperl提供了叫EmbperlObject的东西,可以通过它来实现Mason中提到的继承特性。
老版本Embperl的一个缺点是当包围在非Perl代码的部分时,Perl的控制结构如if和foreach都必须使用Embperl指定的内置的替换符,如:

[$ if ($foo) $]
Looks like a foo!
[$ else $]
Nope, it's a bar.
[$ endif $]

在版本1.2b2后,就可以使用Perl的语法结构了:

[$ if ($foo) { $]
Looks like a foo!
[$ } else { $]
Nope, it's a bar.
[$ } $]

在Embperl2.0中包括了一些有趣的特性如:可以根据用户的需要修改解析模式。可以再Embperl中直接使用Perl的Debug。
(4)Text::Template
他易于使用并且有很好的文档。在文档的例子中现实的是管道执行模式。但是使用它可以很容易的写一个mod_perl的Handler来直接调用模板,这就是回调方式。他有能力运行内嵌的Perl代码。
它使用内嵌Perl代码的方式来得到模板系统提供的功能如Include。这样做好坏参半,如:当include一个文件时,你只需要调用Text::Template::fill_in_file(filename)。然而,你必须指定文件的全路径,而且
没有什么办法来阻止你Include文件“/etc/passwd”。
大部分成熟的模板系统都可以指定搜索路径,让你在指定的路径列表中查找要包含的文件。你可以自己写一个子过程来达到这个效果。
每个加载的模板都被作为一个单独的对象对待。模板被编译成Perl代码,只有在第一次使用时才进行解析。为了发挥这种缓存机制的全部能力,你需要跟踪那些模板被使用过了,Text::Template不提供这个功能。
Text::Template不能和HTML结合,只是一个模板模块,不是一个应用程序开发框架。
(5)Template Toolkit

Template Toolkit是一个非常灵活,有自己表现语言的系统。他有一套完整的与数据整合的指示符,包括循环和逻辑判断,而且还可以进行扩展。

内嵌的perl支持可以通过配置选项来启用,但是通常这种方式在不建议的。它使用编译,在内存中保存Perl字节码的方式,可选的可以在硬盘上缓存产生的Perl代码。他通常使用管道模式。它包括的

Apache::Template模块允许直接通过URL来调用模板。

Template Toolkit支持非常丰富的特性集。

TT支持通过DOT的方式来访问复杂的数据结构,如:我们有下面的数据:

$vars = {
customer => {
name => 'Bubbles',
address => {
city => 'Townsville',
}
}
};

那么我们就可以使用下面的方式在模板中访问内嵌的数据:

Hi there, [% customer.name %]!
How are things in [% customer.address.city %]?
这种方式要比传统的perl访问方式要简单。如果我们传递的数据就够中有一个对象,我们也可以使用同样的方式来调用对象的方法。

模板可以定义宏和包括其他的模板,也可以传递参数。被包含的模板有自己的变量域,这样就不会发生变量冲突。

在TT中有filter指示符用来处理输出。

TT支持插件的概念,可以使用他来向模板加入额外的功能。提供的插件主要是用来进行数据访问和格式化。标准的数据访问插件包括访问XML数据或DBI数据源,在模板中使用数据。

在TT中也有插件用来访问CGI.pm。
格式化插件允许以特定的方式显示数据。还有一个Table插件用来以多列的方式显示列表。
TT也为模板开发者提供一些方便的功能如消除Tag周围的空白,改变Tag的分隔符。

TT还包括了一个名为ttree的脚本,用来处理模板的目录树。这个脚本检查修改时间,只在需要时,更新页面。TT还提供模板驱动的HTML小部件,以简便开发。
(6)HTML::Template

HTML::Template是一个提供自己的表示语言的,比较流行那个的模块。它使用非常简单的Tag来循环,逻辑判断和插入值。Tag的形式和HTML Tag相同,在某些情况下比较有用。

像文档中说的“他只做一件事,做的快速、认真。”。模板被解释成Perl的数据结构,可被缓存到内存、共享内存(使用IPC::SharedCache)和硬盘上。

HTML::Template和TT的区别不仅仅表现在语法上,HTML::Template比较快、比较简单,而TT有着更丰富的特性,像插件和DOT访问,下面是一个简单的语法比较:



HTML::Template:

<TMPL_LOOP list>
<a href="<TMPL_VAR url>"><b><TMPL_VAR name></b></a>
</TMPL_LOOP>

Template Toolkit:

[% FOREACH list %]
<a href="[% url %]"><b>[% name %]</b></a>
[% END %]

(7)AxKit2

AxKit2是基于XML的,他与其说是模板系统,莫不如说更像一个框架,它支持多个模板系统。它支持XSLT、TAL、XSP和基于XML的表现语言,可以通过它扩展自己的Tag,为开发自定义Tag库,提供了便利。
(8)Petal和Template::TAL

这些模块都是基于TAL模板语言的。Petal提供了一些扩展,但是Template::TAL就是一个比较严格的TAL实现。基本的思路是使用XML文档,使用TAL命名空间中定义的属性来指定数据、循环和判断。
这意味着它使用的是自己的表现语言,模板是一个XML文件。
下面是从Template::TAL文档中取得的例子:

<li tal:repeat="user users">
<a href="?" tal:attributes="href user/url"><span tal:replace="user/name"/></a>
</li>
Petal通过一个自定义的解析器来支持XHTML和HTML,这样就可以用一些所见即所得的工具来编辑模板。

Template::TAL使用XML::LibXML。
(9)ePerl

可能是第一个把Perl代码嵌入到文本或HTML文件中的模块。但是实在是太古老了。
4、性能

人们总是担心模版系统的性能。如果你开发过大型系统,你就会发现模版系统永远不是你第一个寻找性能问题的地方。以上谈及的系统都有着有意的性能表现。同在数据库中查找数据相比,模版系统带来的性能损失

基本上可以忽略不计。

如果你认为是模版系统是你的系统变慢了,那么可以使用Devel:Prof查看一下。

如果你真的想要节省模板系统带来的时间上的消耗,那么使用print语句吧,最简单就是最快的。

通过测试SSI, Apache::ASP, 和HTML::Embperl有着最好的性能。你也可以下载测试代码进行测试。
5、CGI相关的性能问题
当结合使用CGI和模版系统时,需要考虑的问题有:perl编译模板代码的时间;而且CGI对打断内存中对模板的缓存。Mason、 HTML::Template和Template Toolkit提供的相对较慢的硬盘缓冲模式还是可以工作的。
当与CGI结合时,最好使用相对简单的模板工具,如CGI::FastTemplate或Text::Template。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
2 [报告]
发表于 2009-05-02 21:06 |只看该作者
FastCGI解决方案如何?
easyworld 该用户已被删除
3 [报告]
发表于 2009-05-03 17:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-05-04 13:59 |只看该作者
支持mod_perl和mason

论坛徽章:
0
5 [报告]
发表于 2009-05-04 15:30 |只看该作者
我使用FastCGI + Template::Toolkit开发

论坛徽章:
0
6 [报告]
发表于 2009-05-04 15:36 |只看该作者
支持mason,Template::Toolkit和HTML::Template

论坛徽章:
0
7 [报告]
发表于 2009-11-19 14:16 |只看该作者
good

论坛徽章:
0
8 [报告]
发表于 2009-11-19 14:22 |只看该作者
原创么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP