06. Page クラス

トップどんと来い! ASP.NET > 06. Page クラス

Page クラス

ASP.NET ファイルの1行目には
<%@ Page Language="C#" %>
こう記述してきました。その中の「Page」というのが以外にも重要で、Page クラスを 意味します。この中にさまざまなメンバが実装されています。

この Page クラスは[ .aspx ]、すなわち ASP.NET ページと関連付けられ、オブジェクト指向を意識せずに利用することができます。
たとえば IsPostBack というプロパティを利用しましたが、これは単体で [ !IsPostBack ] として利用することができました。

しかし、これは Windows アプリケーションにおける Form クラスと似ていま す。Form.Text プロパティは
this.Text = "TRICK";
などとアクセスしますが、別に this が無くても
Text = "TRICK";
だけでもアクセスできました。スコープ演算子(.)を使うとオブジェクト指向のように感じるかどうかは人によりますが、このようにアクセスできるのは Form のメンバだけです。

同じように Page クラスに属するメンバは Web アプリケーションとしてサーバから呼び出された ASP.NET ファイルをあらわし、そこに定義されたメンバは ASP.NET ページに関するメンバです。

これからは少し、Page クラスを意識して始めの1行を書いてください。

Request

http://xxxxx/yyyyy.aspx?test=dokugaku
のように、ファイル名の後に「?」をつけて呼び出されたアドレスを見たことがあるでしょうか?

この「?」の後の部分は、Request プロパティで取得したオブジェクト HttpRequestプロパティ QueryString を利用して取得します。
Page.Request プロパティはHttpRequest オブジェクトを取得しますが、このオブジェクトは
「Web 要求中にクライアントから送信された HTTP 値を ASP.NET で読み取ることができるようにします。」
と SDK ドキュメントに書いてあります。

http値とは、ホームページにアクセスするときに「http://」を始めに記述するように、この「http://」から始まる値のこと です。
この値はそのまま読み取られるのではなく、HttpRequest オブジェクトを介して読 み取られます。

その中でも「クエリ」と呼ばれるものが先ほど言った「?」の後の値です。QueryString が理解できましたか?
このプロパティは次のように利用します。
<%@ Page Language="C#" %>
<script runat="server">

void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
TextBox1.Text = Request.QueryString["test"];
}
}

</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
</form>
</body>
</html>
この ASP.NET アプリをこの項目の始めに記したように
http://xxxxx/yyyyy.aspx?test=dokugaku
と呼び出すと、「dokugaku」が TextBox1.Text に設定され、
http://xxxxx/yyyyy.aspx?test=TRICK
と呼び出すと、「TRICK」が TextBox1.Text に設定されます。

また、SDK ドキュメントにあったサンプルを改造し、コメントをつけてみました。
void Page_Load(object sender, EventArgs e) {
// 始めのループ用の変数と次のループ用の変数
int loop1, loop2;

// QueryString を受け取る型の変数用意
NameValueCollection coll=Request.QueryString;
// 文字列型へすべてのキーを割り当てる
String[] arr1 = coll.AllKeys;
// キーの数だけループ
for (loop1 = 0; loop1 < arr1.Length; loop1++)
{
// まずキーを書こう!!
Response.Write("キー: " + Server.HtmlEncode(arr1[loop1]) + "<br>");
// 文字列型へひとつずつ値を割り当てる
String[] arr2 = coll.GetValues(arr1[loop1]);
// 今度は値の数だけループ
for (loop2 = 0; loop2 < arr2.Length; loop2++)
{
// 今度は値を書こう!!
Response.Write("値 " + loop2 + ": " + Server.HtmlEncode(arr2[loop2]) + "<br>");
}
}
}
これも呼び出す際は「?」をつけます。しかも、何個もつけると面白いですよ。

Response

上のサンプルで
Response.Write()
というのが見えます。

これもまた、Page.Response プロパティで取得した HttpResponse オブジェクトの Write() メソッドです。
HttpResponse オブジェクトは ASP.NET 操作からの HTTP 応答情報をカプセル化します。

応答情報というのは、クッキーなどの特にクライアントとサーバをつなぐ情報のことを言います。
Response.Write()
というのは、コンソールアプリケーションにおける、
Console.Write()
と似ています。

write という意味から単に「書く」と考えるのではなく、ユーザとの応答すなわち「Input/Output」と考えればコンソール画面に対して out (出力) していると考えられます。
ちなみに、.NET において「IO」と書くと「Input/Output」のことですが、この場合はファイルのことを言いますので間違えないようにしてください。

いずれにしても、HttpRespones オブジェクトは応答情報を扱っていることを確認しましょう。
ここではそのメンバのうち2つのプロパティをご紹介します。(メソッド「Write()」はもう終わり)

1. Charset プロパティ
キャラセット。別に登場人物のリストとかではなく、char すなわち文字の type を示します。
ホームページを適当に右クリックして、ソースを表示するとほとんど
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
というのが見受けられます。この右に charset とあります。この右側の value すなわち値を取得します。
// (1)
if (Response.Charset == "utf-8")
{
// ...
}
// -----------------------
// (2)
Response.Write(Response.Charset);
(1) 文字コードが[ UTF-8 ]の際だけ動くプログラムコードはこのようになります。
(2) 文字コードを出力(表示)します。ASP.NET の場合の多くは UTF-8 を利用しますから、通常はその値が表示されます。

2. Cookie プロパティ
// HttpCookie オブジェクトの準備(Name は "LastVisit")
HttpCookie MyCookie = new HttpCookie("LastVisit");
// クッキーとは関係ない DateTime オブジェクトの準備(now は現在時間あり)
DateTime now = DateTime.Now;

// Value はクッキーの値、Expires は破棄時間
MyCookie.Value = now.ToString();
MyCookie.Expires = now.AddHours(1);

// 最後にクッキーを登録して終わり
Response.Cookies.Add(MyCookie);
Cookie プロパティにはお菓子のクッキーではないほうのクッキーがコレクションとして(いわば配列)入っています。
ここではそのコレクションに "LastVisit" すなわち最後の訪問時間を記しています。

さらにここでは HeepCookie コンストラクタを利用し、新しい名前、それが 「LastVisit」なわけですが、これを利用していることに注意してください。
HttpCookie 型である「MyCookie」オブジェクトのメンバ2つに時間関連を割り当てています。
HeepCookie.Value
各 cookie の値を取得または設定します。
HttpCookie.Expires cookie の有効期限の日時を取得または設定します。
クッキーの値は現在の時間、クッキーが食べられてしまう(破棄するの意)のは現在+1時間後 という形で設定し、最後にコレクションに追加しています。

ちなみに
Response.Write("Cookie: " + MyCookie.Name);
こうやったりするとクッキーの名前が表示されますから確認してみるといいでしょう。

おまけの説明抜きで、SDK ドキュメントにあったサンプルを書いて終わりにします。
/*
 * すべてのクッキーとその値を詳細に表示するプログラム
 * (SDK ドキュメント内のサンプルにコメントを付加)
 */
 <%@ Page Language="C#" %>
 <script runat="server">
     void Button1_Click(object sender, EventArgs e) {
         // ループ用
         int loop1, loop2;
         // クッキーコレクション
         HttpCookieCollection MyCookieColl;
         // クッキー
         HttpCookie MyCookie;
         
         // コレクションにクッキーを割り当て
         MyCookieColl = Request.Cookies;
         
         // 文字列配列にすべてのクッキーの名前を割り当て
         String[] arr1 = MyCookieColl.AllKeys;
         
         // クッキーの名前で個々のクッキーを取得
         // 個々のクッキーはループでゲット!!
         for (loop1 = 0; loop1 < arr1.Length; loop1++)
         {
             // クッキー型の変数に個々のクッキー代入
             MyCookie = MyCookieColl[arr1[loop1]];

             // 個々のクッキーの名前・期限・安全かどうかを書け!!
             Response.Write("Cookie: " + MyCookie.Name + "<br>");
             Response.Write("Expires: " + MyCookie.Expires + "<br>");
             Response.Write ("Secure:" + MyCookie.Secure + "<br>");
       
             // 1つのクッキーのすべての値を配列に割り当て
             String[] arr2 = MyCookie.Values.AllKeys;

             // クッキーの値のコレクション数だけループし、値を表示!!
             for (loop2 = 0; loop2 < arr2.Length; loop2++)
             {
                 // 1つのクッキーの中のそれぞれの値を書け!!
                 // 「1つのクッキー」が"オブジェクト"なら「それぞれの値」は"メンバ"にあたる
                 Response.Write("Value" + loop2 + ": " + arr2[loop2] + "<br>");
             }
         }
    }
((注意))
// Grab individual cookie objects by cookie name.

// クッキー名によって個々のクッキーオブジェクトを略奪しなさい