表示を行うHTMLの記述をサーブレットから分離する

リスト10●リスト8の表示部分をJSP ファイルに分離するためにさらにCartServlet を改造(sample5)
リスト11 ●カートの内容を表示するJSP ファイル「CartJsp 」(sample5 )
図8●ショッピング・カートの機能をM(Model),V(View),C(Controller)に分離(sample5)

 これで,CartServletからカートの本体を切り離すことができました。しかし,CartServletにはまだもう一つ大きな問題が残っています。プログラムの中にWebページを表示するHTMLが埋め込まれている点です。

 WebページをデザインするWebデザイナとWebサイトで動作するプログラムを開発するプログラマは,本来,別の職業です。しかし,HTMLがサーブレットのプログラムに埋め込まれていると,デザイナがWebのデザインを変更したい場合でも,プログラムのソースコードを変更しなければなりません。また,Webページのデザインを確認するのに,いちいちサーブレットを動作させる必要があります。

 そこで威力を発揮するのがJSPです。適切な情報を表示するJSPを用意し,それをサーブレットから呼び出すようにすれば,サーブレットからHTMLを切り離すことができます。JSPに記述するJavaのプログラム・コードは必要最低限に抑えるようにします。あくまで「プログラムとHTMLの分離」が目的だからです。きちんと分離できれば,WebデザイナがJavaのプログラム・コードを意識する必要はなくなります。

 では,JSPを利用するようにカートを改造していきましょう(sample5)。CartServletに加える変更をリスト10[拡大表示]に示しました。sample4のCartServletでは,amountという変数は累計の表示のためだけに使っていました。sample5では表示はJSPファイルにまかせるので,amountに関する記述は不要になります。HTMLを出力して表示を行っていた部分も変更します。このように記述することにより,JSPファイルである「CartJsp.jsp」が呼び出されます。

 JSPファイルの内容をリスト11[拡大表示]に示しました。「<%@」と「%>」で囲まれた部分が,JSPファイルの処理方式を指示する「ディレクティブ」と呼ばれるものです。最初が,コンテント・タイプとエンコーディング方式を指定するpageディレクティブです*16。JSPファイルでは,HTMLのmetaタグを使ったコンテント・タイプの指定は無効なので,必ずこのように記述します。次のpageディレクティブで,カートの本体であるCartクラスをインポートしています。

 Javaのプログラム・コードは「<%」と「%>」の間に記述します。リスト11では,セッション・オブジェクトからCartオブジェクトを取り出す1行だけを記述しています。「<%=」と「%>」の間に記述するのがJSPの式です。コードの評価結果をHTMLに挿入するために使います。ここでは,getAmountメソッドの実行結果である商品の累計をHTMLに挿入しています。

 リスト11の全体をながめてみると,HTMLの構造がほとんど壊れていないことがわかります。JSPに特有の記述をコメント・アウトしたりダミーに置き換えることで,Webデザイナが通常のHTMLファイルとして扱うことが可能になります。

サーバーサイドJavaではMVCフレームワークが主流

 これで,ショッピング・カートの機能を三つの部品に分割できました。実は,これらの部品は「MVC」と呼ばれる構造を意識して分割しています(図8[拡大表示])。Mはビジネス・ロジックを記述する「Model」,Vは表示を担当する「View」,Cは全体の制御を行う「Controller」を表します。最終的にできあがったsample5は,CartオブジェクトがModel,CartJspがView,CartServletがControllerをそれぞれ担当しています。こうすることで,メンテナンスや機能の追加が容易になります。

 現在のサーバーサイドJavaの開発では,MVC構造を採用するのは半ば「常識」です。ただ,MVC構造のアプリケーションを毎回,一から開発するのでは手間がかかります。そこで,MVC構造をあらかじめ規定したWebアプリケーション・フレームワークを使うのが一般的になっています。代表的なフレームワークがオープンソースのStrutsです*17。今日では,Javaを使った企業のWebアプリケーション開発ではStrutsを利用するのが主流です*18


表A●Tomcatをインストール後に設定する環境変数。JAVA_HOMEとCATALINA_HOMEはJDKとTomcatのバージョンに応じて変わる
図A●JavaのWebアプリケーションのフォルダ階層。sample0パッケージに属するHelloServletの例
リストA●サーブレットの情報を記述するweb.xml(デプロイメント・ディスクリプタ)。sample0パッケージに属するHelloServlet の例

サーブレットとJSPが動く環境を用意する

 サーブレットやJSPの動作を確認するには,「Webコンテナ」と呼ばれるサーバー・ソフトウエアが必要です。手軽に実行環境を実現するには,オープンソースのWebコンテナ「Tomcat」をダウンロードし(http://jakarta.apache.org/site/downloads/downloads_tomcat.html),ローカル・マシンにインストールするのがよいでしょう。インストールしたら,環境変数を設定します(表A[拡大表示])。JAVA_HOMEとCATALINA_HOMEはJDKとTomcatのバージョンによって変わるので,適宜読み替えてください。Windows 2000/XPでは,「システムのプロパティ」の「詳細」に環境変数の設定画面があります。「システム環境変数」の部分に表Aの環境変数を設定してください。Windows 9x系では,autoexec.batファイルに環境変数の設定を記述します。Tomcatの起動は「Monitor Tomcat」というソフトで行います。

 サーブレットを動作させるには,ソースコードのコンパイルが必要です。決められたディレクトリ構造をとる必要もあります(図A[拡大表示])。まず,サーブレットを含むWebアプリケーションのフォルダを,Tomcatをインストールしたフォルダにあるwebappsフォルダの下に置きます。この下に「WEB-INF」というフォルダを作り,さらにその下に「classes」というフォルダを作ります。classesの下にはパッケージ名のフォルダを作り,その下にサーブレットの本体であるクラス・ファイルを配置します。

 WEB-INFフォルダの中には,サーブレットの情報を記した「web.xml(デプロイメント・ディスクリプタ)」という設定ファイルを置く必要があります(リストA[拡大表示])。<servlet>要素と<servlet-mapping>要素の<servlet-name>には,共通の名前を設定します。サーブレットが複数あるときは,それらの数だけ<servlet>と<servlet-mapping>の組を記述します。<servlet-class>には,サーブレットのクラス名をパッケージ名込みの完全修飾名で記述します。<url-pattern>には,ブラウザから呼び出すときの名前を指定します。

 これで,ローカルのWebブラウザからサーブレットを起動できるようになりました。この例では「http://localhost:8080/sample0/HelloServlet」というURLにアクセスすると,サーブレットが起動します。ちなみに,JSPを動作させるには,ユーザーによるコンパイルもデプロイメント・ディスクリプタも必要ありません。