1. 概要

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

実装に進む前に、MVCがどのように機能するか、およびその主要な機能について少し説明します。

2. MVCの概要

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

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

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

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

  • プレゼンテーション層をビジネス層から分離します
  • コントローラは、モデルを呼び出してデータをビューに送信するアクションを実行します
  • モデルは、一部のWebアプリケーションまたはデスクトップアプリケーションで使用されていることを認識していません。

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

2.1. モデルレイヤー

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

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

2.2. コントローラレイヤー

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

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

2.3. ビューレイヤー

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

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

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

S tudentServlet クラスはコントローラーとして機能し、プレゼンテーション層用に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<Student> 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();
        }
    }
}

次に、Controllerクラス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に転送します。

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

<html>
    <head>
        <title>Student Record</title>
    </head>
    <body>
    <% 
        if (request.getAttribute("studentRecord") != null) {
            Student student = (Student) request.getAttribute("studentRecord");
    %>
 
    <h1>Student Record</h1>
    <div>ID: <%= student.getId()%></div>
    <div>First Name: <%= student.getFirstName()%></div>
    <div>Last Name: <%= student.getLastName()%></div>
        
    <% 
        } else { 
    %>

    <h1>No student record found.</h1>
         
    <% } %>	
    </body>
</html>

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

4. 結論

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

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