09. カウンタ

トップどんと来い! ASP.NET > 09. カウンタ

アルゴリズムの作成(もどき)

さて、これまでに8回の「どんと来い」を書いてきましたが、もうそろそろ講座を離れて、単発で技をご紹介していこう と思います。
今回は、最も導入率が高いと思われる「アクセスカウンタ」を自作してみましょう。

ASP.NET で作られたカウンタというのは CGI のように画像を呼び出すのではなく、トップページの一部として記述できます。
今回はそのトップページの一部のカウンタの部分だけを実装します。

そしてすばらしいことに、このカウンタは Web アプリケーションの知識をほとんど必要としません。まるで Windows アプリケーションにおけるコーディングと同じ感覚でプログラミングできます。それが ASP.NET における最大の利点であるといえます。

しかし、実際にカウンタを作る前にプログラムを組む流れをつかむために「もどき」を作ろうと思います。ボタンを押したらアクセス表示がただ増えるだけのも のです。
実際のカウンタは外部ファイルにデータを保存しますが、ここではブラウザで表示されてからのものを実装します。

といっても簡単なので、早速ソースをどうぞ。
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
if (IsPostBack)
{
// Label1.Text を int に変換して代入
int i = int.Parse(Label1.Text);
// 1たす
i++;
// 文字列に変換して表示
Label1.Text = i.ToString();
}
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:Label id="Label1" runat="server">0</asp:Label>
<asp:Button id="Button1" runat="server" Text="Click"></asp:Button>
<!-- コンテンツをここに配置してください。 -->
</form>
</body>
</html>
ソースを見る限り、これまでに学んできた知識よりも Windows アプリケーションにおける知識の方が重要であるといえます。
.NET 構想では同じクラスライブラリを Windows/Web 両アプリケーションでともに利用できるのが、先ほど述べたような利点です。

たった3行しかないので、すべての行にコメントがあるにもかかわらず、順を追って解説しましょう。

まず、ビジュアル部品の「Label1」を見ると、値が0になっています。これを覚えておいてください。
で、コード部分を見ると「if (IsPostBack)」がありますから、2回目以降の処理になります。

int.Parse(string型) は string を int に変換しますので、i には0が入ります。
次にインクリメントで「i == 1」になります。最後に i.ToString() で string に変換してから表示します。

とても簡単でした。別に注意することもありません。

コーディング

code を書くことを「コーディング」といいます。今度は本物のカウンタをコーディングします。と、いってもまずコードを見たほうが早いので、解説は後回しにしま す。
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
// StreamReader の準備
StreamReader sr = new StreamReader(Server.MapPath(".") + "\\count.txt");
// 読み出し
string count = sr.ReadToEnd();
// StreamReader の Close
sr.Close();
// と表示
Label1.Text = "あなたは" + count + "番目のお客様です";
// カウンタ数の int 変換
int i = int.Parse(count);
// 1たす
i++;
// StreamWriter 準備
StreamWriter sw = new StreamWriter(Server.MapPath(".") + "\\count.txt");
// 文字列に変換して書き込み
sw.Write(i.ToString());
// StreamWriter の Close
sw.Close();
}
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:Label id="Label1" runat="server">Label</asp:Label>
<!-- コンテンツをここに配置してください。 -->
</form>
</body>
</html>
これまたすべての行にコメントがついていますので、別に解説もいらないかと思いますが、一応しておきましょう。

まず、カウンタの原理としては必ず ASP.NET ファイル外にカウンタ数を保存しておく記憶媒体が必要です。いわばデータベースということになりますが、ここではただ数を記憶しておくだけ ですので、SQL などは必要ありません。ここでは簡単に「テキストファイル」を記憶媒体とします。

テキストファイルはテキストデータですから、簡単に「StreamReader/StreamWriter」で扱うことができます。前者は 読み取り、後者 は書き込みです。この両オブジェクトは Windows アプリケーションでも利用できます。名前空間「System.IO」に宣言されているため、 2行目で import しているのがわかります。

StreamReader コンストラクタの引数には開くファイルのパスを指定します。そのため、自分のディレクトリを示す「Server.MapPath(".")」 と、「"\\ count.txt"」を組み合わせてファイル名を指定します。count.txt というファイルはあらかじめ「0」と書き込んで用意しておく必要があります

StreamReader.ReadToEnd() は、ストリームの内容を端から端まで読み取りますから count には結局ファイルに刻まれたカウント数が表示されます。その後、ストリームを Close() しています。

Label1.Text に割り当てて表示しているのがその次の行です。この行以降は次の呼び出しのための処理です。

現在 count は string 型になっていますから、これを int.Parse() で int に変換し、i を足しています。
その次に StreamWriter を利用して書き込む準備をします。ここでも同じファイルパスを必要としますから、あらかじめファイルパスを変数に代入しておいても効率がいいかもしれませ ん。

後は、実際に書き込み、Close しているだけですが、書き込まれる値は +1 されているため、次呼び出された時はそのまま表示します。
このプログラムでは始めて呼び出された時は 0 ですから、「表示して足す」というこのプログラムの順序ではなく、「足して表示する」という順番なら始めて呼び出された時も 1 にすることができます。