はじめに
MVCモデルとは、 Model 、 View Controller の3つの単語の頭文字から取られたものです。
もう気づいた方もいるでしょうか・・・?
実は、スキルチェック2は、このMVCモデルで作られていたのです。
なので、すでに身をもってMVCモデルを体感しています。
習ってなくてもできた?
このMVCモデルというのはシステムを作る上での単なる、 概念 (考え方)の領域だからです。
この考え方を、エンジニア全員が共通認識として持つことで、いわゆる話が早くなります。
極端な例にはなりますが、 あなたが現場でModelを作ってと言われればModelの役割の担うコーディングをすればOKなのです。
もっともメジャーな概念がMVCモデルということですね。
この章で、さらにMVCモデルという考え方に慣れて行きましょう!
※以下、説明に出てくるソースは、 SC2-Aを例にしておりますので、お忘れなく
Step1: MVCモデルの概要
基本的な動作、 業務上の処理を行う部分を Model が受け持ち、ユーザインタフェース部分を View が受け持ちこれらのやり取りを制御するのが Controller です。
と言われてもパッとしないですね。
スキルチェック3で使ったソースも含めて、 MVCの相関図を以下の画像にまとめてみました。
プログラムの大きな流れも1〜8まであるので、順を追って確認してみると、さらにイメージがつきやすいと思います。
しっくりきたでしょうか….?
一度、MVCモデルを触っているので、この構造の理解については問題ないと思います。
では、なぜMVCモデルでシステムを構築しなくてはならないのでしょうか?
その大きな理由として、2つのことが考えられます。
理由①:生産性の向上
ModelをViewやControllerから密接な結びつきがないよう完全に切り離すことにより、異なるWebアプリケーションでも使いまわすことが可能です。 同じようなロジックを、ゼロから記述しなくて済みます。
例えば、3か月費やして完成させた社員情報システム処理があったとします。
他の案件で似たようなものを作ってほしいとお願いされた時、そのModelを流用しちょっと手を加えるだけでクリアできてしまう。 なんていうことが可能になります。
理由② : メンテナンス性の向上
MVCモデルは、 Model、 View Controllerを分割することで、それぞれの独立性を高めます。
独立性が高まれば、 修正や追加機能といった要求に対して容易かつ柔軟に対応することが可能です。
そのため、メンテナンス性の向上が図れます。
概要としては、 以上になります。
それでは、Model、 View、 Controllerそれぞれについて、詳しく見ていきましょう。
Step2: Model
EmployeeBean として一つファイルを設けたかと思います。
実はファイル名を Bean としたことにも意味があります。
Bean とは、ViewやControllerとは関係のないものであり、Java言語で作成された普通のクラスのことです。
それぞれの実際の部品化 (コンポーネント化)したもの1個単位を単にBean と呼ぶこともあります。
そのような名前の由来は、Javaのコーヒー豆という意味でBean (豆) という言葉を掛け合わせたものです。
総称して JavaBeans と呼んでいます。
それでは、 Employee Bean の中身を見ていきましょう。
JavaBeans の仕様は、あらかじめ規約が定められています。
例えば、JSPから利用されるJavaBeans (Bean) として成立するためには、外部からアクセスされるフィールドに対してアクセッサメソッドを持つことです。
セッターメソッド
フィールドの値を設定するためのアクセッサメソッド、「setフィールド名」 という形で記述します。
ゲッターメソッド
フィールドの値を取得するためのアクセッサメソッド、 「getフィールド名」という形で記述します。
EmployeeBean クラスは、 Id Password Name Comment Login_Time というフィールドがありますが、それぞれのフィールドには値を設定または取得するための setId()、 getId() というアクセッサメソッドを定義しています。
このようにして、セッター、ゲッターを設けることが、JavaBeans (Bean) の決まりごとの一つとして定められています。
ビジネスロジック
MVCの中には、ビジネスロシックという部類があります。
SC2 だと、 EmployeeService がそれに該当します。
ビジネスロジックとは、 実際の業務にあたる部分です。
Employeeservice の場合、「特定のユーザを探し、 ヒットすればユーザー情報を提供し、 その時間を記録する」 という処理が流れているわけですが、これは本来人が仕事として論理的に(業務のルールに従って) 裁かなくてはなりません。
このようにして、人の業務を担うロジックことをビジネスロジックと呼んでいます。
ファイル名に関しても、 〇〇〇〇〇 Service とすることが基本です。
EmployeeServiceクラスはsearch() メソッドにより、ユーザID(id)とパスワード (password)を条件にして合致するものが、任意のデータベースのテーブルにあるかないかを判別する処理を行っています。
合致するものがあれば employeeData にテーブルの値を格納し、なければemployeeData を null で返す。
というようなロジックになっています。
このようなクラス (ビジネスロジック) も Model という枠の中に入ってきます。
理由としては、ビジネスロジックとして再利用可能な部品なので、ViewやControllerとは関係のないもの、つまり JavaBeans という位置づけになるからです。
補足
・null による初期化
Bean のような、インスタンスを生成する必要があるクラスオブジェクトを最終的にViewへ返すようなロジックにおいては、Beanを null で初期化しておくことが多いです。
また、 nullで初期化することによりプログラム実行時に余計なメモリを使用することを避けています。
(検索結果として表示データが無い場合に、インスタンスを生成していてもメモリを無駄に消費することを回避する意図が あります。)
加えて、今回は社員情報という1つの情報を丸っとViewへ返す作りとしているため、View側で最低限の表示ロジックを組むにあたっての判断材料 (if (employeeBean != null) の部分)としています。 (※詳細は Step3: View にて解説します。)
Step3: View
wiki3-2でJSP について学びましたが、MVCモデルにおいての JSP の役割は、ブラウザに表示するためのものです。
そのため、JSPには表示するための簡単なロジックが少しあるにせよ、制御ロジックやビジネスロジックなどは無いようにします。
まず、 EmployeeController からの指示を受け取ります。
EmployeeController から渡ってきたデータが employeeBean に値が格納されるわけですが、その値を使って条件分岐します。
条件は二つです。
条件1 : nullではない
nullではないつまり、 検索条件に合致したデータが存在し、テーブルのデータを取得できているはずなので、getメソッドを用いて取得データの値を表示します。
条件2 : nullだった場合
nullだった、つまりテーブルに条件と合致したデータがなかったので、その旨を表す文言を表示する。
今回の場合は、 IDもしくはパスワードが間違ってますとしてます。
このようにして、MVC構造においての JSP はとってもシンプルなものになります。
Step4 : Controller
最後は、Controller についてです。
図とシーケンス表をもとに、 順を追ってみていきましょう。
シーケンス1 : ユーザーの要求 (入力やボタン操作等)
ユーザーが画面にて、任意の情報を入力する
シーケンス2 : ①の要求に沿って処理
EmployeeController が任意の情報をキャッチ
ユーザーからの入力情報を、 パラメーターとして受け取ります。
シーケンス3:要求ごとの処理 (入力チェックや呼び出す処理の選定)
EmployeeController が任意のユーザー情報をもとに、社員情報の照会をする必要があるためEmployeeService の search メソッドの呼び出す。
シーケンス4: Service よりSQLを実行
ビジネスロジックである、Employee Service が仕事を開始する。
まずは、SQLに問い合わせる。
シーケンス5: 実行結果を返却しBean へ格納
ヒットしたので、SQLの値を employeeData に見繕って EmployeeController 返してあげる。
search メソッドの戻り値が employeeData というのもポイントです。
シーケンス6: ③の要求に基づいて結果を返す
searchメソッドの戻り値が employeeData (SQLの結果が格納されている変数)なので、
それを employeeBean に格納。
シーケンス7 : jspに結果を返す (③ or ⑥の結果)
JSP結果を返す値を準備。
キーは”EmployeeBean” として、値はSQLの値が格納されている employeeBean となる。
渡したいJSPを指定する。
シーケンス8: 受け取った結果を元に画面へ表示
よって、index.jspが受け取った値を表示することが可能になる。
このように、 MVCモデルにおいての Controller は、ユーザー、 Model View の仲介役になっています。
まさに、システムを Controlしているわけですね。
Step5 総括
基本はMVC
MVCモデルのつながりについて一通りは説明してきましたが、 実際にプログラミングしていくと大変難しいと思います。
また最初のTOPページがhtmlであったり、JSPであったりすると少し難易度が上がりますし、 複数ページが遷移する場合などはとても難しく感じると思われます。
しかし、 複数ページが遷移する場合でも基本的なMVCモデルのつながりは同じです。
プログラムの流れを理解しそれぞれの役割を把握することで、 どこにどんな処理が必要なのかが見えてきます。
そんなことを意識しながら、これからの課題を進めて行きましょう。
