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来操作

Mason 简单笔记的更多相关文章

  1. mybatis-config.xml简单笔记

    mybatis-config.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  2. applicationContext.xml简单笔记

    applicationContext.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <bean ...

  3. Python学习笔记2-flask-sqlalchemy 简单笔记

    flask-sqlalchemy 简单笔记 字数 阅读 评论 喜欢 flask-sqlalchemy SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架, ...

  4. Android_简单笔记一

    入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...

  5. 【Android】Fragment的简单笔记

    被虐了,做某公司笔试时,发现自己连个Fragment的生命周期都写不详细.平时敲代码,有开发工具的便利,有网上各大神的文章,就算忘了也很容易的可以查到,但当要自己不借助外界,却发现自己似乎对该知识点并 ...

  6. Innodb 锁 (简单笔记)

    看过很多innodb锁的文章,已经明白的就不写了,简单做个笔记   Innodb 锁的兼容性: 1.意向锁和意向锁之间都是兼容的 2.X(排他锁)与任何锁都是不兼容的 3.排他意向锁 IX 于S锁是不 ...

  7. 使用Git简单笔记

    这里只是作为简单的笔记整理,第一次使用的推荐先看一下廖大的教程,内容很多很细,可以边看边练.看不懂的地方先记着.争取七七八八看下来. ================================= ...

  8. awk命令分析日志的简单笔记

    awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...

  9. kindle paperwhite 简单笔记按名称分类

    已更新python,见新博客  http://www.hrwhisper.me/archives/708 写作背景: 南京决赛比赛完那天晚上写的. 使用方法: 将My Clippings.txt 放在 ...

随机推荐

  1. Access Toke调用受保护的API

    ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API 在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端 ...

  2. 连载:面向对象的葵花宝典:思维、技能与实践(40) - DECORATOR模式

    掌握了道路后,设计模式,我们将以新的方式来理解设计模式,这种方法更简单.更直观.不信?子就知道了 =================================================== ...

  3. 用css2属性clip实现网页进度条

    前言 看了网上一些关于网页进度条样式的资料,有很多方式实现,针对其展现形式,有用图片的,有用css2属性clip,有用flash的,本人就学会了一种,下面就简单来介绍一下. css2的属性clip 如 ...

  4. 【Espruino】NO.15 nRF24L01+无线收发器

    http://blog.csdn.net/qwert1213131/article/details/35853747 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espru ...

  5. 针对不同手机系统的LBS地图定位解决方案

    原文:针对不同手机系统的LBS地图定位解决方案 摘要: 针对目前的三种手机系统:Android安卓.S60塞班.IOS苹果,做出的三种不同的手机地图应用解决方案. 查阅了多数地图API对手机的支持情况 ...

  6. 基础总结篇之五:BroadcastReceiver应用具体解释

    問渠那得清如許?為有源頭活水來.南宋.朱熹<觀書有感> 据说程序猿是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断地学习新知识,不断地为自己注入新奇的血液,才干使自己跟上技术的步 ...

  7. OWIN– 解耦,协作和开放

    OWIN的理解和实践(一) – 解耦,协作和开放 概述 OWIN的全称是Open Web Interface For .Net, 是MS在VS2013期间引入的全新的概念, 网上已经有不少的关于它的信 ...

  8. NodeJS,我对“高、高、非”的一些看法

    ·众所周知 NodeJS三大神器"事件驱动,V8,回调函数". ·事件驱动,故名思议:等快递和收快递区别.NodeJS将原先大牛们掌握的神神秘秘的EPOLL走向大众化,这点是最大的 ...

  9. 合并多段zip文件并解压缩

    cat xxx.zip.*** >xxx.zip unzip xxx.zip

  10. Coreseek/sphinx全文检索的了解

    Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...