ソフトウェア設計とパターン 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>
© Copyright 2024 Paperzz