その2 その3 No Link No Link No Link
プログラミング技術

Mizuho’s Web Site Copyright 2004 All rights reserved

図1 ●動的なWebサイトのイメージ

データベース
他のシステム
Web
プログラム
Web
サーバー
ブラウザ
(1)ログオンを要求(ID+パスワード) →
(2)ログオン成功のレスポンスとセッションID ←
(3)ページのリクエストとセッションID →
(4)リクエストに対するレスポンスとセッションID ←

※ログオンした後のやり取りの際には常に「セッションID」を一緒にやり取りして、同じユーザーがアクセスしていることを明示する。
図2 ●セッション管理のイメージ
リスト1 ●JSPのコード。”<%〜%>”でJavaのコードを書き込めるほか、
”<jsp:タグ名>
〜</jsp:タグ名>”形式の様々なタグが用意されている
"<%〜%>"でくくった部分がレスポンスを動的に生成する。他の部分はそのまま出力される
 <%@ page language="java" %>

 <html>
  <head>
    <title>Hello,world.</title>
  </head>
  <body>
    <%
      out.println("<h1>");
      out.println("Hello,world.");
      out.prontln(""</h1>");
    %>
  </body>
 </html>

 とはいえ、サーブレットが第一世代の技術であることには変わりありません。同世代の他の技術と同様に、ソースコードから出力されるWebページを想像しにくく、サーブレットですべてまかなおうとすると保守性を上げにくいという弱点があります。
 そこで、米Sun MicrosystemsはほどなくJava環境に第二世代の仕組みを導入しました。それがJSPです。JSPのプログラムはASPやPHPのプログラムと同様に、HTML文書に独自のタグでスクリプトを埋め込んだテキスト・ファイルです。(リスト1)。JSPページは実行時にコンパイルされ、サーブレットと同様にJavaのクラスとして実行されます。
 当初リリースされたJSP 1.xでは、JSPページに埋め込むプログラミング言語がJava言語そのものであったため、デザイナが編集することは容易にはできませんでした。しかし、2003年11月にリリースされたJSP 2.0では、データの簡単な加工に特化した「式言語」という新しい言語が搭載されています。
 JSP 2.0の登場で、プログラマはJavaを駆使してロジックを作り、デザイナはプログラマが作ったロジックの処理結果を式言語で参照しながら使いやすいユーザー・インターフェイスをJSPで構築する、という「第三世代」技術に沿った明確な役割分担が可能になりました。

●JSP 2.0で第三世代の仕組みを実現した

最初の一回を除けば、単なるJavaのメソッド呼び出しと同じなので高速
リクエストがあるたびに
実行ファイルを起動する
ので遅い
(b)サーブレットを使ったWebプログラム
(a)CGIを使ったWebプログラム
Webサイト
Webサイト
サーブレット

ブラウザ

ブラウザ
サーブレット・
コンテナ
Web
サーバー
CGI
プログラム
Web
サーバー
図3 ●CGIとサーブレットの違い
JSPページはページ・フローを制御するサーブレットの名前だけ知っていればよい
(2)
(5)
(5)
(2)
(4)
(6)
(3)
(1)
サーブレット
JSPページ2
リクエストは必ずページ・フローを制御するサーブレットに送る
サーブレットは、必要なロジックを実行した後、レスポンスを生成するJSPページに処理を振り分ける
Webアプリケーション
ブラウザ
JSPページ1
図4 ●ページ・フローを一つのサーブレットで集中管理する。見かけ上のページ・フローはJSPページ1→JSPページ2だが、リクエストは常にサーブレットに送られる。ページ・フローはサーブレットが処理を振り分けることで実現する
フレームワーク
プログラマが作成するプログラム
図5 ●フレームワークを利用すれば、プログラマがコードを書く部分を減らせる

 第三世代の技術の後、Webプログラミングは今後どのように進化していくのでしょうか。最後に、クライアントとWebサーバーそれぞれの視点から、Webプログラミング技術の未来を探ってみましょう。最初はクライアント側です。
 第三世代がもたらしたプレゼンテーションとロジックの分離は、クライアント側にも大きな影響を及ぼしました。クライアントに必ずWebブラウザを利用するという図式が崩れつつあるのです。
 これまでWebプログラムは、「Webサーバー側でHTMLデータを動的に生成する」という前提で進化してきました。HTMLデータはパソコンや携帯電話などインターネットへアクセスできるほとんどのデバイスで解釈/表示されます。Webアプリケーションが盛んに開発されるようになった背景には、どこでも表示できて、そこそこ表現力が高いHTMLの存在が大きく貢献しています。
 ところが、実際にWebアプリケーションを作ってみると、HTMLを表示するだけのブラウザよりも、専用のクライアント・アプリケーションの方がずっと使いやすいという状況もたくさんあることがわかってきました。多量のデータを素早く入力したり、帳票を紙に印刷する処理などはブラウザとHTMLの組み合わせではなかなか思うように作れないのです。
 そこで出てきたのが、HTTPを使って通信するというWebの仕組みは保ちつつ、ブラウザより表現力が高く、操作性のよいクライアント・ソフトウェアを使うという動きです。このようなソフトウェアを「リッチ・クライアント(表現力が高いクライアント)」と呼びます。
 リッチ・クライアントの代表選手が米MacromediaのFlashです。Flashはアニメーションの作成/再生環境として有名ですが、最近ではリッチ・クライアントのアプリケーション開発ツールとして脚光を浴びています。ActionScriptというスクリプト言語の処理系を備え、メニューや入力ボックスなど様々なユーザー・インターフェイス部品を用意しており、HTMLを使うよりずっと操作性の良いクライアントを作れるからです。ページを書き換えることなくHTTPサーバーとデータをやり取りすることもできるので、ネットワークへの負担がいたずらに大きくなるという心配もいりません。
 Flashのプログラムは、FlashPlayerというブラウザ上のプラグインで実行しますが、リッチ・クライアントには、ブラウザとは別のソフトウェアをクライアントに配布する、というアプローチもあります。アクシスソフトの「Biz/Browseer」や、.NET技術を使ったマイクロソフトの「スマート・クライアント」などです。どちらも、HTMLベースのWebアプリケーションの限界を打ち破る方法として、今後、要注目の分野です。

●プレゼンテーションの独立 クライアントが非HTML化

Web
サービス
Web
サービス
Web
サービス
Web
アプリケーション
複数のWebサービスが連携しあう
(b)Webサービスを使ったWebアプリケーション
(a)従来のWebアプリケーション


図6 ●Webサービスを基本にしたWebアプリケーションは、ネットワーク上に公開されたWebサービスを連携させる

 しかし、第二世代技術の利用が進むにつれ、次第にその限界も明らかになってきました。ソースコードをHTMLに似た形式にすることで、確かに第一世代に比べると全体の見通しはよくなり、大規模なWebアプリケーションを作りやすくなりました。しかし、HTMLとしてそのまま出力する部分と、プログラムとして処理する部分が混在していることには変わりありません。複雑な処理をしようとすればコードはどんどん増えます。場合によっては、ページの見た目をちょっと変更しようとして、うっかりコードを書き換えてしまうという事故も起こる可能性があります。
 さらに言えば、デザイナとプログラマで分業体制を敷こうとしたときに、プログラマの負担が相対的に大きくなってしまうことが挙げられます。コードとデザイン(HTML)が一つのファイルに混在している以上、それを総合的に理解できるのはプログラマだけだからです。
 そこで、主にデザイナが作るアプリケーションの見た目(プレゼンテーション)と、プログラマが作るアプリケーションの動作(ロジック)とを別々に作る仕組みが求められるようになりました。これを「第三世代」の技術と呼ぶことにしましょう。

●第三世代ではプレゼンテーションとロジックを明確に分離する

 サーバー側では誰にどのセッションIDを割り当てたかを覚えておけば、後はリクエストに含まれるセッションIDを見ることで誰からのリクエストなのかを判別できます。
 実は、第一世代の技術でもこの仕組みを作り込むことはできます。しかし、第二世代の技術は、特に意識しなくてもセッションを自動的に管理し、同じユーザーからのリクエストを連続的に処理できるのが大きな特徴です。
 複数のWebプログラムを統合的に運用できる第二世代の技術によって、ユーザー一人ひとりの操作に臨機応変に対応できる「Webアプリケーション」と呼ぶにふさわしいWebプログラムを簡単に作れるようになったわけです。

 ここでは、日経ソフトウェア2004年8月号に掲載されていた『基礎からまるわかりWebプログラミング(後編)』斎藤国博氏の文書から抜粋したものを掲載します。あくまで私のメモですが、参考にされたい方があれば一見するのも価値があるかもしれません。
先ずは前編の内容はどんなものかというと以下のようになります。


〔ポイント1〕最初は動的なWebサイトから始まった
 一般的にWebプログラミングとは、WebブラウザとWebサーバーで構成された環境において、Webブラウザにデータ(レスポンス)を送り出すWebサーバー側のプログラムを作ることを意味します。(以下、Webプログラム)HTMLファイルなどの形で予めレスポンスを用意しておく「静的なWebサイト」に対し、Webプログラムを使ってレスポンスを生成するサイトを「動的Webサイト」と呼びます。(図1)

〔ポイント2〕第一世代では文字列出力機能でHTMLを生成していた
 初期のWebプログラムは、C言語のprintf()関数やPealのprint文など、汎用プログラミング言語の文字列出力機能を使ってHTMLを生成していました。これを便宜上「第一世代」技術と呼びます。この形態のWebプログラムは手軽に作れるため現在でも数多く作られていますが、機能が複雑になるとどのようなWebページを生成するのかわかりにくいという弱点があります。そのため、大規模なWebプログラムの開発には向きません。

〔ポイント3〕HTMLの中にスクリプトを埋め込んだのが第二世代
 第一世代の技術の弱点を埋めるべく登場したのが、HTMLの文書の中にスクリプト(ソースコード)を埋め込む形態の「第二世代」です。第二世代の技術では、プログラムを記述するファイル形式が、汎用プログラミング言語の実行形式(exe)ではなくHTML形式になりました。ブラウザからリクエストを受けると、サーバーはHTMLの部分をそのまま出力し、スクリプトが埋め込まれている部分をスクリプトの実行と結果に置き換えて出力しします。《ASP(Active Server Pages)、オープンソース・ソフトウェアのPHP(Hypertext Preprocessor)》
どのようなWebページを生成するのかを想像しやすく、第一世代の技術に比べて保守しやすいコードを書くことができます。

●Webプログラミング技術の現在そして未来

 ここからは、上記とは視点を変えて、Webプログラムのコードを「どう実行するか」という視点からWebプログラミング技術を見ていきます。
すると、第二世代の技術が第一世代に比べ、コードの書き方を変えたこと以上に大きな進歩を遂げているのが見えてきます。
 それは、第二世代の技術によって「複数のWebプログラムをまとめて、全体を一本の”Webアプリケーション”として処理できるようになった」ということです。
 Webアプリケーションでは、クライアント(Webブラウザ)とWebサーバーのやり取りは、
(1)クライアントがサーバーにリクエストを送る
(2)サーバーがリクエストに対応したレスポンスを用意する
(3)サーバーがクライアントにレスポンスを送る
----でワンセットになります。クライアントとサーバーの間では、このようなやり取りが必要になるたびにHTTPで接続を確立し、理ックエストとレスポンスを送受信して、最後に接続を切るという処理を繰り返します。複数のページにまたがるサービスがあれば、ページが切り替わるごとにリクエストとレスポンスが発生するわけです。
 ところが、Webサーバーには何人もの人が同時に並行してアクセスルしてきます。リクエストが連続しているからといって、同じ人からのアクセスである保証はありません。静的なWebサイトならばリクエストを右から左へ処理していけば済みますが、情況に応じてレスポンスが変わる動的なWebサイトではそうはいかないでしょう。そこで、どのリクエストとどのリクエストが同じ人から来たものかをきちんと把握して、それぞれの人に向けて適切なレスポンスを返す必要が出てきます。これを「セッション管理」と呼びます。
 セッション管理の原理は単純です。セッションを識別するための合言葉(セッションID)をレスポンスに埋め込んでおいて、クライアントが次にアクセスしてくるときにそのセッションIDを言ってもらえればいいのです。(図2)

●第二世代から、複数のWebページを一つのシステムに統合できるようになった

 第一世代の代表的なシステムが、Javaサーバーサイド技術であるサーブレットとJSP(JavaServerPages)です。これらのサーバーサイドJava技術はいきなり登場したわけではなく、他のWebプログラム技術と同様に段階を追って進化してきました。サーバーサイドJavaは現在のWebアプリケーション構築プラットフォームとして非常に重要ですから、復習もかねてサーブレットとJSPの進化を少し詳しく解説します。

(----プレゼンテーションとロジックの分離は、Webプログラミングに共通する課題です。サーバーサイドJavaのほか、ASPの後継技術であるASP.NETには、論理的な一枚のページをプレゼンテーションとロジックに分けて別々のファイルに記述できる「コード・ビハインド」という仕組みが組み込まれています。PerlやPHPなどでも、HTML部分を最終的な出力に近い形で作り、可変部分を一括して置き換えられるためのライブラリなどが作られています。----)

 初めに登場したのはサーブレットです。サーブレットはJava版の第一世代Webプログラミング技術です。つまり、出力メソッドでHTML形式の文字列を一行ずつ書き出していくことでレスポンスを作ります。例えば”Hello、World”というメッセージをサーブレットで出力する場合は、println()メソッドの引数が生成されるHTMLデータになります。
 このプログラムの実行速度はCGI(CommonGatewayInterface)のプログラムに比べてずっと高速です。CGIではリクエストがあるたびに実行形式ファイルを起動するので、極めて大きなオーバーヘッドが掛かります。一方、サーブレットの実体はJavaのクラス・ファイルです。Webサーバーに「サーブレット・コンテナ」と呼ぶプログラムをあらかじめ組み込んで運用します。個々のサーブレットでの処理が必要になると、サーブレット・コンテナがそのサーブレットを読み込んで実行し、サーブレットが生成したHTMLデータを受け取ってクライアント(ブラウザ)に送り返します。
 一度読み込まれたサーブレットは、コンテナが動いている間は基本的にそのままシステム上に残っています。つまり、最初の一回を除けば、単なるJavaのメソッド呼び出しと同じだけのオーバーヘッドで動作するので高速なのです。(図3)

●サーバーサイドJavaも第一世代から始まった

 第三世代技術によって、プレゼンテーションとロジックを明確に分けて記述できるようになり、より大規模なWebアプリケーションを効率よく開発できるようになりました。しかし、Webプログラミング技術の進歩が止まったわけではありません。新たにまた一つ問題が出てきました。
 Webアプリケーションの処理内容が複雑になると、そこに含まれる多数のページの流れを管理するのが難しくなってしまうという問題です。
 一般にWebアプリケーション内では、あるページの次ぎの処理がどのページにあるかという情報は、呼び出し元のページに<FORM>タグのAction属性などを使って書き込みます。つまり、ページ同士の関係を記述したリンクは個々のページに分散した状態になっているわけです。関係を変更したい場合には個別のページを修正しなければなりません。つまりページ数が多くなるほど保守性はどんどん低下します。
 この問題を回避するため、サーバーサイドJavaなどではリクエストを処理する機能を一個のサーブレットに集中し、状況に応じてレスポンスを適切なJSPページに振り分けるのが定番のテクニックになっています(図4)。JSPページからは必ずこのサーブレットにリクエストを送り、次にどのJSPページを呼び出すかの判断はサーブレットに任せてしまうのです。
 問題は、このサーブレットの実装が容易ではないことです。どのページから来たリクエストかを判断し、対応する処理を実行して次ぎのJSPページをレスポンスとして送り返す、と書いてしまえば簡単ですが、大きなWebアプリケーションになれば、処理を振り分けるためのif文が延々と続く複雑なコードになってしまいます。しかもこのサーブレットは使い回しがきかず、Webアプリケーションを作るたびに同じような構造のサーブレットを何度も作る羽目になります。
 そこで登場したのが「フレームワーク」という考え方です。リクエストを受け付けるサーブレットの機能から動作の枠組み(フレームワーク)部分を残して、実際のページ同士の関係を設定ファイルとして与えようというわけです。こうすれば、ページ・フロー(Webページの画面遷移)が変わっても、設定ファイルを編集するだけで済みます。
 フレームワークには、アプリケーションの品質を向上させ、開発期間を短縮できるというメリットもあります。Webアプリケーションは、社会インフラから企業の各種サービスまで、あらゆるジャンルのシステムで使われていますが、大規模・複雑化するにつれ、高品質への要求は強まる一方です。また1ヶ月〜3ヶ月という短納期の開発も少なくありません。フレームワークを利用することで、プログラマがコードを書く部分を最小限に済ませ、高品質と短納期をいっぺんに実現しようというわけです(図5)。
 サーバーサイドJava向けのフレームワークではThe Apache Software Foundationの「Jakarta Struts(ジャカルタ・ストラッツ)」が有名です。またASPの後継技術であるASP.NETは、Visual Studio.NETを使うことでページ・フローをほとんど意識することなく複雑なWebアプリケーションを構築できるフレームワーク「Web Forms」を搭載しています。このように、今後のWebプログラミングは、フレームワーク抜きには語れなくなるでしょう。

●ページ同士の関係を集中管理する

 クライアント側がリッチ・クライアントというアプローチを志向しはじめたように、Webサーバー側も新しいアプローチを探り始めています。プレゼンテーションの機能そのものを公開してしまおうとする考え方「Webサービス」です。
 Webサービスは、ネットワーク越しに別のプログラムからアクセスされることを想定したWebプログラムです。Webアプリケーションが、人間が「目で見て操作する」形態を想定しているのに比べ、Webサービスはコンピュータ同士が利用し合うためのプログラムと考えればいいでしょう。Webアプリケーションは複数のWebサービスによって構成されるようになるわけです(図6)。
 あるコンピュータが、ネットワーク上にある別のコンピュータからWebサービスを使って呼び出した情報をどのように加工するかは、呼び出したコンピュータ(クライアント)の自由です。例えば、天気情報を公開しているWebサービスを呼び出して、天気予報を見やすく加工して表示してもいいですし、定期的に情報を引き出して気温変化の統計をとっても構いません。使われ方は、Webサービスは規定していないのです。
 この仕組みを利用すれば、アプリケーションの大部分をOSのネイティブ・コードで実装し、Webサーバーでの処理が必要な部分だけWebサービスを利用して処理するといったシステムを開発することも現実になるでしょう。
 このようなWebサービスの考え方は、最近ではSOA(Service Oriented Architecture;サービス指向アーキテクチャ)として体系化され、米IBMはじめとする多くのソフトウェア・ベンダーが次世代のWebアプリケーション構築技術として普及を進めています。リッチ・クライアントと並んで、今後、ますます重要になる技術と言えるでしょう。
        ☆        ☆        ☆
 以上、過去のWebプログラミングから最新のWebサービスまで、複雑に見えるWebプログラミング技術がどうして今のような形になったのかを解説してきました。ここまで読んでいただけた方なら、Webプログラミングの基本知識は身に付いているはずです。ぜひ、興味のある分野から、Webプログラミングの勉強を始めてみてください。

●WebサービスはSOAへさらに進化