JavaのMVCモデル

## 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/fab69d9b-b101-39e6-d3fc-34039b89b4ae.png)


## サンプルコード
**Webブラウザ**
![スクリーンショット 2023-01-08 15.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/e1630375-77ea-19e2-f6ed-e8485acb2b07.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」がリクエストとしてサーバーに送られる。
送り先は<form>タグの「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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/22664804-dbf5-3477-67e0-fa9d8e20852d.png)



## 参考記事

https://ryonotes.com/what-is-java-mvc/#:~:text=MVC%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81Web,Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E6%88%90%E3%82%8A%E7%AB%8B%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82

https://www.youtube.com/watch?v=cZvOAcAd1RE&list=PLru8-xuz0YvycnjfIkn8_Sqpe-n2_5xPN&index=14&t=235s