2011-9-21作成

 ■プログラム構成

 ■プログラム構成について

 ここではサーバー側の設計に踏み込んだ話をしていきます。具体的にはプログラム構成について説明します。

 これまではJavaの文法説明や基本的なクラスの利用方法の説明に重点を置いてきました。そのためサーバーJavaの一番簡単な仕組みを利用し、全てJSPやサーブレットだけを使ったサンプルを作って説明しました。JSPはAPサーバー上でサーブレットに変換されるため、実質的にはサーブレットのみで説明してきたと思ってもらえればいいです。

 具体的なコーディング方法の説明は後に回し、まずはプログラム構成図で説明します。

 まず今まで説明してきた構成を図解するとこうなります。
サーブレット/JSPで全て処理する構成

 これをもう一段掘り下げて考えます。

あまり良いとは言えない構成

 ある画面からサーバー処理を要求する手段として、ボタンが1つだけとは限りません。むしろ画面内に複数のボタンやリンクがあり、それぞれ別のサーバー処理を要求する方が普通でしょう。

 これの一番単純な実装は全てのサーバー処理要求に1つのサーブレット/JSPを割り振る、というものです。図解するとこうなります。

サーバー処理要求毎にサーブレット/JSPを分ける

 これの何があまり良いとは言えないのか、それは

  • プログラム本数がむやみに増えて管理しきれなくなる。
  • 共通ロジックがあちこちに出てきそう
というものです。

 まあ共通ロジックはクラス分けをちゃんとすればいいのでしょうが、似たようなプログラムがあちこちに出てきそうなのは変わりません。

現実的な構成

 じゃあどうすればいいのかというと、常識的には1画面=1サーブレット/JSPにします。画面内に複数のサーバー処理要求(ボタンやリンク)があるとき、サーブレット側でどのサーバー処理が要求されたのかを判定します。

画面単位にサーブレット/JSPを分ける

 図中ではgetParameter("ボタン1")のように書いていますが、HTMLでの送信ボタン定義でname=パラメータで指定したボタン名です。

 参考は「入力画面用のHTML」の送信ボタンです。

 単純な画面であればこれでもいいでしょう。しかし実際の業務画面では、例えばボタンと業務処理が1:1で決まるとは限りません。同じボタンを押したときでも、他の入力域の値や選択項目の内容によって実行する業務処理が異なる状況もあり得ます。

 またサーバー処理にはステートレス(stateless)とステートフル(stateful)があります。ステートレスはサーバー・クライアント間のやりとりが毎回完結するものです。

 ステートフルはいわば会話型というものです。サーバー・クライアント間で複数回のやりとりが行われ、その途中経過の状態をサーバー側で保持します(セッション情報)。この場合は同じボタンを押したときでも、サーバ側の状態(セッション情報)によって実行する業務処理が異なる場合があり得ます。

 そしてこれとは別に「■サーブレット編5」のサーブレット固有の問題で説明した、マルチスレッド環境下での問題があります。思わぬミスもあり得るしサーブレットではあまり複雑な処理をしない方がいいでしょう。

構成の基本形

 ではどうするかというとサーブレットは基本的な処理の振り分けに徹し、具体的な処理はクラスに分けましょう。これらを踏まえ次の形をサーバー側の基本構成とします。

画面単位にサーブレット/JSPを分け処理クラスも別にする

 クライアントからの処理要求、画面の送信内容等を調べるのは、とりわけ処理内容が少ないときはわざわざ別クラスにせずサーブレットの内部メソッドでも十分です。しかしここでは基本形として必ず要求解析の別クラスに分ける、という前提で説明していきます。

もう一度引いて全体を見る

 一応の基本形を説明しましたが、これで終わりではありません。また一段引いて全体を見直してみます。

 これまでの所は処理部分を別クラスに分けたものの、要求を受けたサーブレットで処理をして結果も返す、という構造は変わっていません。

 サーブレットが返す結果というのは『通常は』HTMLであり、すなわち画面定義です(違うパターンについては後で説明します)。

 さて初期の業務系のWEBシステムではそれほど凝った画面ではありませんでした。HTMLも基本的な要素・使い方だけです。

 しかし最近では企業内でしか使われない閉じた業務系システムであっても、利便性を考慮してそれなりの画面を作ることがあります。ましてや一般の利用者向けに作られた開いたシステムならなおさらでしょう。

 特にユーザー・インターフェース設計担当としてWEBデザイナーが参加しているケースもあるかと思います。こうした場合は最近ならHTML5やCSS3を使った、それなりに複雑な画面定義になるでしょう。

 そういうHTMLをサーブレットからprintprintlnで出力するのは

  • サーブレットの画面出力部分が複雑になりすぎメンテナンス性が落ちる
  • 画面定義担当のWEBデザイナーと業務ロジック担当のプログラマとの分業がしにくい
という問題がでてきます。

 そこで思い出してください、JSPの特徴を。JSPではHTMLコードの中にJavaプログラムコードが含まれています。ということは画面定義担当者が作ったHTMLコード中に、業務処理結果を反映させる最低限のJavaプログラムコードを埋め込めばいいということです。

 これを踏まえて全体のプログラム構成を

  • クライアントからの要求を受け付け、全体の処理制御をするサーブレット
  • 要求に応じた個別の業務処理をするクラス
  • 処理結果画面を出力するJSP
の3つの部分に分けることにします

 これを踏まえたサーバー側のプログラム構成はこうなります。

サーブレットとJSPを役割分担させた構成

 さてサーブレットからJSPに制御を渡す方法にはforwardという方法とincludeという方法の2種類あります。その違いは

  • forward:制御がJSPに引き渡され、そこでサーバー処理が終了する
  • include:制御がJSPに渡りJSPの処理が終了後、再びサーブレットに制御が戻る
というものです。

 次ページではこの構成を実装するに必要な、これまで説明していなかった概念や方法について説明します。






このページの先頭  JAVA編先頭1  JAVA編先頭2  サーバーJava入門先頭

Copyright © 2011 yok. All Rights Reserved.