Thứ Ba, 29 tháng 3, 2016

Xây dựng Web Application bằng công nghệ JSP với Spring Boot


Bài viết như một ví dụ thực tế nâng cấp từ triển khai truyền thống sử dụng Tomcat lên blue/green deployment (triển khai song song) sử dụng Spring Boot và Pivotal Web Services.

Nguồn bài gốc tại DZONE.
Tác giả: Gunnar Hillert
Dịch bởi: Phạm Trung Đức
Xin không copy dưới mọi hình thức

2 nhận xét:

  1. Giới thiệu

    Như đã biết, tôi là đồng tổ chức hội nghị về Java cho doanh nghiệp DevNexus qui mô lớn thứ nhì ở Bắc Mỹ tại thành phố Atlanta, bang Georgia. Cùng với Summers Pittamn, tôi vẫn duy trì các ứng dụng web trên nền tảng Spring dùng đề chạy các website, đặt lịch, xử lý thư mời hội thảo, đặt vé,...

    Mục tiêu

    Khi bắt đầu lên kế hoạch tổ chức chương trình DevNexus 2006, tôi muốn nâng cấp các ứng dụng DevNexus. Hơn hết, chúng tôi muốn cải thiện hạ tầng hệ thống cũ kỹ.

    Mục tiêu là chuyển đổi trực tiếp từ ứng dụng độc lập triển khai trên servlet-container của Tomcat mà chúng tôi đã sử dụng nhiều năm qua. Với mô hình cũ, mỗi khi triển khai/nâng cấp ứng dụng, chúng tôi thường phải mất vài phút downtime hệ thống (thời gian ngưng hoạt động của dịch vụ hoặc phần mềm), tệ hơn nữa Tomcat instance hoặc server có thể bị chết. Chính vì vậy, tôi mong mỏi một quy trình triển khai blue/green (triển khai song song).

    Vì thế, mục đích chính là chuyển đổi ứng dụng sang PaaS (nền tảng dịch vụ trên điện toán đám mây), đặc biệt Pivotal Web Services (PWS), nơi tôi không muốn phải bận tâm về hạ tầng hệ thống và triển khai blue/green sẽ nhanh chóng đạt được nhờ sử dụng PWS.

    Để làm được điều đó không còn cách nào khác là chuyển đổi ứng dụng sang sử dụng Spring Boot. May mắn thay, các dụng có kiến trúc khá phù hợp khiến việc chuyển sang Spring Boot nhanh chóng. Việc thay đổi framework giúp đơn giản hoá mọi việc khi ta tận dụng được các chức năng của Spring Boot và loại bỏ bớt các mặc định trùng lặp trong nó.

    Dường như vấn đề chính ở đây là công nghệ sử dụng cho hiển thị - tầng view. Website DevNexus đã sử dụng JavaServer Pages (JSP) trong nhiều năm, tích trữ một lượng lớn dữ liệu. Trên hết, kế hoạch chuyển đổi User Interface (giao diện người dùng) sang Single Page Application (ứng dụng 1 trang) cho hội nghị vào tháng 2 năm 2016 đã không thành công vì vấn đề thời gian.

    Ngay từ đầu, toàn bộ quá trình chuyển đổi đã là một thách thức mạo hiểm. Khi viết bài này, tài liệu tham khảo phiên bản của Spring Boot - version 1.3.3 có đề cập:

    Hãy tránh sử dụng JSP nhất khi có thể vì những giới hạn của nó nếu tích hợp cùng Servlet Containers.

    Chương 27.3.5 có chỉ rõ một số giới hạn của JSP, đặc biệt đề cập:

    Một executable jar (gói jar có thể tự thực thi) sẽ không hoạt động vì mô hình hard coded file trong Tomcat.

    Trả lờiXóa
  2. Giải pháp

    Tóm lại yêu cầu, tôi muốn đặt các File JSP ngoài classpath (đường dẫn cho ứng dụng) để tạo ra Executable Jar. Nói đơn giản là xóa bỏ thư mục Web Apps.

    Thật không may, với dự án xây dựng trên Maven, đặt các file JSP vào đường dẫn như src/main/resources/public hoặc src/main/resources/static đều không hoạt động. Trong khi hướng dẫn JSR-245 JavaServerTM Pages 2.1 Specification và theo như bài blog thú vị có tựa đề Serving Static Content with Servlet 3.0, tôi phát hiện ra mình có thể lưu trữ các tài nguyên tĩnh trong thư mục META-INF/resources. Nó đã thành công.

    Đơn giản chúng ta chỉ cần nhớ là đặt các file JSP vào trong thư mục /src/main/resources/META-INF/resources/WEB-INF/jsp. Để rõ hơn, ta cùng xem qua ví dụ tại đây.

    Bài lab hướng dẫn từng bước tạo 1 dự án Web sử dụng JSP trong Spring Boot

    Kết luận

    Bài viết này giúp bạn dễ dàng sử dụng các JSP template trong các dự án Spring Boot để tạo các file Jar thực thi độc lập bằng cách để JSP files vào thư mục: src/main/resources/META-INF/resources/WEB-INF/jsp/

    JSP thường được biết đến như một di sản nhưng vẫn có một vài lý do khiến nó có thể tồn tại đến ngày hôm nay (2016):

    - Chuyển đổi các dự án cũ đã sử dụng một lượng lớn JSP sang Spring Boot mà không đủ thời gian phát triển lại tầng view.

    - Trong khi Single Page Applications phát triển rất mạnh thì bạn vẫn có vài trường hợp nơi mà mô hình Spring Web MVC truyền thống vẫn cần phải sử dụng.

    - Kể cả khi ứng dụng là Single Page bạn vẫn có thể phải sử dụng các trang JSP gói bao ngoài ( trước khi dữ liệu lấp đầy vào trang), ví dụ truyền data vào một trang HTML khung rỗng.

    - JSP vẫn có tính hiệu quả và tin cậy (battle-tested) trong môi trường sinh thái lớn như Ebay.

    - Kể cả với các Frameworks thay thế khác, bạn vẫn gặp những vấn đề.

    Trong mọi trường hợp, tôi hy vọng bạn mở rộng được quyền năng của mình với Spring Boot. Không chỉ đơn giản là không có lý do bạn không thoả mãn với những điểm mạnh của Spring Boot tới mức tối đa cho phép. Hãy nhớ, tạo JAR, không phải WAR.

    Bài gốc tại https://dzone.com/articles/spring-boot-with-jsps-in-executable-jars-1

    Tác giả Gunnar Hillert

    Dịch bởi Phạm Trung Đức.

    Trả lờiXóa

nhudinhthuan@gmail.com