Planex Vietnam MVC Design Pattern MVC Design Pattern Version Author Review Date Description 1 1 Planex Vietnam MVC Design Pattern Trong bài viết này, tôi sẽ giới thiệu tổng quan về Phươngphápthiếtkế MVC. PhươngphápthiếtkếMVC bắt đầu từ việc phát triển giao diện với người sử dụng (user interface) trong ngôn ngữ lập trình Smalltalk, và là một trong những phươngphápthiếtkế thành công nhất trong các Phươngphápthiếtkế hướng đối tượng (Object Oriented Design Pattern). Hiện nay, MVC được dùng một cách rộng rãi trong nhiều hệ thống phần mềm hướng đối tượng (OO Application), bất kể được viết bằng ngôn ngữ hướng đối tượng (OO Language) nào. MVC là 3 chữ viết tắt của Model-View-Controller. Phương phápthiếtkế MVC (MVC Design Pattern) là một phươngpháp chia nhỏ một ứng dụng nhiều lớp (multi-tier application) hoặc chia nhỏ phần giao diện với người dùng (user interface) của một ứng dụng thành ba thành phần chính là Model, View và Controller. Model (Tạm dịch là phần Mô hình) : Đúng như tên gọi của nó, Model là một đối tượng hoặc một tập hợp các đối tượng biểu diễn cho phần dữ liệu của chương trình, ví dụ như các dữ liệu được lưu trong database, dữ liệu từ một hệ thống các ứng dụng khác như legacy system, file system, mail system … View (Tạm dịch là phần Hiển thị) : Đây là phần giao diện với người dùng, bao gồm việc hiện dữ liệu ra màn hình, cung cấp các menu, nút bấm, hộp đối thoại, chọn lựa …, để người dùng có thể thêm, xóa. sửa, tìm kiếm và làm các thao tác khác đối với dữ liệu trong hệ thống. Controller (Tạm dịch là phần Điều khiển) : Đây là phần điều khiển toàn bộ logic về hoạt động của giao diện, tương tác với thao tác của người dùng (từ chuột, bàn phím và các thiết bị ngoại vi khác) và cập nhật, thao tác trên dữ liệu theo input nhận được và điều khiển việc chọn phần Hiển thị thích hợp để truyền dữ liệu tới người dùng. Dưới đây là sơ đồ của Phương phápthiếtkế MVC : 2 2 Planex Vietnam MVC Design Pattern Khi người sử dụng ra một lệnh (gõ câu lệnh, bấm nút chuột, bấm phím, chọn menu …), lệnh này sẽ được gửi tới phần Điều khiển. Phần Điều khiển sẽ khởi tạo phần Mô hình (nếu cần thiết), gửi các yêu cầu tới phần Mô hình để thực hiện. Căn cứ trên các lệnh và thông tin nhận được từ lệnh, phần Mô hình sẽ đảm nhận việc lấy thông tin và cập nhật thông tin trong các hệ thống khác, ví dụ trong các Enterprise Server như Aplication Server, Mail Server, Database Server, từ File System, Network File System, Legacy System … Sau khi hoàn thành việc thu thập, cập nhật thông tin, Mô hình sẽ truyền những thông tin cần thiết về phần Điều khiển. Lúc này, phần Điều khiển sẽ quyết định chọn thành phần nào trong phần Hiển thị để hiện dữ liệu ra cho người dùng. Phần Hiển thị khi làm nhiệm vụ hiện thông tin cho người dùng cũng có thể truy cập các thông tin hiển thị từ Mô hình, hoặc gửi thông tin hiển thị tới Mô hình. Trường hợp này xảy ra khi Mô hình chứa các thông tin có thể dùng để hiện trực tiếp, ví dụ một danh sách khách hàng, hoặc một danh sách các e-mail trong mailbox. Khi phần Hiển thị hiện thông tin, nó có thể báo cho phần Mô hình biết nó đang hiện phần nào của thông tin, ví dụ như “Đang hiện thông tin khách hàng từ 20 đến 40”. Những thông tin loại này không cần thiết phải gửi qua trung gian Điều khiển. Với phương phápthiếtkế này, các chức năng hiển thị, chức năng logic điều khiển và chức năng truy cập dữ liệu của chương trình được chia làm các phần tách biệt. Khi cấu trúc hoặc cách cài đặt của một phần được thay đổi, các phần kia hầu 3 3 Planex Vietnam MVC Design Pattern như không cần thay đổi, hoặc thay đổi rất ít về API (Application Programming Interface). Khi phần Hiển thị cần thay đổi hình thức trình bày, phần Điều khiển và phần Mô hình hoàn toàn có thể giữ nguyên. Java là một ngôn ngữ lập trình hướng đối tượng thuần túy (pure OOP Language), nên việc áp dụng Phương phápthiếtkế MVC vào các phần mềm viết bằng Java rất dễ dàng và hiển nhiên. MVC không phải là phươngpháp duy nhất dùng để thiếtkế giao diện với người sử dụng trong Java, nhưng cho đến nay, nó vẫn là phươngpháp tốt nhất cho việc này, nhất là trong các ứng dụng Web. Kể từ khi ra đời công nghệ JSP (Java Server Page) và Servlet, có hai hình mẫu (model) [4] chính của Phương phápthiếtkế MVC trong Java là MVC model 1 và MVC model 2. Dưới đây là sơ đồ của MVC model 1: Trong MVC model 1, các trang JSP đóng vai trò Hiển thị (View) và Điều khiển (Controller). Có thể có nhiều trang JSP khác nhau đóng các vai trò khác nhau. Khi người sử dụng dùng các nút bấm, menu hoặc link … trên trình duyệt Web (Web browser) để thực hiện một thao tác, một lệnh (có thể kèm theo các tham số) được gửi tới một trang JSP tương ứng. 4 4 Planex Vietnam MVC Design Pattern Trang JSP này sẽ khởi tạo một hoặc nhiều Java Bean (nếu cần thiết), truyền các lệnh cần thi hành tới Java Bean. Chú ý rằng đây là các Java Bean thông thường, chứ không phải Enterprise Java Bean (EJB) Sau khi Java Bean thực hiện xong việc truy xuất hoặc cập nhật dữ liệu, trang JSP ban đầu có thể hiển thị dữ liệu lấy từ Bean (JSP ban đầu đóng luôn vai trò View), hoặc chọn một trang JSP khác để hiện dữ liệu từ Bean (JSP ban đầu đóng luôn vai trò Controller). Trong một thiếtkế tốt, để bảo đảm việc tách rời phần trình bày và logic của chương trình, trang JSP nhận request chỉ đóng vai trò Điều khiển (Controller). MVC model 1 có một nhược điểm là phần logic điều khiển được viết trong trang JSP, như vậy phần chương trình Java phức tạp dùng để điều khiển sẽ bị lẫn vào trong mã HTML dùng để trình bày. Độ phức tạp của chương trình càng cao, thì trang JSP càng khó bảo trì. Hơn nữa trong các dự án phần mềm phức tạp, thì phẩn hiển thị của trang JSP thường được làm bởi người thiếtkế Web, giỏi về HTML và đồ họa, còn phần chương trình Java được viết bởi lập trình viên chuyên về lập trình. Trong các dự án phức tạp, dùng JSP làm phần điều khiển sẽ làm lẫn lộn việc phân chia ranh giới trách nhiệm giữa nhóm thiếtkế đồ họa và nhóm lập trình, đôi khi dẫn đến việc bảo trì và phát triển trở nên rất khó khăn, gần như không thể làm được. Để khắc phục nhược điểm này, MVC model 2 ra đời. Dưới đây là sơ đồ của MVC model 2: 5 5 Planex Vietnam MVC Design Pattern Trong MVC model 2, một hoặc nhiều servlet (thường là một) đóng vai trò Điều khiển, các Java Bean đóng vai trò Mô hình và các trang JSP đóng vai trò hiển thị. Trong model 2, các logic phức tạp của chương trình được viết hoàn toàn trong các servlet, là các chương trình Java. Phần hiển thị chỉ gồm các trang JSP với một vài mã đơn giản để lấy dữ liệu có sẵn, không có logic phức tạp, vì thế hoàn toàn có thể được tạo ra bằng những người thiếtkế Web. Các yêu cầu của người dùng được gửi từ trình duyệt Web tới servlet. Servlet sẽ khởi tạo Java Bean (nếu cần thiết), ra lệnh thu thập, cập nhật thông tin. Khi Java Bean hoàn thành công việc, servlet sẽ chọn trang JSP thích hợp để hiện thông tin trong Java Bean cho người dùng. Đây chính là một cách sử dụng MVC rất hiệu quả trong Java. Tất nhiên là sử dụng MVC model 2 một cách hoàn toàn cứng nhắc, phần Điều khiển chỉ dùng servlet, phần Hiển thị chỉ dùng JSP sẽ dẫn đến một vài trường hợp kém hiệu quả, nhất là khi có các request từ trình duyệt Web chỉ đòi hỏi việc hiển thị thông tin. Ví dụ: một trang Web đang hiện các mail trong mail box từ mail thứ 20 đến mail thứ 40. Danh sách các mail này đã có sẵn phần Mô hình khi người dùng login và phần Điều khiển ra lệnh cho phần Mô hình lấy danh sách các mail có trong mail box trong POP server. Từ trang Web này, người dùng phát ra một yêu cầu “Next” 6 6 Planex Vietnam MVC Design Pattern để xem tiếp danh sách các mail từ mail thứ 40 đến mail thứ 60. Đây đơn thuần chỉ là đòi hỏi thông tin hiển thị, do đó, nếu gửi qua servlet Điều khiển , servlet sẽ không làm gì cả, mà chỉ gửi yêu cầu hiển thị tới trang JSP hiển thị danh sách mail. Trong trường hợp này, gửi thẳng yêu cầu hiển thị từ trình duyệt Web tới trang JSP sẽ hiệu quả hơn. Sơ đồ cho cách áp dụng MVC nói trên như sau: Trong cách áp dụng MVC này, các yêu cầu có liên quan đến logic chương trình hoặc truy cập dữ liệu sẽ được gửi tới servlet controller, còn các yêu cầu chỉ liên quan tới hiển thị sẽ được gửi tới JSP controller. 7 7