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来操作
Mason 简单笔记的更多相关文章
- mybatis-config.xml简单笔记
mybatis-config.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- applicationContext.xml简单笔记
applicationContext.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <bean ...
- Python学习笔记2-flask-sqlalchemy 简单笔记
flask-sqlalchemy 简单笔记 字数 阅读 评论 喜欢 flask-sqlalchemy SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架, ...
- Android_简单笔记一
入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...
- 【Android】Fragment的简单笔记
被虐了,做某公司笔试时,发现自己连个Fragment的生命周期都写不详细.平时敲代码,有开发工具的便利,有网上各大神的文章,就算忘了也很容易的可以查到,但当要自己不借助外界,却发现自己似乎对该知识点并 ...
- Innodb 锁 (简单笔记)
看过很多innodb锁的文章,已经明白的就不写了,简单做个笔记 Innodb 锁的兼容性: 1.意向锁和意向锁之间都是兼容的 2.X(排他锁)与任何锁都是不兼容的 3.排他意向锁 IX 于S锁是不 ...
- 使用Git简单笔记
这里只是作为简单的笔记整理,第一次使用的推荐先看一下廖大的教程,内容很多很细,可以边看边练.看不懂的地方先记着.争取七七八八看下来. ================================= ...
- awk命令分析日志的简单笔记
awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...
- kindle paperwhite 简单笔记按名称分类
已更新python,见新博客 http://www.hrwhisper.me/archives/708 写作背景: 南京决赛比赛完那天晚上写的. 使用方法: 将My Clippings.txt 放在 ...
随机推荐
- android登录界面
在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图: 这个Demo除了按钮.小猫和Logo是图片素材之外,其余的UI都是通过代码实现的. 一.背景 背景蓝色渐变,是通过一个xml文件来设置 ...
- Util
Util最新代码更新说明 离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考. 重要 ...
- Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)
首先,在xml其中新增部分标有下划线的文件,容器初始化的时候需要扫描包 注意: a. 包款扫描(下划线部分)一定要加,默认是不扫描整个包.与每一包之间','开.如过具有同样的父包,那么我们能够 ...
- Linux下Nagios
Linux下Nagios的安装与配置 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机 ...
- Android - JNI加入标准C++文件
JNI加入标准C++文件 本文地址: http://blog.csdn.net/caroline_wendy 其余參考: http://blog.csdn.net/caroline_wendy/art ...
- java中IO写文件工具类
以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...
- KnockOut绑定
KnockOut绑定之Click绑定 Click绑定对DOM元素添加一个函数,当DOM元素被点击的时候调用.在button,input 或者a标签中常用,但其实他适用于任何可见的DOM元素. exam ...
- Linux httpd 跳转简单方法一
直接在httpd.conf中添加以下代码即可: NameVirtualHost *:80 <VirtualHost *:80> ServerName localhost ##访问域名 Re ...
- 安卓CTS官方文档之兼容性方案概览
兼容性方案概览 安卓的兼容性方案让安卓手机生产商能够很容易就开发中可兼容的安卓设备(天地会珠海分舵注:可兼容什么呢?就是可以兼容标准google提供的安卓系统可以支持的功能,以防手机生产商把开源的安卓 ...
- javascript 控制台输出 图片 console.log 真强大 真佩服你们的创造力
无意中,在百度知道页面发现了这货.居然能输出图片到控制台. 完全颠覆自己的三观,果断查阅其输出方法.后得知,原来如此. 曾经做过的项目中,同事把控制台做成一个网页形式方便远程控制和远程调用.没想到过这 ...