第4回 ASP.NETページのフレームワーク(前編)― コードビハインドとPageクラス ―:連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (3/3 ページ)
ASP.NETページの実体はPageクラスのオブジェクトである。ASP.NETを理解するには、このクラスのプロパティとメソッドを習得するのが早道。
■PageクラスのResponseプロパティ
ページにサーバ・コントロールをレイアウトして、アウトプットをデザインするのがASP.NETの基本的なプログラミング・スタイルだが、ASPやCGIのようにビジュアル要素を含めて動的にアウトプットを生成することも可能だ。このために利用するのが、HttpResponse型オブジェクトであるResponseプロパティである。
主に情報の取得が目的でアクセスされるため、プロパティへのアクセスがメインだったRequestオブジェクトとは異なり、Responseオブジェクトでは、メソッドの呼び出しがメインとなる。中でも最も利用頻度が高いと思われるメソッドがWriteメソッドである。Writeメソッドを呼び出すと、引数に指定した文字列がそのまま出力ストリームへ出力される。CGIスクリプトのように、すべてをWriteメソッドで出力するのは無駄な努力でしかないが、ちょっとしたデバッグ・メッセージを出力するためにサーバ・コントロールを用意するのも手間がかかる。こんなときにはWriteメソッドを使うといい。
このほかには、クッキーの設定やHTML以外のデータ生成などにResponseプロパティが使われる。クッキーとはご存じのとおり、サーバからの指示に応じてクライアントサイドに保存される、小さなデータのことである。これをASP.NETページで生成するには、リスト4.7に示すように、Response.Cookiesコレクションを利用する。クッキーを生成するには、System.Web.HttpCookieオブジェクトを作成し、これをResponse.Cookies.Addメソッドでコレクションへ追加する。こうすると、レスポンス・ヘッダにクッキーが追加され、クライアントへと送信される。
<%@ PAGE LANGUAGE="C#" %>
<html>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
t1.Text = Request.Cookies["LastVisit"].Value;
HttpCookie cookie = new HttpCookie("LastVisit", DateTime.Now.ToString());
cookie.Domain = Request.ServerVariables["SERVER_NAME"];
Response.Cookies.Add(cookie);
}
</script>
<body>
<form runat="server">
<asp:TextBox id="t1" runat="server" />
<asp:Button Text="Submit" runat="server" />
</form>
</body>
</html>
一般的にASP.NETページでは、MIMEタイプが「text/html」で表されるHTMLデータが生成されるが、リスト4.8に示すように任意のMIMEタイプを指定して、JPEG画像のようなバイナリデータを生成することもできる。
このためには、Response.ContentTypeプロパティに出力したいデータに対応するMIMEタイプを設定する。次にResponse.Clearメソッドを呼び出して、そこまでに出力ストリームに出力されてしまったデータ(この例では”<html>”)をバッファから取り除く。そして、Response.WriteFileメソッドやResponse.BinaryWriteメソッドを使って、任意のデータを出力すればよい。この例では、あらかじめファイルとして用意されていた画像を出力しているだけだが、プログラム・コードで動的に生成した画像を出力することも可能だ。
<%@ PAGE LANGUAGE="C#" %>
<%@ Import Namespace="System.IO" %>
<html>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
string filename = MapPath("fdotnet_top.gif");
if (File.Exists(filename)) {
Response.Clear();
Response.ContentType = "image/gif";
Response.WriteFile(filename);
Response.End();
}
}
</script>
<body>
<p>ファイルが見つかりません</p>
</body>
</html>
ただし、ASP.NETページに含まれるインライン画像を動的に生成するだけならば、このような手段をとる必要はない。ASP.NETページでは、1つのaspxファイルの中で、Webページを生成しながら、なおかつそこに含まれるインライン画像を生成することもできるからだ。その方法については、次回以降解説する。
HttpResponseクラスの主要なプロパティとメソッドには次のようものがある。
プロパティ | 型 | 機能 |
---|---|---|
BufferOutput | bool | trueを設定すると、出力がバッファリングされてからクライアントへ送信される(デフォルトはtrue) |
ContentType | string | 出力ストリームのMIMEタイプ(デフォルトはtext/html) |
Cookies | HttpCookieCollection | クライアントに送信するクッキーの設定に利用する |
HttpResponseクラスの主要なプロパティ |
メソッド | 機能 |
---|---|
BinaryWrite | バイナリデータを出力ストリームに書き込む |
Clear | バッファリングされている内容をクリアする |
End | 現在バッファリングされているすべての出力をクライアントへ送信し、ページの実行を停止する |
Write | 文字列をコンテンツ出力ストリームに書き込む |
Redirect | 指定したURLへリダイレクトする |
WriteFile | 引数で指定したファイルをコンテンツ出力ストリームに直接書き込む |
HttpResponseクラスの主要なメソッド |
■PageクラスのServerプロパティ
Serverプロパティはユーティリティ的なメソッドがまとめられたHttpServerUtilityクラスのオブジェクトである。実際のプログラミングでは、このクラスのHtmlEncodeメソッドと、UrlEncodeメソッドを多用することになるはずだ。HTMLでは一部の記号を直接ドキュメントに含めることはできず、「<abc>」と表示したければ、「<abc>」のようにエンティティとして定義されたシーケンスでキャラクタを表現しなければならない。このようなエンティティへの変換に使うメソッドがHtmlEncodeメソッドである。またURLについても同じように、英数字と一部の記号を除けば、ほとんどのキャラクタは直接URLに含めることはできない。そのため、「/a b c=.html」は「/a+b+c%3d.html」のように変換しなければならず、この変換作業に使うメソッドがUrlEncodeメソッドである。
実際には、HtmlEncodeメソッドやUrlEncodeメソッドを使って変換しなくても、それなりに表示したり、URLとして解釈したりできるブラウザがほとんどだが、基本的にはこれらメソッドを使って適切に変換すべきである。なお、HTMLエンコードしなければならないのは、エレメントの外側に指定されるテキストであり、テキスト・ボックスに表示される文字列のように、属性値として指定するテキスト(例:asp:TextBoxのTextプロパティ)はそのままで構わない。
<%@ PAGE LANGUAGE="C#" %>
<html>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
h1.NavigateUrl = Server.UrlEncode("a b c=.html");
a1.HRef = Server.UrlEncode("a b c.html");
l1.Text = Server.HtmlEncode("<abc>");
t1.Text = "<abc>";
}
</script>
<body>
<form runat="server">
<asp:HyperLink id="h1" runat="server">asp:HyperLink</asp:HyperLink><br>
<a id="a1" runat="server">anchor</a><br>
<asp:Label id="l1" runat="server" /><br>
<asp:TextBox id="t1" runat="server" />
</form>
HttpServerUtilityクラスには次のような主要なメソッドが用意されている。
メソッド | 機能 |
---|---|
CreateObject | 引数で指定されたCOMオブジェクトを生成する |
Execute | ほかのページを実行し、結果をTextWriterオブジェクトに保存する。他ページのサブルーチン化 |
HtmlEncoder | 文字列をHTMLエンコードする |
UrlEncoder | 文字列をURLエンコードする |
HttpServerUtilityクラスの主要なメソッド |
次回後編では、ここまでに解説した@Pageディレクティブの属性(Language、Inherits、Src)以外の重要な属性についてまとめてみる予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.