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

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. コントローラレイヤ

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

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

2.3. ビューレイヤ

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

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

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

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();
        }
    }
}

それでは、コントローラクラス 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() メソッドを使用してこのデータをリクエストに入れます。

最後に、Controllerはリクエストとレスポンスのオブジェクトを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アーキテクチャについて学び、簡単な例を実装する方法に焦点を当てました。

いつものように、ここに提示されたコードはhttps://github.com/eugenp/tutorials/tree/master/javax-servlets[over on GitHub]にあります。