この特集のトップページへ
Chapter 8:プレゼンテーション層の構築

head2.gif8.2.2 アプリケーションとセッション
 HTTPによる通信は,基本的にクライアントからサーバーに接続されてデータが送受信されたあと,すぐに接続が切断されるという1回限りのやり取りで成り立つ。しかし,Webアプリケーションでは,このような1回限りの接続ではなく,ユーザーと持続的な接続を維持したい場合もある。


One Point! Keep-Alive接続を使えば,クライアントとサーバー間は接続されたままになる。しかし,Keep-Alive接続は,TCP/IPのコネクションを張り直す時間を短縮するための機能であり,HTTPの根本的な仕組み――すなわち,「クライアントから要求からあったときにサーバーが応答を返す」という仕組み――を覆すものではない。つまり,Keep-Alive接続でも,HTTPのレベルでは1回限りの接続ということに変わりはない。

 たとえばショッピングサイトを考えてみよう。ショッピングサイトでは,ユーザーが購入したい商品をいくつか選択し,それを最後に精算する,という形式をとることが多い。扱う商品の点数が少なければ,商品の選択ページと精算ページを1つのWebページにまとめることもできるだろう。しかし,そうしてしまうと,1つのWebページに多数の商品を並べて掲載した場合に,ユーザーは必要な商品を見つけるのが難しくなってしまう。そこで,一般には商品をカテゴリ別に分けて別ページに掲載し,最後に精算ページを表示させ,配達先や支払い方法などを入力させるという形式をとることが多い(Fig.8-44)。

Fig.8-44 複数のページに渡るWebアプリケーション
fig8_44

 しかしHTTPでは,1ページを送信するたびに接続を切ってしまうから,ユーザーが精算ページを表示させたときに,商品選択ページでどの製品を選択したのかがWebアプリケーション側で判断できないことになる。

 少し簡略化して,ここではFig.8-45のようなWebアプリケーションを考える。Fig.8-45のWebアプリケーションは,(1)商品を選択するページ,(2)支払い方法と配送先を入力するページ,(3)最終確認ページ,という3つのページから構成されている。このようなWebアプリケーションを構築する場合,商品を選択するページでユーザーが選んだ商品を,最後に表示される最終確認ページにまで伝える処理が不可欠になる。

Fig.8-45 複数ページに渡るWebアプリケーションの例
fig8_45

 こういった複数ページに渡る処理を実現する方法はいくつかあるが,次の2つのいずれかの方法をとるのが一般的である。

1. Webページ内に埋め込む方法

 1つ目の方法は,選択された商品をWebページ内に<INPUT TYPE="HIDDEN">を使って埋め込んでしまう方法である。

 そのためには,List 8-20List 8-21List 8-22List 8-23という4つのASPファイルを用意する。

 List 8-20List 8-23のうち,List 8-23は,単に扱う商品名と価格をそれぞれ配列として定義しただけのファイルである。実際にショッピングサイトを構築する場合には,リレーショナルデータベースに商品名や価格などを格納しておき,そのデータベースにアクセスして情報を表示することになるだろう。しかし,ここでは話を簡単にするため,配列として扱うものとする。

 さて,List 8-20が商品選択のページとなる。これはFig.8-45の左上に示したページに相当する。このページは,次のように0〜扱う商品数-1という番号をフィールド名(NAME属性)とするテキストフィールドを備えており,ユーザーに数量を入力させる。テキストボックスは,8〜13行目のループ処理によって表示される。

ネットワークカード(価格\2800):
  <INPUT TYPE="TEXT" SIZE="2" 
    NAME="0">個<BR>
ハブ(価格\6000):
  <INPUT TYPE="TEXT" SIZE="2"
    NAME="1">個<BR>
スイッチングハブ(価格\10800):
  <INPUT TYPE="TEXT" SIZE="2"
    NAME="2">個<BR>
プリンタ(価格\19800):
  <INPUT TYPE="TEXT" SIZE="2"
    NAME="3">個<BR>
ルーター(価格\59800):
  <INPUT TYPE="TEXT" SIZE="2"
    NAME="4">個<BR>
モデム(価格\14800):
  <INPUT TYPE="TEXT" SIZE="2"
    NAME="5">個<BR>

 商品選択ページ(List 8-20)で[次のページへ]ボタン(SUBMITボタン)が押されると,5行目で指定されているpay.aspList 8-21)が呼び出される。pay.aspは,Fig.8-45の右上に示した支払い方法と配送先の選択ページに相当する。ここでは,支払い方法として,[クレジットカード][代金引換][銀行振込]のいずれかを選択し,[配送先]を入力することになる。

 支払い方法を選択するためのフィールドは,ラジオボックスとして構成した。ラジオボックスは,List 8-21の6〜8行目にあるように,次のようなpayという名前のフィールドとして表現される。

<INPUT TYPE="RADIO" NAME="pay"
   VALUE="1" CHECKED>
  クレジットカード<BR>
<INPUT TYPE="RADIO" NAME="pay"
   VALUE="2">
  代金引換<BR>
<INPUT TYPE="RADIO" NAME="pay"
   VALUE="3">
 銀行振込<BR>

 一方の配送先を入力する欄は,9行目にあるようにADDRESSという名前のテキストフィールドとして表現してある。


配送先:<INPUT TYPE="TEXT" NAME="ADDRESS" 
    SIZE="60"><BR>

 支払方法と配送先の選択ページ(List 8-21)で[次のページへ]ボタン(SUBMITボタン)を押したときには,List 8-21の5行目で指定されているsubmit.aspList 8-22)が呼び出される。しかし,このままだと,まえの商品選択ページ(List 8-20)でユーザーが入力した商品の数量がsubmit.aspに伝わらない。そこで,List 8-21では,13〜17行目の処理において,ユーザーが商品選択ページで入力した数量を<INPUT TYPE="HIDDEN">を用いて埋め込むという作業をしている。ユーザーが商品選択ページで入力した数量にもよるが,13〜17行目の出力は次のようになる。この例は,ユーザーが商品選択ページで,1番目の製品を5つ,2番目の製品を3つ,4番目の製品を2つ,選択したときの出力である。


<INPUT TYPE="HIDDEN" NAME="0" VALUE="5">
<INPUT TYPE="HIDDEN" NAME="1" VALUE="3">
<INPUT TYPE="HIDDEN" NAME="2" VALUE="">
<INPUT TYPE="HIDDEN" NAME="3" VALUE="2">
<INPUT TYPE="HIDDEN" NAME="4" VALUE="">
<INPUT TYPE="HIDDEN" NAME="5" VALUE="">

 この処理によって,List 8-20で示されるWebページにてユーザーが入力した数量は,List 8-21の出力に埋め込まれることになる。それによって,List 8-21で[次のページへ]ボタン(SUBMITボタン)を押したときには,List 8-20で入力した情報とList 8-21で入力した情報を併せて,List 8-22に送信することができる(Fig.8-46)。つまり,まえのページでユーザーが入力した情報を<INPUT TYPE="HIDDEN">を使って埋め込むことで,次々と後続するページに伝えてゆくことができるのである。

Fig.8-46 <INPUT TYPE="HIDDEN">を使ったデータの流れ
fig8_46

2. クッキーで伝える方法

 もう1つの方法は,ユーザーが入力した情報をクッキー情報として保存する方法である。それには,List 8-21List 8-24のように,List 8-22List 8-25のように,それぞれ変更する。

 List 8-24の13〜15行目では,List 8-20で示されるWebページにてユーザーが入力した商品の数量を,クッキー情報に保存するという処理をする。そして,List 8-25の9〜20行目では,保存されたクッキー情報を参照することで,データを取得する(Fig.8-47)。

Fig.8-47 クッキー情報を使ったデータの流れ
fig8_47

 では,いままで説明してきた,(1)Webページ内に埋め込む方法,(2)クッキーで伝える方法,という2通りの方法のうち,どちらが適するのだろうか。これは,状況による。

 まず汎用性という面から考えると,Webページに埋め込む方法のほうが適している。なぜならば,クッキーはすべてのWebブラウザが対応しているとは限らないためである。Webページ内に埋め込む方法であれば,Webブラウザの基本的な機能しか使っていないので,あらゆるWebブラウザに対応できるというメリットがある。

 しかし,アプリケーションの作成のしやすさからいえば,クッキーで伝える方法のほうが作りやすい。なぜならば,クッキーはResponseオブジェクトやRequestオブジェクトのCookiesコレクションを使って容易に読み書きできるため,<INPUT TYPE="HIDDEN">を埋め込むよりも手間が少なくてすむためである。

 また,Webページ内に埋め込む方法では,ページが呼び出される順番を気にする必要があるという点にも注意しなければならない。というのは,Webページ内に埋め込む方法は,あくまでも,まえのページでユーザーが入力した情報を<INPUT TYPE="HIDDEN">によって次のページに伝えるというものであるため,ユーザーが直接ASPファイルのURLを入力したり,別のWebページからASPファイルを呼び出したりした場合には,正しく情報を受け渡せないおそれがある。

 今回示したサンプルは,たった3ページしかなく,しかも必ず,商品選択ページ,支払い方法と配送先の選択ページ,確認ページという順序で呼び出させれることを想定している。そのため,<INPUT TYPE="HIDDEN">を使って情報を受け渡す方法を用いる場合も,さほど難しいことはない。しかし,どのような順序で呼び出しても正しく動作させたいという場合には,まえのページがどれであるのか,次のページがどれであるのかを判定したり,その状況に応じて埋め込むべき値を変更したりする必要があるため,プログラムはやや複雑になる。

 それに対し,クッキーに保存する方法では,情報がWebブラウザ側のクッキーとして保存されるので,どのWebページで保存した内容でも,いつでも好きなときに参照できるという利点がある。結果的に,Webページが呼び出される順序はあまり気にしなくてもよい。

 よって,Webアプリケーションを提供するWebブラウザがクッキーに対応しているのであれば,クッキーを利用したほうが開発効率もよいし,柔軟性も増す。

 ただし,先に説明したように,クッキーには,(1)1つのクッキーあたり4Kバイト以下,(2)1つのドメインあたり20個まで,(3)全部で300個まで,という制限がある(正しく情報が保存される保証がなくなる)。(1)の制限に引っかかることはあまりないと思われるが,(2)の制限に引っかかることは得てして多い。たとえば,List 8-24List 8-25に示した方法では,商品1個あたり1つのクッキーを使っているため,20個以上の製品を扱うと,一部のWebブラウザではクッキー情報が保存できなくなるおそれがある。

 そこで,このようなクッキーの弱点を補完する形でASPに実装されているのが,Sessionオブジェクトによるセッション機能である。

Prev 22/43 Next