3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaのMVCモデル

Posted at

MVCモデルとは

MVCモデルとは、Webサーバ内のプログラムを、M(Model)、V(View)、C(Controller)の役割に分ける設計手法。
・Model:アプリケーションにおけるデータの保持や業務処理の実行などの処理ロジックを担当する、いわばシステムの本体部分にあたるモノ。モデルは入出力や表示といった処理を行うことはできない。
・View:表示処理や入出力処理などの画面表示の部分を担当。
・Controller:アプリケーションの実行の制御を担当。自分自身では表示を行ったり、ロジックの実行は行わず、リクエストからの入力に応じて、必要なロジックの実行をModelに依頼し、その結果表示をViewに依頼する。

開発する側としては「M」「V」「C」で分割されているため、開発作業の効率が高くなり、独立性が高いため他の要素とのやり取りが少なくすみ、依存性が抑えられる

JavaではModelはJavaのクラス(BeanやDaoなど)、ViewはJSP、ControllerはServlerがそれぞれ担当している

MVCの処理の流れ

・ブラウザからのリクエストがControllerに渡され、Modelに処理を依頼する。
・Modelがデータベースと通信してその処理結果をControllerに返す。
・ControllerからViewに処理結果を渡しその結果をレスポンスとしてユーザーが見ることができる
スクリーンショット 2023-01-08 13.22.28.png

サンプルコード

Webブラウザ
スクリーンショット 2023-01-08 15.16.30.png

Webブラウザのソースコード(html)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>登録画面</title>
</head>
<body>
  <h1>登録情報を入力してください</h1>
  <form action="/javaweb/register4" method="post">
  名前:<input type="text" name="name" size="10" /><br/>
  年齢:<input type="radio" name="age" value="child" />18歳未満 
        <input type="radio" name="age" value="adult" />18歳以上<br/>
  開発経験:<input type="checkbox" name="lang" value="Java" />Java 
        <input type="checkbox" name="lang" value="Python" />Python 
        <input type="checkbox" name="lang" value="JavaScript" />JavaScript<br/><br/>
  <input type="submit" value="送信" />
  </form>
</body>
</html>

このWebブラウザからは入力フォームやチェックボックスで入手された情報「name = "菅原",age = adult,lang = Java,Lang = Python」がリクエストとしてサーバーに送られる。
送り先は

タグの「action="/javaweb/register4"」で指定されているのでアノテーションでマッピングされているController(Servlet)に送られる
「method="post"」としているので指定先の「doPostメソッド」が呼び出される。
Controller(Servlet)
import bean.RegisterBean;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet("/register4")
public class RegisterServlet4 extends HttpServlet {
  public void doPost(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException {
    // リクエストの文字コードを指定
    req.setCharacterEncoding("utf-8");
    
    // 入力情報の取得
    String name = req.getParameter("name");
    String age = req.getParameter("age");
    String[] langs = req.getParameterValues("lang");
    res.setContentType("text/html;charset=utf-8");
    
    // JSPでも扱える様にBeanのオブジェクト作成
    RegisterBean rb = new RegisterBean();
    rb.setName(name);
    rb.setAge(age);
    rb.setLangs(langs);
    
    // Beanをリクエストに格納
    req.setAttribute("rb", rb);
    
    // register4.jspへフォワード
    RequestDispatcher rd = req.getRequestDispatcher("/register4.jsp");
    rd.forward(req, res);
  }
  public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws IOException, ServletException {
    doPost(req, res);
  }
}

Webブラウザからのリクエストでサーブレット内のdoPostメソッドが実行される
セッターメソッドを呼び出しブラウザから送られてきた情報「name = "菅原",age = adult,lang = Java,Lang = Python」をBeanのオブジェクトに格納している

メソッド内のRegisterBeanクラスは下記のBeanのクラスになる

Model(Javaのクラス(BeanやDaoなど))
package bean;

import java.io.Serializable;

public class RegisterBean implements Serializable{
  private String name;
  private String age;
  private String[] langs;

  public RegisterBean(){
  }
  
  public void setName(String name){
    this.name = name;
  }
  public void setAge(String age){
    this.age = age;
  }
  public void setLangs(String[] langs){
    this.langs = langs;
  }
  
  public String getName(){
    return name;
  }
  public String getAge(){
    return age;
  }
  public String[] getLangs(){
    return langs;
  }
  
  public String getJpnAge(){
    String jpnAge;
    if(age.equals("child")){
      jpnAge = "18歳未満";
    } else {
      jpnAge = "18以上";
    }
    return jpnAge;
  }
  public String getStrLangs(){
    String strLangs = "";
    for(int i = 0; i < langs.length; i++){
      strLangs = strLangs + langs[i] + " ";
    }
    return strLangs;
  }
}

Controllerに送られきた値を「setAttributeメソッド」でリクエストに格納し「forward(req, res)」でJSPに転送する
転送先の指定は「req.getRequestDispatcher("/register4.jsp");」の引数内の記述でしてしている

View(JSP)(register4.jsp)
<%@page contentType="text/html;charset=utf-8" %>
<jsp:useBean id="rb" scope="request" class="bean.RegisterBean" />
<html>
  <head>
    <title>確認画面</title>
  </head>
<body>
  <h2>入力情報を確認して登録ボタンを押してください</h2>
  氏名:<strong><jsp:getProperty name="rb" property="name" /></strong><br/>
  年齢:<strong><%= rb.getJpnAge() %></strong><br/>
  開発経験:<strong><%= rb.getStrLangs() %></strong><br/><br/>
<input type="submit" value="登録" />
<input type="reset" value="戻る" />
</body>
</html>

Controllerから転送されてきた情報がJSPに送られその結果をレスポンスとしてWebブラウザに表示する
スクリーンショット 2023-01-08 15.48.32.png

参考記事

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?