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來操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章