zoukankan      html  css  js  c++  java
  • 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来操作

  • 相关阅读:
    Neo4j
    linux系统中如何建立与删除软连接(方便快捷使用,大量节约时间)
    eclipse/myeclipse 中,如何删除已经下载过的插件(举例:删除scala ide)
    dayday up
    元类
    sort和sorted
    反射
    继承派生
    property
    python3.5和3.6区别
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3225896.html
Copyright © 2011-2022 走看看