设为首页 收藏本站
查看: 814|回复: 0

[经验分享] 用 Perl 来创建可重用的 Web 应用程序

[复制链接]

尚未签到

发表于 2015-12-27 11:46:50 | 显示全部楼层 |阅读模式
用 Perl 来创建可重用的 Web 应用程序




内容:

对象和类的关系
执行特定的 CGI 类
使用 HTML 模板
对 HTML::Template 的改进
用 CGI::Application 创建可重用的 Web 应用程序
结论
参考资料
关于作者
对本文的评价

相关内容:

面向 Perl/CGI 程序员的 Zope
服务器端的脚本语言

订阅:

developerWorks 时事通讯

CGI 编程中的对象技术和 HTML 模板

  Eugene Logvinov
Web 开发人员, softPilot.2000 组
2001 年 6 月

Perl 是面向复杂 Web 应用程序开发的方便而有效的工具。然而,即使是经验丰富的程序员也会因为 Perl 的学习和使用难度太高而不愿使用。本文阐述了 Perl 面向对象的执行能简化工作,特别是因为其分布式设计及应用程序的功能性能使其比其他 Web 技术更为有效

  当我尝试寻找一个好的留言簿脚本时发现,在 CGI 脚本中,面向对象的执行并不常见。我想要一个能通过改变式样、添加新功能等方式能进行轻易的修改,并能用来建立论坛的脚本。在 Web 上三十种免费留言簿中,没有一种符合我的需要。因此我转向了对象技术,作为面向基于 HTML 模板的、可重用的 Web 应用程序的解决方案。
  对象和类的关系
在设计对象模型前,最好检查一下现有的可能有用的 CPAN (Comprehensive Perl Archive Network) 模块。主要问题是新创建的类与 CPAN 模块类之间的关系。这种关系可能会是:a) 一个标准类对象包含在新创建的类中(“包含”关系),或者不太常见的 b) 新创建的类从标准类继承而来(“等价”关系)。
  下面列出的代码是一个面向 My 类的构造程序示例,它从 BaseClass 继承而来。此外, My 类包括 AnotherClass 对象,该对象是私有的(其名称以下划线字符开始 -- 这是个并非由 Perl 本身实施的传统)。
清单 1. My 类:执行关系

package My;
require BaseClass; #required if BaseClass is present in BaseClass.pm
@ISA=qw(BaseClass);
use AnotherClass;
sub new {
my $package=shift;
my $self=$package->SUPER::new($package); #create object in BaseClass
$self->{_another_class_object}=new AnotherClass;
$self;
}

  执行特定的 CGI 类
Lincoln Stein 的 CGI 模块非常适合处理脚本参数,但不适合用来生成 HTML 元素(当 HTML 嵌在脚本内部时)。有意思的是,CGI 模块既能以面向函数的方式使用,也能以面向对象的方式使用,并保持了被继承的能力。例如,CGI 模块能被 CGI::Apache 和 CGI::Fast 模块所继承,它们分别是 Perl-Apache API 和 Open Market FastCGI 标准的 CGI 接口。
  大多数 Web 服务器保留有它们自己的 API,该 API 执行 CGI API,并以特定的功能对其予以增强。Apache::ASP 模块(移植到 Apache Web 服务器上的 Active Server Pages)使用了五个面向 CGI 和会话管理的对象,这种管理使 CGI 脚本的编写更加容易。
  对于留言簿脚本设计来说,可以使用 API 来创建一个抽象类。一个抽象类至少需要一个纯虚拟函数。在一般情况下,它可能包括 new() 构造程序函数和 get_param() 方法(没有为之定义执行程序)。它应该包括使用 CGI 所需要的所有函数: get_cookie(), set_cookie(), get_script_url(), 和甚至更为高级的函数,如 is_print_form_mode() 及 is_print_entries_mode() 。该抽象类将被特定的 API 实现所继承。因此,当类被移植到另一个 API 上时,应该创建一个继承抽象类的新类。
  Perl 不直接支持抽象类。为此,我们需要用一些简单的技巧:禁止类对象的创建(让我们把类命名为 AbstractCGI ,请参阅以下清单),并定义所有的纯虚拟函数,这样在每次函数调用时就会发生错误。在这种情况下,要从抽象类中创建一个新的类,就应只继承 init () 和 get_param () 方法。新类已经含有了其它(独立于 API 的)方法。
清单 2. AbstractCGI 类:实现特定的 API (CGI)

package AbstractCGI;
sub new {
my $package=shift;
my $self={
_cgi_method=>undef, #simple class data
_query=>undef
};
bless $self, ref $package || $package;
$self->_init;
$self;
}
sub _init {die} #private method
sub get_param {die}
sub is_print_form_mode { shift->get_param('mode') eq 'form' }
sub is_print_entries_mode { shift->get_param('mode') eq 'entries' }

  使用 HTML 模板
让我们来看看用 HTML 模板来创建类。留言簿设计式样能存储在一个由脚本处理的普通 HTML 文件中,这样 HTML 编码人员可以对 CGI 一无所知,并能独立于 CGI 开发人员来设计 HTML 页。需要两个 HTML 文件:form.html (“添加输入项”页)以及 view.html (“查看留言簿”页)。
  在设计新类之前,让我们来看一下 CPAN。HTML::Template 模块允许在 CGI 脚本中使用 HTML 模板。Sam Tregar (模块的创建者)利用有意思的功能创建了一种有效的工具。模板本身是一个普通 HTML 文件,它含有由脚本处理的额外标签。当页面传递到客户端时,标签被脚本中定义的值所替代。此外,模块部分能根据脚本的值而被排除、包含或重复。这些关于模板的设想对于编写留言簿脚本来说特别有帮助。
  对 HTML::Template 的改进
同时,该模块也有弱点。有两种类型的模板标签: <TEMPLATE_TAG> 和 <!-- TEMPLATE_TAG --> 。这对于 HTML 编码人员来说有些不便。第一种不适合使用验证器的人。第二种不够鲜明。此外,两种类型无法被像 <a href=<!-- TMPL_VAR NAME=URL -->><!-- TMPL_VAR NAME=URL --></a> 这样的 HTML 结构所接受。浏览器无法正确显示这类代码。另一个问题出现在和 JavaScript 同时使用模板的时候(例如,试着在浏览器窗口中打开 HTML::Template 2.2 模块中的 /templates/long_loops.tmpl)。
  执行依次打开及关闭一个额外标签(两者均可能为空)会变得更加有效。一些句法类型也能起到帮助作用。一部分 HTML 设计人员更喜欢用在 PHP 中的 <? 和 ?> 标签,或用在 ASP 中的 <% 和 %> 标签。另外, _TMPL_TAG 能在 <A> 标签而不是 <?TMPL_TAG?> 中被有效使用。
  可能还需要其它改进。当然,一个 HTML::Template 的新的和特定的派生类可能会有用。这就需要您复制并编辑巨大的 _parse() 方法,该方法是模块的核心。另一个更为灵活的解决方案是在未来能得以简便、快速地升级的对象技术基础上创建一个新的模块。遗憾的是您不能在 HTML::Template 模块中实现这一步。
  用 CGI::Application 创建可重用的 Web 应用程序
CGI::Application 模块是专为创建可重用的 Web 应用程序而设计的,它使用了对象技术,并包括了 CGI 和 HTML::Template 模块。这一模块的观念简单而有效:应用程序驱动 Web 页,但反过来则不成立(就像 PHP、ASP、JSP 和 EmbPerl 等等)。Web 应用程序代码能保存在单个文件(模块)中。此外,该文件能包含完整的控制代码(客户端与 Web 页以及数据库和操作系统界面之间的交互作用)。
  CGI::Application 模块对于大多数 Web 应用程序(包括留言簿)来说都是一流的解决方案。使用该模块能轻易地创建一个新的和特定的派生类,它带有新的方法和经过改进的基础类。还可以有一个继承下来的构造程序(有着留言簿专用的新参数)和一个继承下来的 load_tmpl() 方法(举例来说,若用特定的模板模块来代替 HTML::Template)。
  结论
这种由受着单个 Perl 模块控制的 Web 应用程序来驱动 Web 页(模板)的设想对交互式 Web 应用程序特别有效。模板同样能驱动应用程序(在 CGI::Application 和 HTML::Template 模块中就不存在该功能)。留言簿说明了这种执行:模块形式包括了&#8220;名称&#8221;、&#8220;电子邮件&#8221;和&#8220;消息正文&#8221;等字段。由于不必在脚本中进行直接的字段定义,这些字段能由脚本轻易地从模板中获得。因此,我们就有了一个有重用性的应用程序:要修改应用程序,只需编辑模板就行了。

  参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
  • 在分发包中按所包含模块的字母顺序查看 CPAN 的模块。
  • 请参加 Tom Christiansen 关于 Perl 的面向对象的教程。
  • 请在 O'Reilly Open Books Project中寻找有用的参考资料。
  • 同样在 developerWorks上,请阅读:

    • 面向 Perl/CGI 程序员的 Zope
    • 服务器端的脚本语言


  • 请下载来自于 developerWorks的属于您自己的 IBM Developer Kit for Linux!

  

关于作者
Eugene Logvinov 是一位 softPilot.2000 项目的 Web 开发人员(乌克兰,塞瓦斯托波尔 CONSUL 局)。该作者是哈尔科夫国家大学(乌克兰)三十年的学者,他主要从事 Web 开发中的新观念的研究以及技术写作。通过 rezonal@univer.kharkov.ua 与他联系。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156912-1-1.html 上篇帖子: Perl 中的正则表达式 下篇帖子: Perl 教学 Perl5中的引用(指针)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表