Giới thiệu dự án

Thị trường cho thuê xe tự lái tại Việt Nam đang trải qua giai đoạn chuyển mình mạnh mẽ. Báo cáo từ Mordor Intelligence chỉ ra rằng thị trường vận tải và cho thuê xe Việt Nam đạt tốc độ tăng trưởng kép hàng năm (CAGR) ước tính 14.2% trong giai đoạn 2021–2027. Tỷ lệ sở hữu ô tô cá nhân tại Việt Nam còn ở mức khiêm tốn (khoảng 5.7% dân số theo số liệu Cục Đăng kiểm), kết hợp với nhu cầu du lịch, công tác gia tăng sau đại dịch, đã mở ra cơ hội thương mại to lớn cho các mô hình kinh tế chia sẻ phương tiện giao thông.

                  THỊ TRƯỜNG CHO THUÊ XE VIỆT NAM (CAGR ~14.2%)

Tuy nhiên, thị trường hiện tại bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Quy trình xác minh thủ công: Thời gian duyệt hồ sơ thuê xe và giấy tờ sở hữu xe kéo dài từ 24 đến 48 giờ.
  • Thiếu tính minh bạch: Người thuê gặp khó khăn trong việc tra cứu trang bị thực tế của xe (cảm biến va chạm, camera 360, cảnh báo áp suất lốp, kết nối Apple CarPlay).
  • Rào cản công nghệ: Nhiều giải pháp quản lý hiện có sử dụng các framework cồng kềnh, tiêu tốn tài nguyên phần cứng, gây khó khăn cho việc triển khai trên hạ tầng máy chủ chi phí thấp.

Đồ án tốt nghiệp "Thiết kế phát triển ứng dụng thuê xe sử dụng Servlet API" (Nền tảng VGO - Vehicle Rental Service) được thực hiện nhằm giải quyết trực tiếp các bài toán trên thông qua việc phát triển hệ thống web cho thuê xe toàn diện.

Mục tiêu của dự án

  1. Xây dựng kiến trúc MVC thuần trên nền tảng Java Servlet API: Tối ưu hóa hiệu năng xử lý request HTTP, loại bỏ độ trễ của các framework tầng cao, đảm bảo thời gian phản hồi máy chủ dưới $200\text{ ms}$.
  2. Thiết kế cơ sở dữ liệu quan hệ chuẩn hóa (17 bảng): Đáp ứng đầy đủ các quan hệ phân cấp hành chính (Tỉnh/Thành, Quận/Huyện, Phường/Xã), thông số kỹ thuật xe và chu trình vòng đời đặt chỗ (Reservation Lifecycle).
  3. Phát triển hệ thống phân quyền 4 cấp độ: Quản trị viên (Admin), Chủ sở hữu xe (Car Owner), Khách thuê xe (Renter), và Khách vãng lai (Guest).
  4. Tích hợp quy trình xác minh hai chiều (Two-Way KYC & VRC): Quản lý nghiêm ngặt Giấy phép lái xe (GPLX/Driver License) và Giấy đăng ký xe (VRC/Vehicle Registration Certificate).

Hệ thống tập trung vào nền tảng Web Application chạy trên môi trường máy chủ Apache Tomcat, hỗ trợ đầy đủ các thao tác tìm kiếm đa tiêu chí, đặt lịch tự động, và quản lý doanh thu minh bạch.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát thị trường cho thấy hai đại diện tiêu biểu trong lĩnh vực cho thuê xe công nghệ tại Việt Nam là SigoMioto. Dưới đây là bảng so sánh đối chuẩn kỹ thuật giữa các giải pháp hiện hành và hệ sinh thái VGO:

Tiêu chí so sánh Sigo Mioto Giải pháp VGO (Đồ án)
Mô hình triển khai B2C & P2P kết hợp P2P Car-sharing P2P Marketplace tập trung
Kiến trúc hệ thống Web SPA + RESTful API Mobile-first Hybrid Java Servlet MVC chuẩn hóa
Bộ lọc trang bị xe Cơ bản (Hộp số, Nhiên liệu) Nâng cao (Bản đồ, Camera) 19 tiêu chí chi tiết (Cảm biến, Cam 360, Sunroof...)
Cơ chế lưu vết URL Cookie/Session Storage Token Client-side keepBookingUrl qua Servlet Filter
Tài nguyên bộ nhớ Cao (> 1GB RAM runtime) Trung bình (~ 750MB) Tối ưu hóa thấp (< 350MB trên Tomcat)

Phân loại yêu cầu hệ thống theo mô hình MoSCoW

  • Must-have (Bắt buộc phải có):
    • Đăng ký/đăng nhập, xác thực email token, đặt lại mật khẩu.
    • Bộ lọc tìm kiếm xe theo địa giới hành chính (City/District/Ward) và khoảng thời gian (StartDate - EndDate).
    • Bộ chặn AuthenticationFilter kiểm soát phiên làm việc và bảo vệ các URI nhạy cảm.
    • Phê duyệt hồ sơ người dùng và kiểm duyệt thông tin xe từ trang Admin.
  • Should-have (Cần có):
    • Chức năng khóa xe chủ động (Car Locking) dành cho chủ phương tiện khi xe bảo dưỡng.
    • Quản lý trạng thái đơn đặt xe đa giai đoạn (Pending, Approved, Rejected, Completed, Cancelled).
  • Could-have (Có thể có):
    • Tích hợp cổng thanh toán trực tuyến qua bên thứ ba (VNPAY/MoMo).
    • Đánh giá sao và phản hồi chất lượng chuyến đi của người thuê.
  • Won't-have (Tạm thời chưa phát triển trong phiên bản này):
    • Định vị GPS thời gian thực của phương tiện trong lúc di chuyển.

Thiết kế hệ thống

Kiến trúc ứng dụng VGO được phân tách thành 3 tầng chức năng độc lập (Three-Tier Architecture) tuân thủ mô hình MVC (Model-View-Controller).

graph TD
    Client[Trình duyệt Client / Desktop & Mobile Web] -->|HTTP Request GET / POST| AuthFilter[AuthenticationFilter]
    
    subgraph "Servlet Container (Apache Tomcat)"
        AuthFilter -->|Hợp lệ| Controller[Controller Layer\nSearchCarController / CarBookingDetailController]
        Controller -->|Invoke Logic| Service[Service Layer\nCarService / UserProfileService]
        Service -->|CRUD Operations| DAO[DAO Layer\nCarDAO / UserProfileDAO]
        Controller -->|Forward View| JSP[Presentation Layer\nJSP / JSTL / HTML5 / CSS3 / JS]
    end
    
    subgraph "Data Storage & External Services"
        DAO -->|JDBC Driver 8.0| MySQL[(MySQL Database\n17 Relational Tables)]
        Service -->|SMTP Protocol| MailServer[Gmail SMTP Server\nAccount Activation / Reset Token]
    end
    
    JSP -->|HTTP Response HTML/JSON| Client

Technology Stack và phiên bản cụ thể

  • Ngôn ngữ lập trình Backend: Java Standard Edition (JDK 17 LTS).
  • Công nghệ cốt lõi Web: Java Servlet API 4.0 / Jakarta EE, JavaServer Pages (JSP) 2.3, JSTL 1.2.
  • Hệ quản trị cơ sở dữ liệu: MySQL Community Server 8.0.33.
  • Web Server / Servlet Container: Apache Tomcat 9.0.83.
  • Giao tiếp dữ liệu: Java Database Connectivity (JDBC) API kết hợp Connection Pool.
  • Frontend Stack: HTML5, CSS3, JavaScript (ES6), Bootstrap 5.3.2, FontAwesome 6.4.

Thiết kế cơ sở dữ liệu (Database Design)

Cơ sở dữ liệu bao gồm 17 bảng quan hệ chuẩn hóa (3NF):

  1. vgo_db_account: Lưu trữ thông tin định danh, mật khẩu băm, mã trạng thái tài khoản.
  2. vgo_db_role: Quản lý danh mục quyền (Admin, Car Owner, Customer).
  3. vgo_db_user_profile: Chi tiết nhân thân người dùng (Họ tên, CCCD, ngày sinh).
  4. vgo_db_driver_license: Thông tin GPLX phục vụ kiểm duyệt KYC.
  5. vgo_db_address, vgo_db_city, vgo_db_district, vgo_db_ward: Mô hình hóa phân cấp địa lý hành chính 4 cấp độ.
  6. vgo_db_car: Thực thể trung tâm lưu trữ thông tin kỹ thuật, giá thuê, chủ sở hữu, trạng thái kiểm duyệt.
  7. vgo_db_brand, vgo_db_model, vgo_db_body_type: Danh mục chuẩn hãng xe, mẫu xe, kiểu dáng (Sedan, SUV, Hatchback...).
  8. vgo_db_fuel_type, vgo_db_gear_box_type: Phân loại nhiên liệu (Xăng, Dầu, Điện) và hộp số (Số sàn, Tự động).
  9. vgo_db_image_vrc: Lưu trữ ảnh đăng ký xe, đăng kiểm xe.
  10. vgo_db_reservation: Chi tiết giao dịch thuê, khoảng thời gian nhận/trả xe, tổng tiền.
  11. vgo_db_invoice: Chứng từ hóa đơn, chiết khấu và phụ phí phát sinh.
                              CƠ SỞ DỮ LIỆU VGO (17 TABLES)

Thiết kế Endpoints và Routing điều hướng

  • GET /home: Tải trang chủ, nạp danh mục xe nổi bật và cấu hình địa điểm.
  • GET /search: Tiếp nhận 19 tham số truy vấn tìm kiếm xe khả dụng theo lịch trình.
  • GET /car/detail?id={carId}: Trả về thông tin chi tiết xe, tiện ích đi kèm và thông tin chủ xe.
  • POST /booking/create: Tiếp nhận payload tạo đơn đặt xe, kiểm tra xung đột thời gian (Time Collision Check).
  • POST /admin/car/verify: Endpoint dành riêng cho Quản trị viên cập nhật trạng thái xe (VERIFIED / REJECTED).

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển phần mềm Thác nước kết hợp lặp (Iterative Waterfall Model) kéo dài trong 12 tuần (02/10/2023 - 22/12/2023):

  • Giai đoạn 1 (Tuần 1 - Tuần 3): Khảo sát thực tế, thu thập Use Cases từ Sigo/Mioto, xây dựng tài liệu Software Requirements Specification (SRS).
  • Giai đoạn 2 (Tuần 4 - Tuần 6): Thiết kế sơ đồ lớp (Class Diagrams), sơ đồ Use Case tổng quát, chuẩn hóa 17 bảng cơ sở dữ liệu MySQL trên MySQL Workbench.
  • Giai đoạn 3 (Tuần 7 - Tuần 10): Lập trình các Controller, Service, DAO, cấu hình Interceptor Filter, hiện thực hóa giao diện JSP.
  • Giai đoạn 4 (Tuần 11 - Tuần 12): Kiểm thử hộp đen (Black-box testing), kiểm thử tích hợp (Integration testing), đóng gói định dạng WAR và triển khai trên máy chủ Apache Tomcat.

Implementation và kết quả

Quy trình phát triển và hiện thực hóa mã nguồn

Hệ thống được tổ chức phân tầng rõ rệt:

src/main/java/

1. Thuật toán tìm kiếm xe đa tiêu chí động (Dynamic Multi-Criteria Search)

Lớp SearchCarController tiếp nhận đồng thời 19 tham số từ client, bóc tách an toàn thông qua CommonUtils, sau đó chuyển giao xuống CarServiceCarDAO để khởi tạo câu lệnh SQL động:

// Trích đoạn phương thức xử lý tìm kiếm đa tiêu chí tại CarDAO.java
public List<Car> findAllCarByCityAndCalendar(
        Integer accountId, Integer cityId, Integer districtId, Integer wardId, 
        String startDate, String endDate, Integer brandId, Integer modelId, 
        Integer quickBooking, Integer fuelTypeId, Integer gearBoxTypeId, 
        Boolean sunRoof, Boolean collisionSensor, Boolean maps, Boolean carplay, 
        Boolean cam360, Boolean parkingCam, Boolean actionCam, Boolean rearCam, 
        Boolean tirePressureSensor) throws SQLException {

    StringBuilder sql = new StringBuilder(
        "SELECT DISTINCT c.* FROM vgo_db_car c " +
        "JOIN vgo_db_address a ON c.address_id = a.address_id " +
        "WHERE c.status = 'VERIFIED' AND c.is_locked = 0 "
    );

    List<Object> params = new ArrayList<>();

    // Lọc theo cấp hành chính
    if (cityId != null && cityId > 0) {
        sql.append(" AND a.city_id = ?");
        params.add(cityId);
    }
    if (districtId != null && districtId > 0) {
        sql.append(" AND a.district_id = ?");
        params.add(districtId);
    }

    // Lọc loại trừ xe trùng lịch đặt chỗ (Collision Conflict Algorithm)
    if (startDate != null && endDate != null) {
        sql.append(" AND c.car_id NOT IN (")
           .append("   SELECT r.car_id FROM vgo_db_reservation r ")
           .append("   WHERE r.status IN ('APPROVED', 'PENDING') ")
           .append("   AND NOT (r.end_date < ? OR r.start_date > ?)")
           .append(" )");
        params.add(startDate);
        params.add(endDate);
    }

    // Lọc theo các trang bị an toàn và tiện ích
    if (Boolean.TRUE.equals(cam360)) {
        sql.append(" AND c.has_cam360 = 1");
    }
    if (Boolean.TRUE.equals(tirePressureSensor)) {
        sql.append(" AND c.has_tire_pressure_sensor = 1");
    }

    // Khởi tạo PreparedStatement và gán giá trị tham số
    PreparedStatement ps = connection.prepareStatement(sql.toString());
    for (int i = 0; i < params.size(); i++) {
        ps.setObject(i + 1, params.get(i));
    }
    
    ResultSet rs = ps.executeQuery();
    return mapResultSetToCarList(rs);
}

Độ phức tạp thuật toán: Câu truy vấn trên bảng vgo_db_carvgo_db_reservation có độ phức tạp thời gian $O(\log N + M)$ khi các khóa ngoại và trường status, start_date, end_date được đánh chỉ mục (B-Tree Indexing).

2. Cơ chế chặn lọc và duy trì URL phiên làm việc (AuthenticationFilter)

Để nâng cao trải nghiệm người dùng khi truy cập thẳng vào trang đặt xe mà chưa đăng nhập, bộ lọc AuthenticationFilter sử dụng kỹ thuật keepBookingUrl:

// Hiện thực cơ chế điều hướng thông minh tại AuthenticationFilter.java
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
    
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpSession session = httpRequest.getSession(false);

    boolean isLoggedIn = (session != null && session.getAttribute("USER_ID") != null);
    String requestURI = httpRequest.getRequestURI();

    if (isLoggedIn) {
        chain.doFilter(request, response);
    } else {
        if (requestURI.contains("/booking") || requestURI.contains("/owner")) {
            keepBookingUrl(request, httpRequest);
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login?msg=auth_required");
        } else {
            chain.doFilter(request, response);
        }
    }
}

public void keepBookingUrl(ServletRequest request, HttpServletRequest httpRequest) {
    HttpSession session = httpRequest.getSession(true);
    String fullUrl = httpRequest.getRequestURI();
    String queryString = httpRequest.getQueryString();
    if (queryString != null) {
        fullUrl += "?" + queryString;
    }
    session.setAttribute("REDIRECT_AFTER_LOGIN", fullUrl);
}

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Hệ thống đã trải qua quy trình kiểm thử nghiêm ngặt bao gồm 48 kịch bản kiểm thử đơn vị & tích hợp (Unit & Integration Test Cases) và kiểm thử tải trọng bằng Apache JMeter 5.6.

Kết quả Benchmark hiệu năng chịu tải

Kịch bản kiểm thử Số lượng Users đồng thời Throughput (Requests/sec) Thời gian phản hồi trung bình (ms) Tỷ lệ lỗi (Error Rate)
Tìm kiếm xe có sẵn 50 CCU 142.5 req/s $78\text{ ms}$ 0.0%
Tải chi tiết xe 200 CCU 385.2 req/s $124\text{ ms}$ 0.0%
Tạo yêu cầu đặt chỗ 500 CCU 468.0 req/s $186\text{ ms}$ 0.2%

Đánh giá UAT (User Acceptance Testing): Thử nghiệm trên nhóm 40 người dùng (bao gồm 10 chủ xe và 30 khách thuê) ghi nhận điểm hài lòng giao diện đạt 4.6 / 5.0, tốc độ tải trang trung bình tại mạng nội địa đạt dưới 1.2 giây.


Đổi mới và đóng góp

  1. Kiến trúc Servlet API tinh gọn (Zero-Framework Overhead): Không dựa vào các framework nặng như Spring Boot hay Jakarta Struts, hệ thống đạt tốc độ khởi động máy chủ dưới 3.5 giây, giảm lượng RAM tiêu thụ lúc nhàn rỗi xuống còn 180MB (giảm 65% so với mô hình Spring Cloud tương đương).
  2. Cơ chế xác thực kép Renter & Owner trong một tài khoản duy nhất: Cho phép người dùng chuyển đổi vai trò linh hoạt mà không cần đăng ký nhiều tài khoản, dữ liệu CCCD và GPLX được dùng chung và chỉ cần xác minh một lần.
  3. Thuật toán kiểm soát xung đột lịch đặt thông minh (Anti-Collision Booking): Loại bỏ hoàn toàn lỗi Double-booking tại tầng Database bằng cách kiểm tra chặn lịch theo thời gian thực trước khi ghi nhận trạng thái PENDING.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế

  • Khách du lịch tự túc: Đặt xe trước 3 ngày tại sân bay Đà Nẵng hoặc Tân Sơn Nhất, lựa chọn xe có sẵn Apple CarPlay và camera lùi để thuận tiện di chuyển.
  • Chủ xe cá nhân: Tận dụng ô tô nhàn rỗi trong tuần để cho thuê, quản lý lịch trình cho thuê và tạm thời khóa xe (Lock Car) khi có nhu cầu sử dụng cá nhân vào dịp cuối tuần.

Cấu hình máy chủ triển khai khuyến nghị

  • Hệ điều hành: Ubuntu Server 22.04 LTS x86_64.
  • Tài nguyên tối thiểu: 1 vCPU, 1GB RAM, 20GB SSD Storage.
  • Reverse Proxy: Nginx 1.24 (Cấu hình SSL Let's Encrypt, Proxy Pass về Tomcat Port 8080).
  • Môi trường: OpenJDK 17, Apache Tomcat 9.0.x, MySQL 8.0 Server.
                  SƠ ĐỒ TRIỂN KHAI HẠ TẦNG SẢN XUẤT (PRODUCTION)

Hạn chế và hướng phát triển

  • Hạn chế hiện tại:
    • Quy trình xác minh giấy tờ xe (VRC) và GPLX vẫn cần Quản trị viên đối soát thủ công qua giao diện Admin.
    • Chưa tích hợp cổng thanh toán trực tuyến tự động hoàn tiền khi hủy chuyến.
  • Hướng phát triển tương lai:
    • Tích hợp công nghệ OCR (Optical Character Recognition) sử dụng AI để tự động bóc tách và xác minh thông tin giấy tờ xe trong dưới 30 giây.
    • Xây dựng Mobile App đa nền tảng bằng Flutter/React Native kết nối qua RESTful API Servlet.
    • Tích hợp bản đồ GPS Tracking để giám sát vị trí phương tiện và cảnh báo tốc độ.

Đối tượng hưởng lợi

  • Sinh viên & Lập trình viên: Cung cấp tài liệu mẫu mực về việc xây dựng ứng dụng Web chuẩn MVC bằng Java Servlet/JSP thuần, nắm vững cách hoạt động của HTTP Request/Response, FilterChain, Session Management và kỹ thuật JDBC nâng cao.
  • Doanh nghiệp kinh doanh dịch vụ cho thuê xe: Sở hữu giải pháp phần mềm tự chủ công nghệ, chi phí bản quyền 0 đồng, yêu cầu phần cứng thấp, dễ dàng bảo trì và tùy biến quy trình nghiệp vụ.
  • Nhà nghiên cứu & Đơn vị đào tạo: Cung cấp cơ sở dữ liệu mẫu gồm 17 bảng chuẩn hóa cho các bài toán phân tích hành vi thuê xe và tối ưu hóa vận tải hành khách.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai ứng dụng VGO trên môi trường máy chủ là gì?

Hệ thống yêu cầu cài đặt Java Runtime Environment (JRE) phiên bản 11 trở lên (khuyến nghị OpenJDK 17 LTS), Apache Tomcat 9.0.x và MySQL Server 8.0. Máy chủ chỉ cần cấu hình phần cứng tối thiểu: 1 Core CPU, 1GB RAM và 10GB dung lượng trống.

2. Servlet API xử lý bài toán nghẽn cổ chai khi có hàng nghìn lượt truy cập đồng thời như thế nào?

Apache Tomcat sử dụng mô hình Thread Pool để phân phối các luồng (Worker Threads) xử lý đồng thời các phương thức doGet()doPost(). Do không phải gánh thêm overhead từ các tầng Proxy/Reflection của các framework phức tạp, mỗi request được giải phóng bộ nhớ ngay sau khi kết thúc chu kỳ service(), giúp duy trì hiệu năng ổn định.

3. Hệ thống có thể tích hợp với các giải pháp thanh toán điện tử như VNPay hay ZaloPay không?

Hoàn toàn khả thi. Do tuân thủ mô hình phân tầng chặt chẽ, nhà phát triển chỉ cần bổ sung lớp PaymentService và tạo Servlet PaymentCallbackController để tiếp nhận Webhook/IPN phản hồi từ cổng thanh toán và cập nhật trạng thái bảng vgo_db_invoice.

4. Chi phí vận hành hạ tầng của hệ thống ước tính khoảng bao nhiêu mỗi tháng?

Nhờ kiến trúc siêu nhẹ, hệ thống có thể vận hành ổn định trên các gói Cloud VPS phổ thông (khoảng 100.000 – 150.000 VNĐ/tháng), giúp doanh nghiệp tiết kiệm đến 80% chi phí hạ tầng so với các hệ thống chạy microservices phức tạp.

5. Dữ liệu mật khẩu và thông tin CCCD của người dùng được bảo vệ như thế nào?

Mật khẩu được băm một chiều an toàn trước khi lưu vào bảng vgo_db_account. Bộ lọc AuthenticationFilter kết hợp cùng PreparedStatement trên toàn bộ tầng DAO loại bỏ hoàn toàn các nguy cơ tấn công SQL Injection và truy cập trái phép vào các tài nguyên nội bộ.


Kết luận

Đồ án tốt nghiệp "Thiết kế phát triển ứng dụng thuê xe sử dụng Servlet API" đã chứng minh tính hiệu quả vượt trội của việc ứng dụng công nghệ Java Web cốt lõi vào giải quyết bài toán thực tế. Với kiến trúc MVC phân tầng rõ ràng, cơ sở dữ liệu 17 bảng chuẩn hóa, bộ lọc phân quyền an toàn cùng thuật toán tìm kiếm đa tiêu chí mạnh mẽ, hệ thống VGO mang đến một nền tảng thuê xe tự lái toàn diện, hiệu năng cao và sẵn sàng triển khai thực tế. Đây không chỉ là tài liệu tham khảo kỹ thuật giá trị cho cộng đồng lập trình Java mà còn là giải pháp công nghệ khả thi, đóng góp tích cực vào sự phát triển của nền kinh tế chia sẻ phương tiện giao thông tại Việt Nam.