SSM サンプルファイル - CGI

書き方のルール

  1. テンプレートファイルに「.html」「.htm」「.HTML」「.HTM」以外の拡張子を付けると、それらはSSMに"CGI"とみなされる。
    CGIとHTMLの差は、自動でコンテントタイプヘッダ
    Content-type: text/html(改行)(改行)
    を送るか否かで、それ以外の違いはない。HTMLの場合は、自動で上記ヘッダが送られる。

    CGIの場合は、テンプレート中に指定する関数で、ヘッダを出力しなければならない。

    例)

    HTMLコード

    HTMLテンプレート(filename.cgi)の中身は、以下の様に書ける。

    <SSM FUNCTION="check_ip" MODE="begin">
    <SSM MODE="end">

    <HTML>
    <HEAD>
    <TITLE>SSM サンプルファイル - CGI</TITLE>
    </HEAD>
    <BODY BGCOLOR="#FFFFFF">
    <H1>SSM サンプルファイル - CGI</H1>

    <H2>書き方のルール</H2>
    (以下省略)

    関数定義

    スクリプトファイル側(filename.pl)には以下のように関数を定義しておく。

    sub check_ip($$$){
        local (%main::SIG);
        $SIG{'TERM'} = $SIG{'CHLD'} = $SIG{'KILL'} = $SIG{'INT'} = \&signalhandler;

        my ($ssmstr, $queryref, $paramref) = @_;
        if ($main::ENV{'REMOTE_ADDR'} =~ /^10\.0\./){
            print "Content-type: text/html; charset=EUC_JP\n\n";
        } else {
            print "Location: http://somehost.mydomain.com/error.html\n\n";
        }
    }

    表示

    REMOTE_ADDR 環境変数の値が "10.0." で始まればページのコンテンツを表示し、そうでなければ別のロケーション( http://somehost.mydomain.com/error.html )に移動する。


送信されたクエリーをチェックし、表示するページを変更する例

フォームから入力された値をチェックし、決められた形式でなかった場合、エラーメッセージとともにフォームページを返す。

送信元フォーム側の書き方

送信元フォームでは、表示実行時に、エラーメッセージがセットされていたらそれを表示する処理を行う。

HTMLコード(送信元フォーム側)

<FONT COLOR="#CC0000">
<SSM FUNCTION="check_value" MODE="begin">%_errormsg_%<SSM MODE="end">
</FONT>

<FORM ACTION="sample_cgi_exe.cgi" METHOD="get">
数字を入力してください:<INPUT TYPE="text" NAME="string" VALUE=""><BR>
<INPUT TYPE="submit" VALUE="色々な値を入力してチェック">
</FORM>

関数定義(送信元フォーム側)

sub check_value($$$){
    local (%main::SIG);
    $SIG{'TERM'} = $SIG{'CHLD'} = $SIG{'KILL'} = $SIG{'INT'} = \&signalhandler;

    my ($ssmstr, $queryref, $paramref) = @_;
    if ($$queryref->Vars->{'errormsg'}){
        $ssmstr =~ s/%_errormsg_%/$$queryref->Vars->{'errormsg'}/eg;
        print $ssmstr;
    }
    return 1;
}

送信先CGIの書き方

送信先CGIでは、送信された値が条件に合っていれば送信先ページを表示(ヘッダを送信)、条件に合わなければ、エラーメッセージを添えてもとのフォームページを表示する処理を行う。

HTMLコード(送信先CGI側)

<SSM FUNCTION="check_input" MODE="begin"><SSM MODE="end">
<HTML>
<HEAD>
<TITLE>SSM サンプルファイル - CGI - 入力値の確認</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<H1>SSM サンプルファイル - CGI - 入力値の確認</H1>

<P>
送信された値は

<SSM ACTION="once" FUNCTION="Ssm::Common::printvalue" MODE="begin">
<BLOCKQUOTE>%_string_%</BLOCKQUOTE>
<SSM MODE="end">


です。
</P>
(以下省略)

関数定義(送信先CGI側)

sub check_input($$$){
    my ($ssmstr, $queryref, $paramref) = @_;
    unless ($$queryref->Vars->{'string'} =~ /^\d+$/){
        #エラーを示す値をクエリーにセット
        $$queryref->Vars->{'errormsg'} = '入力値 ['.$$queryref->Vars->{'string'}.']:数字を入力してください。';

        #元のページに戻る
        &Ssm::Common::go_and_exit('sample_cgi.html', $queryref);
    } else {
        #エラーが無い場合は、ページの表示を行う
        print "Content-type: text/html; charset=$main::charset\n\n";
    }        
}

表示

%_errormsg_%
数字を入力してください:

(このページが再度表示されたら、ここまでスクロールして下さい。)

SSM サンプルファイル - CGI $Revision: 1.3 $