MVCモデルを用いた Webアプリケーション ソフトウェア設計とパターン

ソフトウェア設計とパターン
MVCモデルを用いた
Webアプリケーション
大規模ソフトウェア開発法
ソフトウェアの設計で優れたものを再利用
する
再利用可能な設計をパターンと呼ぶ
オブジェクト指向プログラミングでは使用す
る部品を再利用した
最近のソフトウェア開発方法論の流れ
新たに作ると不良が発生
良いものは再利用する
MVCモデル
MVCモデル
GUI(グラフィカルユーザインタフェース)を
持つソフトウェアのための標準的な設計パ
ターン
モデル,ビュー,コントロールの3つの要素
に分割してソフトウェアを設計する
要求
コントロール
ユーザ
(ブラウザ)
モデル
ビュー
結果の画面
MVCの例:ログイン処理の場合
コントロール
‒ ユーザからユーザ名とパスワードを受け取る
モデル
‒ ユーザ名とパスワードが正しいかどうかを確
認する
‒ ユーザ登録情報のデータベースはモデルの
一部
ビュー
‒ 認証結果の画面を生成する
Webアプリケーション
コントロール
ユーザからの要求を受け取る
モデルやビューをどのように使ってユーザ
の要求を処理するかを決定する
モデルやビューに作業の実行を依頼
Webアプリケーションの場合はサーブレット
として実装することが多い
モデル
ビュー
アプリケーション固有の処理を行う
アプリケーション固有のデータを保持する
Webアプリケーションの場合はサーブレット
やJSPではない通常のクラスとして実装す
ることが多い
モデルの処理結果をもとにユーザへ送る
画面を生成する
Webアプリケーションの場合はJSPやサー
ブレットとして実装することが多い
MVCを用いたログイン画面の例
MVCによるプログラムの構成
クライアント
login.html
Control
LoginServlet
名前とパスワード
Model
View
View
LoginModel
login-success.jsp
login-fail.jsp
login(名前,パスワード)
ログイン成功の場合
forward()
名前とパスワード
login(名前,パスワード)
ログイン失敗の場合
forward()
ファイルの配置の例
ホーム
webapp
login.html
jsp
login-success.jsp
login-fail.jsp
WEB-INF
classes
LoginServlet.java
LoginServlet.class
LoginModel.java
LoginModel.class
クライアントの login.html
<html>
<head><title>MVCサンプル</title></head>
<body><center>
<h2>ようこそ</h2>
<hr />
ユーザ名とパスワードを入力して下さい。<br /><br />
<form action="http://java/daikibo/servlet/LoginServlet" method="GET">
ユーザ名: <input type="text" name="name" /><br />
パスワード:<input type="password" name="password" /><br /><br />
<input type="submit" value="送信" />
</form>
</center></body>
</html>
コントロールのLoginServlet
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//フォームデータの取得
Modelの
String name = request.getParameter("name");
呼び出し
String password = request.getParameter("password");
// forwardの準備
ServletContext sc = getServletContext();
Viewの
// ユーザ認証
呼び出し
LoginModel model = new LoginModel();
if(model.login(name, password)) {
//ログイン成功
sc.getRequestDispatcher("/jsp/login-success.jsp").forward(request,response);
} else {
//ログイン失敗
sc.getRequestDispatcher(”/jsp/login-error.jsp").forward(request,response);
}
}
}
ログイン成功のJSP
login-success.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<% //フォームデータの取得
String name = request.getParameter("name");
%>
<html>
<head><title>ようこそ</title></head>
<body><center>
<h2><%= name %>さん</h2>
ログインありがとうございます。
</center></body>
</html>
サーブレットからJSPの呼び出し
クライアントからのリクエストをJSPに転送
するという形で記述する.
// forwardの準備
ServletContext sc = getServletContext();
転送先のJSP
のアドレス
// リクエストの転送
sc.getRequestDispatcher("/jsp/login-success.jsp”).forward(request,response);
各自のwebapp
ディレクトリからの
相対位置を指定
ModelのクラスLoginModel
public class LoginModel {
private String[] name = { "鈴木", "朝倉", "山口" };
private String[] password = { "ichiro", "keita", "kumiko" };
public boolean login(String myName, String myPassword) {
for(int i=0; i<name.length; i++) {
// 名前を検索
if(name[i].equals(myName)) {
// パスワードをチェック
if(password[i].equals(myPassword)) return true;
}
}
return false;
}
}
ログイン失敗のJSP
login-error.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<% //フォームデータの取得
String name = request.getParameter("name");
%>
<html>
<head><title>ログインエラー</title></head>
<body><center>
<h2><%= name %>さん</h2>
ユーザ名かパスワードに誤りがあります。
</center></body>
</html>