サーブレットとJSPを使ったMVCの例

サーブレットとJSPを使用したMVCの例

1. 概要

この簡単な記事では、基本的なサーブレットとJSPを使用して、Model View Controller(MVC)デザインパターンを実装する小さなWebアプリケーションを作成します。

実装に進む前に、MVCの仕組みとその主要な機能について少し説明します。

2. MVCの概要

Model-View-Controller(MVC)は、アプリケーションロジックをユーザーインターフェイスから分離するためにソフトウェアエンジニアリングで使用されるパターンです。 名前が示すように、MVCパターンには3つの層があります。

モデルはアプリケーションのビジネス層を定義し、コントローラーはアプリケーションのフローを管理し、ビューはアプリケーションのプレゼンテーション層を定義します。

MVCパターンはWebアプリケーションに固有のものではありませんが、このタイプのアプリケーションに非常によく適合します。 Javaコンテキストでは、モデルは単純なJavaクラスで構成され、コントローラーはサーブレットで構成され、ビューはJSPページで構成されます。

パターンの主な機能は次のとおりです。

  • プレゼンテーション層とビジネス層を分離します

  • コントローラーは、モデルを呼び出してデータをViewに送信するアクションを実行します

  • モデルは、一部のWebアプリケーションまたはデスクトップアプリケーションで使用されていることを認識していません。

各レイヤーを見てみましょう。

2.1. モデル層

これは、システムのビジネスロジックを含むデータ層であり、アプリケーションの状態も表します。

プレゼンテーション層から独立しており、コントローラーはモデル層からデータをフェッチしてビュー層に送信します。

2.2. コントローラー層

コントローラーレイヤーは、ビューとモデルの間のインターフェイスとして機能します。 ビューレイヤーからリクエストを受信し、必要な検証などのリクエストを処理します。

要求はデータ処理のためにモデルレイヤーにさらに送信され、処理されると、データはコントローラーに送り返され、ビューに表示されます。

2.3. ビューレイヤー

この層は、アプリケーションの出力、通常は何らかの形式のUIを表します。 プレゼンテーションレイヤーは、コントローラーによって取得されたモデルデータを表示するために使用されます。

3. サーブレットとJSPを使用したMVC

MVCデザインパターンに基づいてWebアプリケーションを実装するために、StudentクラスとStudentServiceクラスを作成します。これらはモデルレイヤーとして機能します。

StudentServletクラスはコントローラーとして機能し、プレゼンテーション層用にstudent-record.jspページを作成します。

それでは、これらのレイヤーを1つずつ記述して、Studentクラスから始めましょう。

public class Student {
    private int id;
    private String firstName;
    private String lastName;

    // constructors, getters and setters goes here
}

次に、ビジネスロジックを処理するStudentServiceを記述します。

public class StudentService {

    public Optional getStudent(int id) {
        switch (id) {
            case 1:
                return Optional.of(new Student(1, "John", "Doe"));
            case 2:
                return Optional.of(new Student(2, "Jane", "Goodall"));
            case 3:
                return Optional.of(new Student(3, "Max", "Born"));
            default:
                return Optional.empty();
        }
    }
}

それでは、コントローラークラスStudentServletを作成しましょう。

@WebServlet(
  name = "StudentServlet",
  urlPatterns = "/student-record")
public class StudentServlet extends HttpServlet {

    private StudentService studentService = new StudentService();

    private void processRequest(
      HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

        String studentID = request.getParameter("id");
        if (studentID != null) {
            int id = Integer.parseInt(studentID);
            studentService.getStudent(id)
              .ifPresent(s -> request.setAttribute("studentRecord", s));
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher(
          "/WEB-INF/jsp/student-record.jsp");
        dispatcher.forward(request, response);
    }

    @Override
    protected void doGet(
      HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

        processRequest(request, response);
    }

    @Override
    protected void doPost(
      HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

        processRequest(request, response);
    }
}

このサーブレットは、Webアプリケーションのコントローラーです。

まず、リクエストからパラメータidを読み取ります。 idが送信されると、Studentオブジェクトがビジネス層からフェッチされます。

モデルから必要なデータを取得すると、setAttribute()メソッドを使用してこのデータをリクエストに入れます。

最後に、コントローラーは、アプリケーションのビューであるJSPへの要求オブジェクトと応答オブジェクトをforwardsします。

次に、プレゼンテーション層student-record.jspを記述しましょう。


    
        Student Record
    
    
    <%
        if (request.getAttribute("studentRecord") != null) {
            Student student = (Student) request.getAttribute("studentRecord");
    %>

    

Student Record

ID: <%= student.getId()%>
First Name: <%= student.getFirstName()%>
Last Name: <%= student.getLastName()%>
<% } else { %>

No student record found.

<% } %>

そしてもちろん、JSPはアプリケーションのビューです。 Controllerから必要なすべての情報を受け取ります。ビジネス層と直接対話する必要はありません。

4. 結論

このチュートリアルでは、MVCについて学習しました。 Model View Controllerアーキテクチャ。簡単な例を実装する方法に焦点を当てました。

いつものように、ここに示されているコードはover on GitHubにあります。