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に処理結果を渡しその結果をレスポンスとしてユーザーが見ることができる
サンプルコード
<!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」がリクエストとしてサーバーに送られる。
送り先は
「method="post"」としているので指定先の「doPostメソッド」が呼び出される。
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のクラスになる
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");」の引数内の記述でしてしている
<%@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ブラウザに表示する
参考記事