JSPにおけるMVC(Archi構造)

⚡ スマートサマリー

JSP の MVC はアプリケーションの関心をモデル、ビュー、コントローラーのレイヤーに分離し、JSP がビューをレンダリングし、サーブレットがコントローラーとして機能し、 JavaBeansは、クリーンでテストしやすく、保守しやすいWebアプリケーションのためのモデルをカプセル化します。

  • 🧱 関心事の分離: モデルはデータとビジネスロジックを保持し、ビューはUIをレンダリングし、コントローラーはそれらの間でリクエストをルーティングします。
  • 📐 JSPの役割: JSPページはビュー層に動的なマークアップをレンダリングし、サーブレットはコントローラー層でリクエスト処理を行います。
  • 🔀 リクエストフロー: ブラウザがフォームを送信すると、サーブレットが入力値を検証し、 JavaBeanは、応答のために制御をJSPビューに転送します。
  • 保守性の勝利: JSPにおけるMVCアーキテクチャは、Webアプリケーションの保守、拡張、単体テスト、および一元的なナビゲーションを容易にします。
  • 🧪 実例: ログインフォームはMvc_servletに送信され、Mvc_servletはメールアドレスとパスワードをTestBeanに保存し、その後mvc_success.jspに転送します。
  • 🤖 AIの近代化: AIアシスタントは、従来のJSP MVCコードをSpring MVCにリファクタリングし、必要に応じてコントローラー、DTO、テストを生成するのに役立ちます。

JSPにおけるMVC(Archi構造)

MVCとは何ですか?

MVCはModel-View-Controllerの略です。これは、アプリケーションをビジネスロジック、プレゼンテーション、データの3つの相互接続されたレイヤーに分割するソフトウェア設計パターンです。MVCでは、

  • M モデル
  • V View の略
  • C コントローラー

MVCは、ビュー層から処理の流れが始まる、体系的なアプリケーション構築手法です。ユーザーからのリクエストはコントローラー層で処理され、データの挿入または取得のためにモデル層に送信されます。モデルは成功または失敗のレスポンスを返し、ビューがそれをユーザーに表示します。MVCアーキテクチャの図を以下に示します。

MVC Archi構造
MVC Archi構造図

MVCを使う理由 ArchiJSPにおけるテクチュアとは?

ジャンプする前にping JSPにおけるMVCの仕組みを理解するには、開発者がこのパターンを採用する理由を理解することが重要です。単一のJSPページ内にビジネスロジック、データベース呼び出し、HTMLを混在させると、すぐに保守性の低いスパゲッティコードが生成されます。MVCは、それぞれの関心事を独自のレイヤーにすることで、この問題を解決します。

  • Code 各ファイルが単一の役割しか持たないため、読みやすくなる。
  • チームは、ビュー、コントローラー、モデルを競合することなく並行して作業できます。
  • 単体テストは、JSPレンダリングには一切手を加えず、モデルを直接対象とします。
  • Swapping JSONレスポンスや別のテンプレートエンジン用のJSPビューを作成するのは簡単です。

JSPにおけるMVCの仕組み

JSPベースのMVCアプリケーションでは、各レイヤーは特定の Java テクノロジー。JSP ファイルはビューをレンダリングし、サーブレットはコントローラーとして機能し、 JavaBeanはモデルをカプセル化します。以下のセクションでは、各レイヤーの役割について説明します。

モデルレイヤー

  • これは、システムのビジネスロジックを含むデータ層です。
  • これは、アプリケーションのすべてのデータで構成されています。
  • これはアプリケーションの状態も表します。
  • それは JavaBeansまたはPOJOは、 データベース.
  • コントローラーはモデルと通信してデータを取得し、それをビュー層に転送します。
  • モデルはデータベースに接続し、データをデータベースに永続化します。

レイヤーの表示

  • これはアプリケーションのプレゼンテーション層です。
  • HTML、JSP、CSS、および Java脚本。
  • 通常、アプリケーションのユーザーインターフェースを表示します。
  • これは、コントローラーから取得したデータを表示します。コントローラーは、モデル層のクラスからデータを取得します。
  • ビュー層は、ビジネスロジックを含まずに、アプリケーションのUI上にデータをレンダリングします。

コントローラ層

  • これは、ビューとモデルの間のインターフェイスとして機能します。
  • ビュー層から送られてくるすべてのリクエストを傍受します。
  • ビュー層からリクエストを受け取り、処理し、リクエストの検証を行います。
  • リクエストはデータ処理のためにモデル層に転送されます。リクエストが処理されると、モデルは必要な情報を含む結果をコントローラーに送り返し、ビューはその情報を表示します。

MVC の利点 Archi構造

MVC の利点は次のとおりです。

  • 維持しやすい
  • 拡張が簡単
  • テストが簡単
  • ナビゲーション制御は一元化されています
  • レイヤー間の結合度が低いほど、リファクタリングが安全になる
  • 複数のチームメンバーによる並行開発が可能

MVCを使用したJSPアプリケーションの設計例 Archi構造

この例では、JSPアプリケーションでMVCアーキテクチャを使用する方法を示します。

  • ここでは、ビュー層を表す「email」と「password」という2つの変数を持つフォームを例にとります。
  • ユーザーがメールアドレスとパスワードを入力して「送信」をクリックすると、アクションはMvc_servletに渡され、そこでメールアドレスとパスワードが渡されます。
  • Mvc_servletはコントローラー層です。Mvc_servletでは、リクエストはモデル層として機能するBeanオブジェクトに送信されます。
  • メールアドレスとパスワードの値はBeanに設定され、後で使用するために保存されます。
  • Beanから値が取得され、ビューレイヤーに表示されます。

Mvc_example.jsp (ビュー)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MVC Guru Example</title>
</head>
<body>
<form action="Mvc_servlet" method="POST">
Email: <input type="text" name="email">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

コードの説明:

レイヤーを表示:

Code 10〜15行目: ここでは、「email」と「password」という2つのフィールドをパラメータとして持つフォームを取り上げ、このリクエストをaction属性で渡されるコントローラMvc_servlet.javaに転送する必要があります。転送に使用されるHTTPメソッドはPOSTです。

Mvc_servlet.java(コントローラー)

package demotest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Mvc_servlet
 */
public class Mvc_servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Mvc_servlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String email=request.getParameter("email");
        String password=request.getParameter("password");

        TestBean testobj = new TestBean();
        testobj.setEmail(email);
        testobj.setPassword(password);
        request.setAttribute("gurubean",testobj);
        RequestDispatcher rd=request.getRequestDispatcher("mvc_success.jsp");
        rd.forward(request, response);
	}

}

コードの説明:

コントローラー層:

Code ライン14: Mvc_servlet は HttpServlet を継承しています。

Code ライン26: 使用されているメソッドは POST なので、リクエストはサーブレットの doPost メソッドに入り、リクエストが処理されて、testobj という名前で bean オブジェクトに保存されます。

Code ライン34: リクエストオブジェクトを使用して、「gurubean」という属性を設定し、その属性にtestobjの値を割り当てます。

Code ライン35: ここでは、RequestDispatcher オブジェクトを使用して、成功メッセージを mvc_success.jsp に転送しています。

TestBean.java(モデル)

package demotest;

import java.io.Serializable;

public class TestBean implements Serializable{

	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	private String email="null";
	private String password="null";


}

コードの説明:

モデルレイヤー:

Code 7〜17行目: これは、TestBeanクラスのメンバーであるメールアドレスとパスワードのゲッターとセッターを含んでいます。

Code 19〜20行目: これは、Beanクラス内でString型のメンバーのメールアドレスとパスワードを定義します。

Mvc_success.jsp(結果表示)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@page import="demotest.TestBean"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Success</title>
</head>
<body>
<%
TestBean testguru=(TestBean)request.getAttribute("gurubean");
out.print("Welcome, "+testguru.getEmail());
%>
</body>
</html>

コードの説明:

Code ライン12: サーブレットのdoPostメソッドで設定されたリクエストオブジェクトを使用して、属性を取得しています。

Code ライン13: Beanオブジェクトに保存されているウェルカムメッセージとメールアドレスを印刷しています。

出力

上記のコードを実行すると、次の出力が得られます。

mvc_example.jspを開くと、メールアドレスとパスワードの入力欄、そして送信ボタンが表示されたフォームが表示されます。

フォームにメールアドレスとパスワードを入力して「送信」をクリックすると、次のようになります。

JSPアプリケーションの設計

「送信」をクリックすると、以下のような出力が表示されます。

JSPアプリケーションの設計

画面上でメールアドレスとパスワードを入力して「送信」をクリックすると、その情報がTestBeanに保存されます。次の画面では、TestBeanからこれらの情報が取得され、成功メッセージが表示されます。 JSP データの表示とビューの提供の役割を果たす一方、サーブレットはコントローラーとして機能し、 JavaBeanはモデルとして機能します。主要なビジネスロジックはモデル層に含まれています。

よくあるご質問

JSPにおけるMVCは、Webアプリケーションを3つの層に分割する設計パターンです。モデル(データとビジネスロジック)、ビュー(UIをレンダリングするJSPページ)、コントローラー(リクエストを処理し、レスポンスをルーティングするサーブレット)です。

JSP は主にビュー層に属し、ユーザー向けに動的な HTML をレンダリングします。JSP モデル 2 パターンでは、サーブレットがコントローラーの役割を担い、 JavaBeans はモデルの役割を処理し、ping ビジネスロジックを含まないJSP。

モデル 1 では、ビジネス ロジック、データ アクセス、プレゼンテーションを JSP ページ内に直接配置します。モデル 2 は MVC に従います。サーブレットがコントローラーとして機能します。 JavaBeanはモデルを構成し、JSPファイルはビューをレンダリングします。モデル2が推奨されるアプローチです。

MVCは、保守性、テスト容易性、およびチームの生産性を向上させます。各レイヤーは独立して進化し、ビジネスロジックはJSPファイルから分離され、ナビゲーションはサーブレットに集約され、単体テストはWebコンテナを起動することなくモデルを網羅します。

ブラウザはフォームをサーブレットに送信します。サーブレットは入力を検証し、 JavaBeanを取得し、それをリクエスト属性として保存します。その後、制御をJSPページに転送し、JSPページはBeanを読み込んでレスポンスをレンダリングします。

AIコーディングアシスタントは、レガシーサーブレットやJSPファイルを分析します。tracクリーンなサービスにビジネスロジックを組み込み、Spring MVC コントローラーと DTO を生成し、 JUnit テストを実施することで、JSP Model 2から最新のフレームワークへの移行が加速され、手作業による書き換えが軽減されます。

AIツールがSpring MVCコントローラーをスキャフォールディングし、リクエストマップを生成するping検証アノテーションの提案、Thymeleafテンプレートの作成、統合テストの作成などを行います。また、CSRF保護の欠如やコントローラメソッドにおける安全でない入力処理といったセキュリティ上の問題も検出します。