Mason 简单笔记
 Mason的对象 
 
 -------------------------------
 
 
 
 
 Request对象
 
 
 Mason有两个全局预处理对象叫做:$r和$m
 
 
 $r是mod_perl的请求对象,它提供了Perl的API来执行Apache的请求。
 
 
 
 
 $r->;uri                #获得用户请求的地址
 
 
 $r->;content_type        #获得或设置头信息
 
 
 
 
 Component组件调用方法
 
 
 从一个组件调用另外一个组件使用<& &>;标记
 
 
 
 
     <& 组件地址名称, [参数=>;数值, ...] &>;
 
 
 
 
 组件地址名称:
 
 
   组件的地址用'/'开始,这个地址将从在httpd.conf中设置的组件根目录开始。
 
 
 
 
 参数=>;数值:
 
 
   组件所需要的参数和变量,可以同时有多个,通过逗号分割.
 
 
 
 
 高级组件
 
 
   无论如何,Mason都将首先执行高级组件
 
 
 dhandlers  当用户请求一个不存在的地址,Mason将自动启动地址目录中的dhanlder组件,如果不存在dhanlder将请求组件根目录中的dhandler。
 
 
 
 
 autohandlers:
 
 
 当用户请求一个文件的时候,系统将首先查找所指定的目录中的autohandler如果不存在会查找组件根目录中的autohandler,并且执行。
 
 
 如果用户请求/subject/test.mhtml,mason将首先去查找/subject/autohandler如果不存在就查找/autohandler
 
 
 
 
 一个组件被请求后的表面上看来执行次序为:
 
 
 1.首先查找是否存在,不存在执行dhanlder
 
 
 2.查找autohandler并且执行
 
 
 3.执行这个组件的<%once>;<%/once>;
 
 
 4.执行这个组件的<%args>;</%args>;
 
 
 5.执行这个组件的<%init>;</%init>;
 
 
 6.执行<%perl>;</%perl>; % lines
 
 

 
 
 -------------------------------
 
 
 Mason中对GET/POST的处理
 
 
 -------------------------------
 
 
 在Mason当中对Get/Post的处理与组件调用是相同的。所有的组件调用都可以使用HTML方式来处理。
 
 
 比如组件代码:
 
 
 <%args>;
 
 
 $action
 
 
 </%args>;
 
 
 在WEB的调用方式为http://localhost/test.mhtml?action=value
 
 
 在其他组件中的调用方式为<& test.mhtml,action=>;'values' &>;
 
 
 
 
 如果处理多个数值
 
 
 在WEB的调用方式为: /my/URL?colors=red&colors=blue&colors=green
 
 
 在其他组件中调用方式为: <& /my/comp, colors =>; ['red', 'blue', 'green'] &>;
 
 
 你需要在这个被调用的组件中声明
 
 
     $colors, 将返回 $colors 格式数组 ['red', 'blue', 'green']
 
 
     @colors, 将返回 @colors 格式数组l ('red', 'blue', 'green')
 
 
 
 
 当然你也可以在<%init>;中通过@_获得传递来的数据。
 
 
 
 
 如果以上都不符合你的习惯,那你就直接使用$ARGS吧,所有调用都在这个变量中。
 
 
 比如请求的是action=value  那么他将放在$action=$ARGS{'action'}中
 
 
 如果请求的是color=red&color=blue 那么他将放在@array=$ARGS{'color'}中
 
 
 
 
 ----------------------------------
 
 
 Mason应用举例
 
 
 ----------------------------------
 
 
 % lines方法的举例
 
 
 o 条件判断代码
 
 
 
 
 % my $ua = $r->;header_in('User-Agent');
 
 
 % if ($ua =~ /msie/i) {
 
 
 IE用户,欢迎使用
 
 
 ...
 
 
 % } elsif ($ua =~ /mozilla/i) {
 
 
 Netscape用户,欢迎使用
 
 
 ...
 
 
 % }
 
 
 
 
 o 以HTML格式化输出的数组
 
 
 
 
 <ul>;
 
 
 % foreach $item (@list) {
 
 
 <li>;<% $item %>;
 
 
 % }
 
 
 </ul>;
 
 
 
 
 o 以HTML格式化输出的HASH数组
 
 
 
 
 <ul>;
 
 
 % while (my ($key,$value) = each(%ENV)) {
 
 
 <li>;
 
 
 <b>;<% $key %>;</b>;: <% $value %>;
 
 
 % }
 
 
 </ul>;
 
 
 
 
 o 以HTML表格格式化输出的HASH数组
 
 
 
 
     <table>;
 
 
     % foreach my $h (@loh) {
 
 
     <tr>;
 
 
     <td>;<% $h->;{foo} %>;</td>;
 
 
     <td bgcolor=#ee0000>;<% $h->;{bar} %>;</td>;
 
 
     <td>;<% $h->;{baz} %>;</td>;
 
 
     </tr>;
 
 
     % }
 
 
     </table>;
 
 
 
 
 ----------------------------------
 
 
 Mason的初始化<%init>;</%init>;和清除<%cleanup>;</%cleanup>;的作用
 
 
 ----------------------------------
 
 
 <%init>;</%init>;标记中内容是整个组件被调用首要执行的。
 
 
 它很适合用来执行一些需要初始化的工作,比如数据库连接。
 
 
 <%cleanup>;</%cleanup>;标记适合用来作关闭工作,他可以帮你关闭掉被你忘记的数据库连接和文件句柄。
 
 
 
 
 ----------------------------------
 
 
 Mason的组件嵌入组件
 
 
 ----------------------------------
 
 
 Mason支持在一个组件中包含一个子的组件
 
 
 使用<%def 名称>;</%def>;来创建一个子组件,调用方法同其他组件相同。
 
 
 比如:
 
 
 <HTML>;
 
 
 <& .echo,title=>;'embed Comp' &>;
 
 
 </HTML>;
 
 
 
 
 <%def .echo>;
 
 
         <%args>;
 
 
         $title
 
 
         </%args>;
 
 
         <font size=1>;<% $title %>;</font>;
 
 
 </%def>;
 
 
 
 
 ----------------------------------
 
 
 Mason的过滤输出<%filter>;</%filter>;
 
 
 ----------------------------------
 
 
 Mason在向WEB打印HTML之可以对数据进行过滤输出。比如将所有输出的内容转换成为小写字母。
 
 
 比如将组件中输出的所有123过滤成为abc
 
 
 <%filter>;
 
 
 s{123} {abc}i;
 
 
 </%filter>;
 
 
 注意:过滤输出不仅仅过滤程序内容,也过滤HTML内容。
 
 
 
 
 ----------------------------------
 
 
 Mason的说明文档
 
 
 ----------------------------------
 
 
 如果一个组件的功能需要说明,可以直接写进说明文档组件
 
 
 <%doc>;
 
 
 </%doc>;
 
 
 这个标记的内容不会被打印到HTML中。
 
 
 
 
 
 
 ----------------------------------
 
 
 Mason的数据缓存
 
 
 ----------------------------------
 
 
 Mason允许在组件中进行数据缓存操作。这个功能需要Perl的cache::cache模块的支持。
 
 
 下面为一个计算累加的缓存,第二次执行将不重新计算
 
 
 my $result = $m->;cache->;get('calc');
 
 
 if (!defined($result)) {
 
 
     $result=0;
 
 
     for (my $i=0;$i<=1000000;$i++) {
 
 
             $result++;
 
 
     }
 
 
     $m->;cache->;set('calc', $result);
 
 
 }
 
 
 print $result;
 
 
 
 
 你还可以设置其他的缓存
 
 
 $m->;cache->;set(name =>; $string);
 
 
 $m->;cache->;set(friends =>; \@list);
 
 
 $m->;cache->;set(map =>; \%hash);
 
 
 
 
 设置缓存Cache的有效期,下面这个举例要求在10秒更新一次cache
 
 
 my $result = $m->;cache->;get('calc');
 
 
 if (!defined($result)) {
 
 
     $result=localtime(time);
 
 
     $m->;cache->;set('calc', $result,'10 sec');
 
 
 }
 
 
 print $result;
 
 
 
 
 设置缓存的繁忙时,下面的这个举例设置锁定30秒
 
 
 my $result = $m->;cache->;get('key', busy_lock=>;'30 sec');
 
 
 
 
 ----------------------------------
 
 
 Mason的网页特定功能
 
 
 ----------------------------------
 
 
 发送HTML头信息
 
 
     my $cookie = $m->;comp('/shared/get_user_cookie');
 
 
     if (!$cookie) {
 
 
         $cookie = new CGI::Cookie (...);
 
 
         $r->;header_out('Set-cookie' =>; $cookie);
 
 
     }
 
 
 
 
 外部重定向
 
 
 $m->;redirect($url);    #
 
 
 网站内部重定向
 
 
 $r->;internal_redirect($url);
 
 
 $m->;auto_send_headers(0);
 
 
 $m->;clear_buffer;
 
 
 $m->;abort;
 
 
 
 
 使用autohandler创建统一标识
 
 
 HTML页头信息
 
 
 % $m->;call_next;
 
 
 HTML页脚信息
 
 
 
 
 获得自己
 
 
 my $self = $m->;request_comp;
 
 
 
 
 对于COOKIE的操作
 
 
 最好请使用Apache::Cookie来操作cookie
 
 
 
 
 对于传上来的文件使用Apache::Request来操作 
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号