- 论坛徽章:
- 0
|
什么是MASON?
MASON是一种组建化开发的框架式结构,其专门为大型商务类网站所设计。在其官方网站称为“嵌入Perl语言到HTML的模板技术”,但似乎在这里除了基本的语法同Perl一样外,已经完全不是那种顺序型解析的页面语言了。
何为组件化开发?
我们在开发任何一个页面程序的时候,都要难免的使用到面向对象化的开发技术。这个时候我们将每个页面看作一个独立体,每个页面都有其负责的代码进行处理,在每个代码中都会重复用到一些功能,这些功能都被封装成对象,以便每个页面调用,看似解决了重用了。但是确实这样吗?其实我们只是降低了冗余代码而已“每个页面的处理代码都不可避免的要重复调用对象里的方法”,我们依然没有真正的实现网页的重用(是面向对象化重要还是重用重要?!!这个问题讨论起来可就长了)。
当Amazon.com公司的程序员每天厌烦的写相同的页面处理代码的时候,他们已经恨透了这种形式!为什么十个页面代码中只有50%的地方有区别???为什么我们要浪费那么多时间去重复编写不必要的代码?于是他们想到了软件的结构,软件里是怎么做到的?每个FORM都通过基本对象Application产生,FORM只负责处理数据。
传统的网站处理技术:
用户登陆首页 用户填写注册信息
| |
| |
index.php useradd.php
代码中的结构:
index.php(new class,initialization,inprocessing,output)
useradd.php(new class,initialization,inprocessing,output)
普通计算机软件处理技术:
用户启动程序 用户请求打开某个菜单
| |
-------------------------
|
Application
|
------------------------
| |
mainForm(args) optionsForm(args)
代码中的结构:
Application(new class,initialization,output)
frist.php(inprocessing)
second.php(inprocessing)
MASON技术的网站:
用户登陆首页 用户填写注册信息
| |
-------------------------
|
autohandler
|
------------------------
| |
index.mhtml(args) useradd.mhtml(args)
代码中的结构:
autohandler(new class,initialization,output)
index.mhtml(inprocessing)
useradd.mhtml(inprocessing)
在传统的时候,我们总象老太婆一样重复的编写代码。而在MASON技术的网站中,已经将基本的操作和输出操作交给autohandler(自动处理器)去处理,每个页面代码只是负责具体的逻辑。
amazon.com的技术人员总是很聪明,他们利用巧妙组建技术来保证这个全球著名的电子商务网站得以运行顺利,降低他们的成本。
运行环境
MASON技术是基于Perl语言而设计的。所以你必须拥有一个Perl环境。为了发挥MASON的威力,你最好使用APACHE来作为WEB服务器(在IIS下MASON也是可以运行的)。但是由于APACHE2下的Mod_perl目前还是开发版,所以推荐不要使用APACHE2(在Mason的邮件列表中有人说“没有哪个项目象ModPerl2一样一开发就开发了三年”还有人说“开源技术的测试版就是商业软件的1.0版”),无论如何我们还是使用APACHE1来的保险(正巧的是APACHE2的重要改变在默认的编译情况下是被关闭的,也就是说同APACHE1兼容),当然你如果非的要使用APACHE2也可以,推荐你使用最新的ModPerl RC版本,因为可能你的项目做完以后正式版的modperl2已经出来了。
基本环境:
Perl5.8.x
WEB:APACHE1(with ModPerl1) IIS(with PerlISAPI) APACHE2(with ModPerl2)
MODULE:APACHE::Request、APACHE: BI
SERVER:Linux
结构部署
在我刚刚考虑怎么部署一个网站结构来完成客户的需要的时候,也非常困惑。我总是想着网页是独立的结果无法设计出来程序。后来终于想通了你永远不要想着网页是独立的。网站上的每个页面都是由不同的组建组成的。而象是SESSION处理恐怕你再也不需要封装成为任何对象了,因为他永远只会被在一个代码里调用(如果你希望)。
所以,我建议您将商业网站可以部署成为这个模型:
/home/webstation/ #网站主目录
shared_comp/ #网站共享组建
/home/webstation/frist.com/
comp/ #frist.com的组建,以.comp结尾
mason_data/ #被编译的MASON数据
html/ #普通页面数据,以及.jsp的页面代码
html/autohandler #所有正常访问都被先执行自动处理器
html/dhandler #所有错误访问都被执行dhanlder这个就象GUI程序的catch
/home/webstation/second.com/
comp/ #frist.com的组建,以.comp结尾
mason_data/ #被编译的MASON数据
html/ #普通页面数据,以及.jsp的页面代码
html/autohandler #所有正常访问都被先执行自动处理器
html/dhandler #所有错误访问都被执行dhanlder这个就象GUI程序的catch
我这个模型,把所有网站通用的操作封装成为share_comp里的组建提供共同使用。在两个网站中的comp目录用来存放不需要被用户访问的组建,在mason_data里存放的是编译后的MASON数据稍后我们再讲解这部分。在html目录里存放网页需要的内容,而MASON的代码被赋予.jsp作为结尾,这要感谢SUN公司的宣传,他让不懂计算机的用户们都以为.JSP结尾的程序都很酷。所以无所谓结尾而已:)
效率与安全
恐怕每个项目管理人员都会考虑到效率问题。
MASON的处理
MASON封装了一些非常必要的处理在MASON对象中完成。
redirect
如果您以前使用Location或是HTML的refresh来实现页面跳转的话来尝试一下使用APACHE的内部方法把。这个跳转更可靠而且是使用HTTP协议来完成的,使用方式十分简单$r->;redirect("next.jsp" ;这个时候客户端是不会发现被跳转的,实际内部已经发生了变化。
cache
你当然需要使用CACHE,在MASON当中可以把数组或变量成为cache并且可以设置有效期。
global变量
有时候你可能需要处理一些东西,而这些东西可以被注册到内存中让所有MASON组建共享,这就是全局变量,只要APACHE不变化这个变量同样也永远存在。不同的访问进程可以共享内存空间。
内存处理session
以往我们使用MySQL数据库或是文本系统来处理SESSION,配合global变量我们可以在内存中处理SESSION这样可以大大的减轻对数据库的负担。
持续性的数据库连接或数据库连接池
使用ModPerl的APACHE: BI模块可以轻松实现持续性的数据库连接。另外再配合global变量可以做出读多个连接来迎接大量的访问产生。
深入MASON的运行方式
MASON在执行的时候首先由APACHE交给MASON的模块进行分析编译。之后会把你的组建编译成为ModPerl模块并且存储在MASON DATA目录中,而服务器真正执行的是注册在内存中的MASON MODULES来运行的。这种运行方式很象JSP/Servlet或是PHP/Smarty的配合方式。
非顺序化编译的MASON
与目前大部分的网页处理技术不同。MASON对代码的处理不是顺序性的,不是执行完第一句就执行第二句。这样做您可以灵活的指定在那种情况下执行控制。
<%...%>; #显示变量内容,<% $html_title %>;
%... #简单的一行代码 % print "Hello world\n";
<%perl>;...</%perl>; #一块Perl代码
<&...&>; #调用其他组件,你也可以在程序里调用,还可以返回成string到变量里
<%init>;...</%init>; #初始化部分,在这个组件被访问的时候首先执行而不管被写在什么位置
<%args>;...</%args>; #明确的声明组建接受什么参数
<%filter>;...</%filter>; #过滤输出的HTML
<%once>;...</%once>; #代码被最早执行的,一般use 模块
....还有很多,但是我们恐怕只能讲到这里,否则你会觉得腻烦
一个实例:
<HTML>;
<%args>;
$user =>; ''
</%args>;
<HEAD>;
<TITLE>;<% $title %>;</TITLE>;
</HEAD>;
<BODY>;
<%perl>;
if ($user ne '' ) {
print "$user欢迎您";
} else {
print "你忘记传名字过来了";
}
</%perl>;
</BODY>;
</HTML>;
<%init>;
my $title = 'WELCOME YOU';
</%init>;
假设这个代码名字叫test.jsp我们就要这么访问:
http://localhost/test.jsp?user=masonbook
程序会先执行init部分,然后再检测输入内容,最后顺序的执行其余的HTML部分,还有perl部分。并且在代码结束的时候执行filter(当然这个实例里没有)。
明白的输入与输出
MASON组建接收来自用户端的提交数据(一般不区分是来自GET还是别的方式)都是采用明确表达,否则将产生异常错误。
<%args>;
@class =>; undef
$session =>; 'guest'
<%/args>;
以上代码表示,这个组建接受两个传递来的参数一个是@class一个是$session所以客户端的请求可能是这个样子:
http://localhost/test.jps?session=@sdfkjasdf&class=a&class=b&class=c
如果客户端没有传递必要的数据,就使用=>;右面的值作为默认。这种明确传输方式可以确保组建的安全性,因为接收用户数据不再是随意的了。
MASON的输出都通过filter进行过滤,所以您可以在网站输出内容的时候完全过滤所有内容,比如在URL结尾加上session_id数据,操作很简单,在HTML的根目录上填写autohandler的内容:
<%filter>;
s/href="([^"]+"/add_session_id($1)/eg; #在别的地方再写一个add_session_id子程序就可以了
<%/filter>;
效率的奥秘
当我们谈到效率的问题,可能是一个永远不会有结果的问题。因为这个问题实在太复杂了。实际上程序运行的效率本质上是为了提高生产力。有的时候不能为了提高程序些须的效率来降低生产率,我想每个主管都知道真正的成本在那里。由于MASON采用modperl做为基础,所以基本上也是ModPerl运行的速度。而现在的网络技术ASP/JSP/PHP/ModPerl他们的性能几乎相差不了多少,所以这个时候刻意的追求快那么几秒而忽略其他地方所造成的问题是得不偿失的。
凭大量项目开发人员的经验,真正的性能瓶颈在于数据库的连接部分。我们之间设计过一个几百万条数据的搜索引擎采用的是PHP/Smarty技术来完成的,SQL语法分析以及程序执行大约使用了0.3秒而在数据却消耗了8秒,可见真正的问题应该在这里去解决。
投资风险
人力风险
只要您有可靠的PHP/JSP/Perl程序员就可以顺利掌握MASON技术,请注意MASON技术在编码上与Perl代码几乎一样。但是要注意组建化开发的概念与常见开发模式有很大区别。
版权风险
你使用MASON技术要比使用其他技术安全的多。现在国内已经开始重视知识产权了,请不要再使用盗版的商业系统。MASON是开放源码项目,Perl也是,ModPerl也是,APACHE也是,Linux也是。还等什么呢?
国际案例
你肯定想知道有多少商业案例。那要去www.masonhq.com上去查查吧。
我隐约记得有amazon.com,有SONY的imagestation.com,还有NSAS。大约世界上有一万家左右商业系统采用这个技术。一万家可能不多,可是你要知道其中每天有多少商业交易依靠稳定的MASON来完成。你可知道如果这个技术不稳定Amazon.com的CTO就不会让这个技术在他们公司的亿元交易中使用了。
结束语
很高兴您能消耗这么久的时间来了解MASON技术。我是Perlchina的会员也是一家公司的网站项目主管。Perlchina是一个与国际组织公司有着广泛合作的开源组织,我们致力与在国内推广Perl语言。我们希望使用这种开源技术来降低每个公司的成本。所以Perlchina得到O`reilly公司的允许翻译其公司在网站上的资料,获得美国Apress出版集团的赞助,与台北Perl推广组功能设计Perl下一代语言。
所以我们想要告诉您,以前在中国使用开源技术您的不到支持。从perlchina到来开始,您使用开源技术将获得perlchina的支持。一切的问题我们都为您想到了,都愿意帮助您解决,您还有什么理由不使用MASON呢?放弃JAVA放弃PHP放弃ASP吧。一切帮助都是我们自愿的,所以如果Perl语言能为您带来效益,您不会吝啬掏一些钱赞助我们发展吧?
无论如何,希望这些能帮助到您。以下是一些资源:
Perlchina网站:www.perlchina.org china.pm.org
MASON技术:www.masonhq.com
MASON免费书:www.masonbook.com |
|