Java Servlet を利用した映画予約プラットフォームの設計と実装

システム概要

本システムは、インターネットを活用した映画館向けの予約管理プラットフォームです。従来の窓口での購入プロセスをデジタル化し、ユーザーがいつでもどこでも座席選択から決済までを行える環境を提供します。モバイルデバイスや PC からのアクセスに対応し、待ち時間の削減と運営側の効率的なリソース管理を実現することを目的としています。

アーキテクチャと技術スタック

本プロジェクトは、標準的な MVC(Model-View-Controller)パターンに基づいて設計されています。これにより、データ処理、ユーザーインターフェース、制御ロジックが明確に分離され、保守性および拡張性が向上しています。

  • バックエンド: Java Servlet を採用し、HTTP リクエストの処理とビジネスロジックの実行を担当します。
  • フロントエンド: JSP、CSS、JavaScript、jQuery を組み合わせ、動的なユーザーインターフェースを構築します。
  • データベース: MySQL を使用し、ユーザー情報、映画データ、予約記録などを関係型データベースとして管理します。

開発環境要件

本システムを構築および実行するための推奨環境は以下の通りです。

  • Java Development Kit: JDK 1.8
  • 統合開発環境: IntelliJ IDEA または Eclipse
  • アプリケーションサーバー: Apache Tomcat 7 以上 10 以下
  • データベース: MySQL 5.7 または 8.x
  • オペレーティングシステム: Windows

主要機能構成

システムは主に「管理者」と「一般ユーザー」の 2 つのロールに分かれており、それぞれ異なる権限と機能を持っています。

管理者機能

  • ユーザーアカウントの管理と監視
  • 映画情報の登録・編集・削除
  • 上映スケジュールおよび场次の管理
  • 劇場ホール(放映廳)の設定
  • ユーザーレビューの moderation
  • 予約オーダーの全体管理

一般ユーザー機能

  • アカウント登録およびログイン
  • 座席指定を含むチケット購入フロー
  • 映画への評論投稿および评分
  • 評価に基づくsorting機能
  • 個人の予約履歴管理

コア実装詳細

以下に、データベース接続管理およびユーザー認証処理に関する主要なコード実装例を示します。

データベース接続マネージャー

データベースとの接続を確立し、リソースの適切なクローズを保証するユーティリティクラスです。

package com.platform.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionManager {

    private static final String DB_URL = "jdbc:mysql://localhost:3306/cinema_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true";
    private static final String DB_USER = "admin";
    private static final String DB_PASS = "secret";

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    public static Connection acquireConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return connection;
    }

    public static void releaseResources(Connection connection, PreparedStatement statement, ResultSet resultSet) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    if (connection != null) {
                        connection.close();
                    }
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

ユーザー認証サーブレット

ログイン、登録、プロフィール更新などのユーザー関連リクエストを処理するコントローラーです。multipart/form-data による画像アップロードにも対応しています。

package com.platform.controller;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.alibaba.fastjson.JSON;
import com.platform.model.Member;
import com.platform.service.MemberService;
import com.platform.util.ConfigLoader;

@WebServlet("/account")
public class AccountServlet extends HttpServlet {

    private MemberService memberService;
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        memberService = new MemberService();
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        resp.setContentType("application/json; charset=utf-8");
        PrintWriter out = resp.getWriter();
        Map response = new HashMap<>();

        try {
            if ("signin".equals(action)) {
                authenticate(req, response);
            } else if ("signout".equals(action)) {
                terminateSession(req, response);
            } else if ("signup".equals(action)) {
                registerNewMember(req, response);
            } else if ("updateProfile".equals(action)) {
                updateMemberDetails(req, response);
            } else if ("changePassword".equals(action)) {
                updateCredential(req, response);
            } else if ("listMembers".equals(action)) {
                listAllMembers(req, response);
            } else if ("searchByName".equals(action)) {
                searchMembers(req, response);
            } else {
                handleFileUpload(req, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
            response.put("status", "error");
        }

        out.print(JSON.toJSONString(response));
    }

    private void authenticate(HttpServletRequest req, Map response) {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        Member member = memberService.verifyCredentials(username, password);
        
        if (member != null) {
            HttpSession session = req.getSession();
            session.setAttribute("currentUser", member);
            response.put("status", member.getRole() == 0 ? "user_ok" : "admin_ok");
            response.put("payload", member);
        } else {
            response.put("status", "invalid_credentials");
        }
    }

    private void terminateSession(HttpServletRequest req, Map response) {
        HttpSession session = req.getSession();
        session.removeAttribute("currentUser");
        response.put("status", "logged_out");
    }

    private void registerNewMember(HttpServletRequest req, Map response) {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        
        Member newMember = new Member();
        newMember.setUsername(username);
        newMember.setPassword(password);
        newMember.setEmail(email);
        newMember.setRole(0);

        List<Member> existing = memberService.findByUsername(username);
        if (!existing.isEmpty()) {
            response.put("status", "duplicate_user");
        } else {
            int result = memberService.createMember(newMember);
            response.put("status", result > 0 ? "created" : "failed");
        }
    }

    private void updateCredential(HttpServletRequest req, Map response) {
        HttpSession session = req.getSession();
        Member member = (Member) session.getAttribute("currentUser");
        String oldPass = req.getParameter("oldPassword");
        String newPass = req.getParameter("newPassword");

        if (member != null && member.getPassword().equals(oldPass)) {
            member.setPassword(newPass);
            memberService.updateProfile(member);
            session.removeAttribute("currentUser");
            response.put("status", "password_updated");
        } else {
            response.put("status", "verification_failed");
        }
    }

    private void searchMembers(HttpServletRequest req, Map response) {
        String keyword = req.getParameter("keyword");
        List<Member> results = memberService.findLikeUsername(keyword);
        
        response.put("code", 0);
        response.put("total", results.size());
        response.put("items", results);
    }

    private void handleFileUpload(HttpServletRequest req, Map response) throws Exception {
        Member member = new Member();
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        List<FileItem> items = upload.parseRequest(req);
        Map params = new HashMap<>();

        for (FileItem item : items) {
            if (!item.isFormField()) {
                String fileName = item.getName();
                if (fileName != null && !fileName.isEmpty()) {
                    String ext = fileName.substring(fileName.lastIndexOf("."));
                    String uniqueName = UUID.randomUUID().toString() + ext;
                    String uploadPath = ConfigLoader.get("storage_path") + "/avatars/" + uniqueName;
                    File dest = new File(uploadPath);
                    item.write(dest);
                    member.setAvatarUrl("/file/avatars/" + uniqueName);
                }
            } else {
                params.put(item.getFieldName(), item.getString("utf-8"));
            }
        }

        member.setId(Long.valueOf(params.get("id")));
        member.setUsername(params.get("username"));
        member.setEmail(params.get("email"));

        int result = memberService.updateProfile(member);
        if (result > 0) {
            response.put("code", 0);
            response.put("data", memberService.findById(member.getId()));
        } else {
            response.put("code", 500);
        }
    }

    private void listAllMembers(HttpServletRequest req, Map response) {
        int page = req.getParameter("page") != null ? Integer.parseInt(req.getParameter("page")) : 1;
        int limit = req.getParameter("limit") != null ? Integer.parseInt(req.getParameter("limit")) : 10;
        String keyword = req.getParameter("keyword") != null ? req.getParameter("keyword") : "";

        response.put("code", 0);
        response.put("total", memberService.countMembers(keyword));
        response.put("items", memberService.getMembersByPage(page, limit, keyword));
    }

    private void updateMemberDetails(HttpServletRequest req, Map response) {
        long id = req.getParameter("id") != null ? Long.parseLong(req.getParameter("id")) : 0;
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");

        Member member = new Member();
        member.setId(id);
        member.setUsername(username);
        member.setPassword(password);
        member.setEmail(email);

        int result = memberService.updateProfile(member);
        response.put("status", result > 0 ? "updated" : "failed");
    }
}

タグ: Java-Servlet mysql-database jsp-frontend mvc-pattern web-development

7月1日 20:34 投稿