Cách tiếp cận phổ biến nhất hiện nay cho các ứng dụng sử dụng công nghệ J2EE là kiến trúc MVC (Model - View - Controller). MVC là kiến trúc rất phù hợp cho các ứng dụna, tương tác trên Web. Kiến trúc này đã được sử dụng từ trước khi công nghệ Java ra đời và được ứng dụng rất nhiều trong ngôn ngữ SmallTalk. Đặc điểm lớn nhất của kiến trúc này là thực hiện việc phàn chia các đối tượng thành các nhóm ricng biệt thực hiện chức năng xử lý dừ liệu và biểu diễn dữ liệu đế giảm thiểu tối đa sự phụ thuộc lẫn nhau của các đối tượng này.
Kiến trúc MVC chia ứng dụng thành các phần riêng biệt: mô hình, vùng nhìn và bộ điều khiển. Mỗi thành phần có một trách nhiệm riêng biệt và thực hiện nhiệm vụ khác nhau:
- 7 6 -
• Mô hình thực hiện việc biểu diễn các dừ liệu và các Logic nghiệp vụ cũng như quản lý các hoạt động truy nhập và biến đổi dừ liệu. Thông thường, mô hình chính một cách thể hiện thể giới thực của phần mềm. Mô hình có trách nhiệm thông báo cho vùng nhìn khi nó thay đổi và cung cấp khả năng cho phép vùng nhìn có thể lấy được từ mô hình các trạng thái của nó.
• Vùng nhìn thực hiện việc biểu diễn nội dung của mô hình. Vùng nhìn truy nhập tới các dừ liệu trong mô hình và xác định các dữ liệu này được thể hiện như thế nào cho người dùng. Vùng nhìn cũng thực hiện cập nhập dữ liệu khi mô hình thay đổi. Vùng nhìn có trách nhiệm chuyển các dữ liệu do người sử dụng đưa vào tới bộ điều khiển.
• Bộ điều khiển quyết định các thức vận hành của ứng dụng. Nó thực hiện việc chuyên các yêu câu của người sử dụng và lựa chọn vùng nhìn thích hợp cho việc biểu diễn dừ liệu. Bộ điều khiển thực hiện việc phân tích dừ liệu do người sử dụng đưa vào và chuyến nó cho các hoạt động xử lý của mô hình. Sau đó, bộ điều khiển lựa chọn vùng nhìn. Vùng nhìn được lựa chọn tùy thuộc vào sự tương tác đối với người sử dụng và kết quả đưa ra của mô hình. Thông thường, mỗi ứng dụng có một bộ điều khiển cho mồi nhóm các chức năng liên quan với nhau. Một số ứng dụng sử dụng các bộ điều khiển khác nhau cho mỗi loại ứng dụng khách bởi việc lựa chọn vùng nhìn phụ thuộc vào loại ứng dụne khách.
Yêu cầu thông tin trạng thái I I I Thông báo I thay đổi trạng thái Mô hình - Q u ả n lý trạ n g th á i c ủ a ứ n g d ụ n g - C u n g c ấ p c á c th ô n g tin v ề tr ạ n g th á i - T h ự c h iệ n c á c c h ứ c n ă n g c ủ a ứ n g d ụ n g - T h ô n g b á o c h o v ù n g n h ìn c á c th a y đ ổ i trạ n g th á i Vùng nhìn - H iể n th ị n ộ i d u n g c ủ a m ô h ìn h - Y è u c ầ u c u n g c ấ p c á c th ô n g tin trạ n g th á i - G ử i y è u c ầ u c ủ a n g ư ờ i s ử d ụ n g tớ i bộ đ iề u k h iể n
- C h o p h é p b ộ đ iế u k h iể n lựa c h ọ n v ù n g n h ìn Lựa chọn vùng nhìn Hoạt động của người sử dụng Ghi chú
Gọi phương thức thực hiện
1 ^ ^ Sự kiện Thay đổi [rạng thái Bộ điều khiển - X á c đ ịn h c á c h ứ n g x ử c ủ a ứ n g d ụ n g - C h u y ể n h o ạ t đ ộ n g c ủ a n gư ờ i s ử d ụ n g th à n h c á c th a y đ ổ i c ủ a m ô h ìn h - Lựa c h ọ n v ù n g n h ìn Hình 4-1: Kiến trúc MVC
Việc tách biệt trách nhiệm giữa mô hình, vùng nhìn và bộ điều khiển, giúp giảm bót việc lặp lại các dòng lệnh tại các phần khác nhau của ứng dụng. Và điều quan trọng nhất là giúp cho việc bảo trì của ứng dụng trở nên đơn giản hơn rất nhiều. Kiến trúc cũng giúp cho việc xử lý dữ liệu dễ hơn, dù đó là thêm vào một cấu trúc dừ liệu mới hay thay đổi cách thể hiện dữ liệu, bởi phần xử lý của ứng dụng được tách rời với dừ liệu. Kiến trúc cũng cho phép dễ dàng thêm các loại ứng dụng khách mới, bởi không cần thiết phải thay đổi Logic nghiệp vụ khi thêm một loại ứng dụng khách mới.
Trong công nghệ J2EE, kiến trúc MVC được thực hiện bởi các thành phần J2EE như sau:
- 78 -
• Vùng nhìn: JSP
• Bộ điều khiển: Servlet
Ở đây, Servlet đóng vai trò của bộ điều khiển và nhận các yêu cầu của người sử dụng thông qua lệnh POST của giao thức HTTP. Sau đó, nó thực hiện việc chuyển dừ liệu tới mô hình của ứng dụng tức các thành phần EJB và lựa chọn vùng nhìn thích họp hay các JSP. [4]
4.1.2 Các vấn đề đặt ra đối với mô hình MVC trong J2EE
Đe kiến trúc MVC thực sự phát huy hiệu quả thì việc tách biệt giữa các phần khác nhau của ứng dụng phải được thực hiện một cách triệt để. Tuy nhiên, các ứng dụng J2EE theo mô hình đa mức thường có thể dược đặt trên nhiều máy chủ khách nhau. Mọi liên hệ giữa các thành phần này đều được thực hiện qua mạns. Chính vi lý đo này, một số vấn đề được đặt ra đối với các ứng dụng J2EE sử dụng kiến trúc MVC như sau:
• Vấn đề với tốc độ xử lý: do sự phân nhỏ của các thành phần trên máy chủ dẫn đến mỗi lời gọi thực hiện một chức năng của ứng dụng đòi hỏi phải có nhiều thông điệp được gửi trên mạng giữa máy chủ và máy khách. Thêm vào đó, phải có nhiều lời gọi tới các phương thức để thực hiện việc xử lý dữ liệu. Và cuối cùng, nhiều lời gọi khác để lấy được kết quả trả lời. Điều này làm giảm tính hiệu quả của ứng dụng và làm cho việc phát triển ứng dụng trở nên phức tạp hơn.
• Vấn đề với tính ổn định: việc thay đổi Logic nghiệp vụ có thể dẫn đến việc thay đổi của Servlet nếu giao diện của Logic nghiệp vụ bị thay đối.
• Vấn đề với công nghệ cài đặt: để thực hiện việc cài đặt các Logic nghiệp vụ có thể sử dụng nhiều công nghệ khác nhau. Trong đó, có thể kể đến như EJB, JDBC hay các công nghệ khác có thể xuất hiện trong tương lai. Hơn thế nữa, trong môi mô hình lập trinh, môi công nghệ có những các thức khác nhau đê thực hiện lời gọi việc thực hiện xử lý của ứng dụng. Điêu đó có nghĩa là
Servlet phải biết được tất cả các công nghệ được sử dụng cho việc cài đặt cho phần mô hình của ứns dụng.
Để giải quyết các vấn đề này nói riêng và một số các vấn đề khác trong việc phát triển các ửne dụng mức xí nghiệp với công nghệ J2EE, một số khuôn mẫu phát triển ứng dụng được xây dựng. Phần tiếp theo đây sẽ xem xét sơ qua về các khuôn mẫu ứng dụng phổ biến, ở đây cũng thử xem xét chi tiết hơn với một khuôn mẫu ứng dụng được sử dụng rất nhiều, đó là khuôn mẫu Session Bean bao ngoài. [6]
4.1.3 Khuôn mẫu phát triển của J2EE
Khuôn mẫu phát triển là các cách giải quyết thường được sử dụng cho các vấn đề lặp đi lặp lại nhiều lần trong việc thiết kế và cài đặt các ứng dụng. Qua thời gian, các khuôn mẫu này được tập hợp lại. Đây có thể được coi là các hiểu biết và các kinh nghiệm của ngành công nghiệp phần mềm. Các khuôn mẫu phát triển giúp giải quyết các vấn đề về xây dựng kiến trúc của ứng dụng, phân chia các phần của ứng dụng trên các máy chủ khác nhau cũng như giúp giải quyết các vấn đề chung đặt ra đối với mồi ứng dụng như tốc độ thực hiện, việc bảo trì cũng như tính khả chuyển của ứng dụng.
Phần này sẽ xem xét sơ bộ các khuôn mẫu phát triển của những người phát triên phần mềm trên J2EE được sử dụng phổ biến hiện nay. Mồi khuôn mẫu thường được sử dụng ở các mức nhất định hay giao diện giữa các mức này trong các ứng dụng. Các khuôn mẫu phát triển J2EE có thể được kể đến là:
• Bộ lọc chặn: khuôn mầu này được sử dụng trước và sau quá trình xử lý. Nó cho phép thực hiện thêm các dịch vụ xử lý cần thiết cho mỗi quá trình xử lý một yêu cầu. Ví dụ, bộ lọc chặn Servlet thực hiện việc xử lý mọi yêu cầu của người sử dụng tới Web site. Servlet này cung cấp một cơ chế quản lý quyền truy nhập tập trung.
• Bộ tr ợ giúp vùng nhìn: Các bộ trợ giúp vùng nhìn giúp phân chia giữa chức năng hiển thị dữ liệu và truy nhập dữ liệu, giúp thay đổi cấu trúc của vùng
- 80-
nhìn làm nó trở nên đơn giản hơn. Chức năng hiến thị thực hiện việc định dạng dừ liệu cho việc biểu diễn trên các trang Web. Chức năng truy nhập thực hiện việc lấy dữ liệu. Bộ trợ giúp vùng nhìn thườne được cài đặt bằng các thẻ JSP, còn chức năng truy nhập dữ liệu thường được cài đặt bằng các thành phần JavaBean.
• Vùng nhìn đa hợp:Khuôn mẫu này giúp việc biểu diễn bàng các vùng nhìn dễ quản lý hơn bằng cách tạo các mẫu cho các đối tượng chung trên các trang Web. Thông thường, các trang Web ngoài các thành phần độna còn có một sổ thành phần tĩnh như đầu trang, cuối trang, nền, ... Các thành phần động thay đổi theo từng trang Web, nhưng các thành phần tĩnh thì thường giống nhau cho mọi trang Web. Vùng nhìn đa hợp tạo mẫu chửa các thành phần chung này.
• Bộ điều khiển trước: Khuôn mẫu này sử dụng một bộ điều khiền trung tâm quản lý mọi yêu cầu của người sử dụng. Bộ điều khiển trước nhận mọi yêu cầu từ người sử dụng, thực hiện việc chuyến các yêu cầu này cho bộ xử lý yêu cầu tương ứng và biểu diễn một cách thích hợp các đữ liệu trả lại cho người sử dụng.
• Đối tuọng giá trị: Giúp hỗ trợ việc trao đổi dữ liệu giữa các mức của ứng dụng để giảm bớt chi phí trao đổi qua mạng. Trong mỗi lời gọi hàm ở xa, đôi tượng giá trị được dùng để lấy một nhóm các dữ liệu liên quan với nhau và đối tượng này được đặt cục bộ ngay trên máy khách.
• Session bao ngoài: Đây là khuôn mầu được sử dụng rộng rãi nhất. Khuôn
mẫu này chỉ ra cách thức phân chia Logic nghiệp vụ trong các ứng dụng để giảm thiểu sự phụ thuộc giữa máy chủ và máy khách. Đồng thời đảm bảo rằng mọi chức năng của hệ thống được thực hiện bằng một lời gọi qua mạng và thực hiện trong một giao dịch.
• Thông điệp bao ngoài: Khuôn mẫu này tương tự như khuôn mẫu Session, nhưng dùng cho các chức năng được thực hiện không đồng bộ
• Lệnh: Khuôn mẫu này thường trái ngược với khuôn mẫu Session Bao Ngoài. Khuôn mẫu này thực hiện công việc hoàn toàn tương tự như Session Bao Ngoài. Nhưng thay vì dùng các Session Bean, khuôn mẫu sử dụng các thành phần Java thông thường. Việc sử dụng các thành phần Java thông thườnR này giúp máy khác hoàn toàn được tách biệt với công nghệ EJB thường được sử dụng để triển khai phần logic của ứng dụng.
• Đối tu'O'ng trao đối d ữ liệu: Thay vì việc thực hiện các trao đổi dữ liệu trực tiếp từ các thành phần Entity Bean, khuôn mẫu này sử dụng các thành phần riêng biệt giúp thực hiện việc tạo và trao đổi dừ liệu. Các thành phần này có thể được xây dựng bàng Session Bean hoặc các thành phần Java thông thường. Việc này giúp tách biệt giữa chức năng tạo và trao đổi dữ liệu khỏi mô hình của dữ liệu biểu diễn bởi Entity Bean.
• Giao diện nghiệp vụ: Giao diện nghiệp vụ chỉ ra cách thức cài đặt các giao diện tại chỗ và các giao diện từ xa cho phép có thể kiểm tra được việc gọi các phương thức của các giao diện này có đúng hay không ngay tại thời điểm biên dịch.
Phần tiếp theo sẽ xem xét chi tiết về một khuôn mẫu được sử dụng nhiều nhất là Khuôn mẫu Session Bao Ngoài. [4]
4.1.4 Khuôn mẫu Session Bao Ngoài
Đe thực hiện các Logic nghiệp vụ cho mỗi chức năng của ứng dụng, thông thường, phải thực hiện truy nhập tới nhiều đối tượng khác nhau trên máy chủ. Một vấn đề nảy sinh là việc truy nhập tới nhiều đối tượng thông qua nhiều lời gọi phương thức của các đối tượng này sẽ làm tăng trao đổi dừ liệu trên mạng. Việc bảo trì ứng dụng cũng trở nên khó khăn hơn do việc truy nhập dữ liệu và các qui trình xử lý bị phân mảnh.
Ví dụ, trong một ứng dụng ngân hàng trực tuyến, khi một Servlet nhận được một yêu cầu chuyển tiền từ một tài khoản này sang một tài khoản khác, Servlet phải thực
- 82 -
hiện kiêm tra quyền của người sử dụng, rút tiền từ Entity Bean của một tài khoản, chuyên tiền vào Entity Bean của tài khoản khác.
Hình 4-2: Chuyển tiền giữa các Entity Bean tài khoản
Trong biêu đô trên, các lời gọi các phương thức của các giao diện tại chồ và giao diện từ xa được thực hiện thông qua nhiều lời gọi qua mạng. Cách tiếp cận này sẽ không cho phép ứng dụng có thể phục vụ được một số lượng lớn người sử dụng bởi mỗi yêu cầu này đòi hỏi không dưới 6 lời gọi qua mạng với 3 lời gọi để tìm thành phần Entity Bean cần thiết và 3 lời gọi thực sự thực hiện việc chuyển tiền. Hơn thế nừa, các Entity Bean hoạt động trong các giao dịch. Vì vậy, mỗi lời gọi phương thức của Entity Bean đòi hỏi phải tạo một giao dịch riêng trên máy chủ và đòi hỏi phải đồng bộ dữ liệu của Entity Bean với dữ liệu được lưu trữ.
Ngoài ra, cách tiếp cận này cũng không bảo đảm tính toàn vẹn dữ liệu. Nếu có sự cố xảy ra sau khi thực hiện việc rút tiền và trước khi thực hiện việc chuyển tiền thì có nghĩa là khách hàng sẽ bị mất tiền do hai hoạt động này được thực hiện trên hai giao dịch độc lập nhau.
Một giải pháp cho vấn đề này là tạo dựng thêm các phương thức cho các Entity Bean đê thực hiện cho các yêu cầu khác nhau của người sử dụng. Nhưng giải pháp
này làm cho việc bảo trì ứng dụng trở nên hết sức khó khăn, bởi vì qua thời gian, các Entity Bean sẽ được sử dụng theo rất nhiều cách khác nhau. Neu mồi lần cần giải quyết vấn đề về tốc độ thực hiện lại phải thêm các phương thức mới vào các Entity Bean thì các Entity Bean sẽ ngày càng trở nên cồng kềnh hơn và khó hiểu hơn. Và khi đó, thực hiện việc sát nhập giữa logic của ứng dụng với việc quản lý dừ liệu. Đây là một thiết kế ứng dụng hoàn toàn không tốt.
Một giải pháp cho vấn đề này thường được sử dụng là bao gói tất cả các lời gọi tới Entity Bean bằng các Session Bean. Tất cả mọi lời gọi từ ứng dụng khách tới các Entity Bean sẽ được thực hiện thông qua các Session Bean. Phương pháp này được gọi là khuôn mầu Session Bao Ngoài.
Phương pháp này cho phép có thể che dấu mô hình đối tượng trên máy chủ đối với các máy khách. Hình vẽ sau đây cho thấy hiệu quả của phương pháp này cho việc giải quyết vấn đề đặt ra cho ví dụ nêu ở phần trên:
Hình 4-3: Tăng tốc độ với Session Bao Ngoài
Trong trường hợp này, toàn bộ chức năng chuyển tiền của ứng dụng được gọi
thông qua phương thức transferFund() của Session Bean. Thành phần Session Bean
- 8 4 -
Session Bean BankTeller và các Entity Bean cùng được đặt trên một máy chủ. Vì vậy, có thê cho Session Bean này truy nhập tới các Entity Bean hoàn toàn thông qua các giao diện cục bộ. Như vậy, sẽ giúp làm giảm các trao đổi dữ liệu trên mạng. Hơn thế nữa, mọi phương thức thực hiện thay đổi dữ liệu của các Entity Bean được thực hiện trong giao dịch được khởi tạo bởi Session Bean BankTeller. Do đó, toàn bộ hoạt động của chức năng này sẽ được gói gọn trong một giao dịch giúp đảm bảo được tính toàn vẹn của dữ liệu. [3]
Việc sử dụng Session Bao Ngoài giúp đem lại các lợi ích sau:
• Giảm trao đổi dữ liệu trên mạng: Việc thêm các Session Bean bên ngoài làm tăng các lớp của ứng dụng nhưng cho phép người sử dụng có thể thực hiện được mỗi chức năng của ứne dụng thông qua một lời gọi qua mạng duy nhất. Trên máy chủ các Session Bean thực hiện việc trao đổi cục bộ với Entity Bean vì vậy không đòi hỏi các trao đổi dừ liệu trên mạng. Như vậy, giải pháp