連載
» 2002年07月18日 00時00分 公開

連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― :第4回 ASP.NETページのフレームワーク(前編)― コードビハインドとPageクラス ― (3/3)

[田口景介,著]
前のページへ 1|2|3       

■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>

リスト4.7 クッキーを生成するASP.NETページ

 一般的に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>

リスト4.8 画像データを生成するASP.NETページ

 ただし、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>」と表示したければ、「&lt;abc&gt;」のようにエンティティとして定義されたシーケンスでキャラクタを表現しなければならない。このようなエンティティへの変換に使うメソッドが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>

リスト4.9 HttpServerUtilityクラスのHtmlEncodeメソッドとUrlEncodeメソッドを使用したASP.NETページ

 HttpServerUtilityクラスには次のような主要なメソッドが用意されている。

メソッド 機能
CreateObject 引数で指定されたCOMオブジェクトを生成する
Execute ほかのページを実行し、結果をTextWriterオブジェクトに保存する。他ページのサブルーチン化
HtmlEncoder 文字列をHTMLエンコードする
UrlEncoder 文字列をURLエンコードする
HttpServerUtilityクラスの主要なメソッド


 次回後編では、ここまでに解説した@Pageディレクティブの属性(Language、Inherits、Src)以外の重要な属性についてまとめてみる予定だ。

「連載 プログラミングASP.NET ― ASP.NETによるWebアプリケーション実践開発講座 ― 」のインデックス

連載 プログラミングASP.NET ― ASP.NETによるWebアプリケーション実践開発講座 ― 

前のページへ 1|2|3       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。