Thành phần M od el bao gói các B u ssin ess O bject và các hàm chức năng cùa ứng dụng. Trong ứng dụng w eb trên c ô n g nghệ J2EE nên sử dụng các Enterprise B ean đ ể thực thi các B u ssin ess O bject vì nó cung cấp một trình chứa EJB quản lý các giao dịch, phân tán, khả năng m ở rộng và các bảo mật quan trọng. C á c ứng dụng đơn giản, M od el có thể sử dụng các đối tượng ja v a
thông thường để thực hiện các chức năng của ứng dụng. Khi thiết kế M odel cần chú ý các yêu cầu sau:
- Có thể quản lý được các giao diện chức năng. M odel của ứng dụng có thể chứa rất nhiều các đối tượng. Khi các đối tượng này tăng lên, người phát triển khó có thể hiểu hết được các tương tác của các đối tượng này với nhau và người phát triển có thể bị tràn ngập bởi số lượng các API với các giao diện cùa chúng.
M ột API phức tạp có thề sử dụng hai đối tượng là Façade O bject và Command O bject. Façade O bject sẳp xếp các hoạt động của các lớp. Nó là một giao diện để các B ussiness O bject trình diễn các dừ liệu và chức năng của Model. Façade O bject bao gói và giấu đi các thực thi phức tạp của các Bussiness Object. Vid ẩn đi các thực thi chi tiết bên trong Façade Object nên việc thay đồi các Business O bject cũng không ảnh hường đến các đối tượng bên ngoàị
Tuy nhiên, hiệu quà của một Façade O bject là giới hạn khi mà chúng chứa quá nhiều các hàm và khi đó, chúng ta cần sử dụng một Command Object. M ột Com m and O bject bao gói mỗi chức năng của ứng dụng trong một lớp tách biệt. M ỗi thể hiện của Com mand O bject mô tả một yêu cầu người dùng với dữ liệu cần thiết để xử lý yêu cầu đó.
- Viết mã chương trình hướng đến việc tái sử dụng các thành phần. Sự phát triển của chương trình được tăng lên khi các đoạn mã chương trình có tính mô đun hỏa cao, các thành phần được tái sừ dụng hoặc hướng sừ dụng các fram ework và các thành phần có sẵn. Các thành phần có tính mô đun hóa cao giúp chúng độc lập tương đối với các thành phần khác. Với tính độc lập tương đối đó, các thay đổi trên một thành phần sẽ ảnh hưởng ít nhất hoặc không ành hưởng đến các thành phần khác. Đồng thời, các thành phần mô
đun hóa chỉ được xây dựng cho các chức đơn riêng rẽ, do vậy nó có thề dễ dàng được sử dụng lại mà không làm tăng chi phí cho ứng dụng. C ác Framework có thể đóng vai trò xương sống để ghép các thành phần khác vàọ Cả Fram ework và các thành phần xây dựng sẵn giúp những nhà phát triển tận dụng được kinh nghiệm của những người khác.
- Thay đổi việc truy cập đến các cơ sơ dữ liệu một cách dễ dàng. Các ứng dụng sử dụng các dữ liệu có thể được lưu trên rất nhiều cơ sở dữ liệu khác nhaụ Chúng cũng có thể là các dữ liệu trong các hệ thống do quá khứ để lạị Với mỗi kiểu lưu trữ dữ liệu, chúng lại có các hàm API của riêng nó. Cách tốt nhất khi thiết kế các Bussiness Object là không tham chiếu trực tiếp đến một cơ sờ dữ liệu đặc biệt nào cà vi khi thay đồi nơi lưu trữ các dữ liệu hay cơ sở dữ liệu sẽ dẫn đến việc thay đổi mã nguồn của các đối tượng Bussiness Object. Các ứng dụng nên sừ dụng các Enterprise Bean với các kết nối chia sẻ vì nó sử dụng m ột EJB quản lý riêng về chi tiết việc truy cập đến các cơ sờ dữ liệụ M ột D ata A ccess O bject bao gói cơ chế truy cập dữ liệu chi tiết vì thế các thông tin chi tiết này được phân tách ra khỏi các chức năng logic cùa ứng dụng.
- Sử dụng các đối tượng Locatẹ
- Phân tách các vai trò trong phát triển. Giống như việc thiết kế View, việc phát triển các thành phần chức năng của ứng dụng là hiệu quà hơn khi phân tách các vai trò trong phát triển. Ví dụ như việc sử dựng các Enterprise Bean giúp chúng ta phân tách việc truy cập chi tiết vào cơ sờ dữ liệu với những chức năng logic cùa chương trình.
II 1.3.4. Thành phần Controller
Thành phần C ontroller điều khiển luồng của ứng dụng và đóng vai trò gắn kết giữa M odel và View - N ó thực thi các chức năng trong M odel để trà
lời các yêu cầu người dùng và lựa chọn trang màn hình hiển thị tiếp theọ C ontroller phân tách v iệc trình diễn dữ liệu kh òi các chức chứ c năng của chương trình.
C ontroller có thể được thực thi trong tầng C lient, W eb, EJB hay tổng hợp cá 3 tầng trên. M ột Client chi sử dụng một V ie w gọi là Thin-Client. M ột V ie w sừ dụng nhiều cá c V iew và một C ontroller gọi là R ich-C lient. T hông thường, C ontroller trong tầng W eb tiếp nhận cá c yêu cầu H TTP, chuyển nó đến C ontroller trong tầng EJB để xử lý các yêu cầu đó. Đ ồ n g thời, Controller trong tầng W eb cũng lựa chọn trang màn hình hiển thị tiếp theọ
Tại tầng W eb , Front Controller là một Servlet thực hiện v iệc nhận các yêu cầu H TTP và gọi m ột sổ hàm của tầng w eb như thay đổi bảng mã hiển thị dữ liệu trà v ề (en co d e). Tất cả các yêu cầu của người dùng đều đi qua Front Controller. Front C ontroller dựa vào các dữ liệu trong yêu cầu rồi chuyển đổi thành m ột đối tượng Event thích hợp và chuyển Event này sang cho tầng EJB để ánh xạ tới chứ c năng xử lý thích hợp. Cuối cù ng, C om m and O bject sè gọi một chứ c nãng của đối tượng Façade để xử lý y êu cầu nàỵ
Front C ontroller là một thiết kế hợp lý vì nó cung cấp cơ chế một cừa cho tất cả các yêu cầ u đến hệ thống. N ó thông dịch các yêu cầu, gọi các hàm xử lý, kiềm tra tính bảo mật, kiểm tra lỗi, ghi lo g và lựa chọn các trang hiển thị tiếp theọ V iệ c điều khiển tập trung giúp chúng ta có thề xây dựng cá c hệ thống lớn và giảm tình trạng dư thừa mã nguồn.
V iệ c sử dụng m ột C om m and O bject không chỉ làm đơn giàn Façade O bject m à còn giúp ch o C ontroller trở nên dễ hiểu bằng v iệ c bao gói cá c sự kiện và các xử lý vào trong các đối tượng nhỏ hơn. N ó làm ch o các sự kiện trong Java được sử dụng như một cầu nối giữa các C ontroller của tầng W eb và EJB.
111.3.5. Tương tác giữa các thành phần MVC
T rong các ứng dụng w eb xây dựng trên cô n g nghệ J2EE, các thành phần đón g vai trò C ontroller thông dịch các y ê u cầu của người dùng - chúng nhận các yêu cầu và bất đầu tiến trình gọi các chứ c năng xử lý tương ứng. Tầng C ontroller bao gồm các thành phần là: R equ est Intercepting Filter, Event C ontroller, E vent Factory, Event, EJB T ier C ontroller và C om m and Factorỵ
T ầng M od el chứ a các thành phần thực hiện cá c chức năng của ứng dụng bao gồm: S essio n Façade, B u ssin ess O bject và D ata A c c e ss O bject. Chúng trích rút dữ liệu và tính toán để xử lý các yêu cầu của người dùng. Đ ối tượng C om m and H andler làm cầu nối giữa C ontroller và M odel.
V ie w làm nhiệm vụ định dạng và trình diễn dừ liệụ N ó chứa các thành phần gồm : Screen V iew , C om p osite V ie w , Screen F lo w M anager và V iew H elper. CÓ 3 thành phần bổ sung là: S ervice L ocator, V alue O bject và B u sin ess D e leg a te giúp xây dựng thành kiến trúc M V C .
N g ư ờ i dùng tư ơng tác với các V ie w khác nhau và gửi sự kiện thông qua giao thức H TTP. Y êu cầu này được gửi đến thành phần R equest Intercepting Filter của Controller. Thành phần này là m ột Servlet có nhiệm vụ lọc thông tin và thực hiện các xác thực cần thiết. Sau đó, yêu cầu được chuyển sang cho thành phần Front Controller. Front C ontroller lấy các dừ liệu từ yêu cầu của người dùng và bao gói vào đối tư ợng Event. N ó sử dụng Event Factory để tạo m ột đối tượng Event hợp lý và chuyển E vent sang tầng EJB Tier C ontroller. Thành phần này ánh xạ sự kiện với chứ c năng xử lý yêu cầu người dùng tương ứng - đối tượng C om m and Factory và C om m and Handler. M ột C om m and H andler xác định đối tượng xừ lý yêu cầụ
Đ ể xử lý yêu cầu người dùng C om m andler H andler gọi một chức năng
phù hợp của S essio n F açade của M odel. S essio n Façade tồ chứ c các công v iệc cần làm. N ó gọi các hàm xử lý của các B u ssin ess O bject đề thực hiện các chức năng của hệ thống. C ác B u ssin ess O bject này có thể truy cập vào C S D L để thấy thông tin cần thiết. N ếu chúng sử dụng các kết nổi kiểu chia sè thì trình chứa EJB sẽ thực hiện các chức năng truy cập dừ liệụ
ị è íiB ìit Ị Screen Viav/ c 1 ' R e q u i t ifttef'ctfttiftB F ilt e r ! C o m p o site View S c r e e n F lo w M a n a g e r Ị
VIMM rm'im Mà É* ■■■■•• v-v---v-vA‘"v'v
I ^jgw H plper < c S « v 1 e f c » F fo m Corttroiter ip.... .. v towwwwwiiwwim p iM Ev«mt F a c lo r y j
S erv ie* L o cato r
( v n k io O liịo c t r--- ! <M.X|frimwịrini»ïT~»iïW _ J _________L I B u n i n « » » D e l e g a t e I I E v o n l \ V , C o m m a rK l H a n d le r s.. I C o m m a n d f a c t o r y I L Session F n c a r t e « E J B » B u s i n e s s O b j e c t b m p B u s i n e s s O tjj e c t I |j D a t a A c c è s * O b j e c t I
Hình IIỊ3 .5 . L ư ợ c đồ cấu trúc m ột ứng dụng w eb trên kiến trúc J2EE
Đ ể trình diễn cá c kết quả trả về tới người dùng, ứng dụng phải nhận lại cá c dữ liệu và định dạng chúng m ột cách phù hợp. Tại bư ớc lấy dữ liệu v ề, ứng dụng sừ dụng S ervice Locator đề tìm kiếm các chức năng và sử dụng B u sin ess D e leg a te làm cầu nối giữa EJB và tầng W eb (trong trường hợp B u ssin ess O bject đư ợ c m ột V iew thực thi từ xa). Đ ố i tượng B u ssin ess D eleg a te là m ột đối tư ợng che giấu chi tiết dừ liệu nhận v ề, ví dụ như các biệt
lệ truy cập từ xạ M ột V alue O bject c ó thể được sử dụng để giới hạn số lượng các lời gọi từ xạ
Các thành phần khác tập trung vào việc trình diễn các dữ liệu nhận về. Screen V iew là trang JSP sẽ trình diễn kểt quả ch o người dùng. N ó được xây dựng trên một C o m p o site V ie w - một tem plate chứa cẩu trúc của trang như header, footer và các thành phần khác. N ó cũng đư ợ c xây dựng trên đối tượng V ie w H elper - các đối tượng JavaBean và các đối tượng trợ giúp khác - kiết xuất cá c dữ liệu động từ các dữ liệu nhận về. Đ ố i tượng Screen F low M anager quản lý thứ tự cá c trang màn hình sẽ được hiển thị tiếp theọ
IIỊ4. Áp dụng MVC trong Struts Fram ework
111.4.1. Giới thiệu vê Struts Framework
Struts Fram ew ork là một dự án của A p ach e Softw are Foundation. Struts Fram ework là m ột trong những fram ew ork đang được sử dụng phồ biến hiện naỵ M ục đích của dự án này là cung cấp m ột m ôi trường làm v iệc m ở cho v iệ c xây dựng cá c ứng dụng bằng côn g nghệ Javạ
Lõi của Struts là m ột Controller m ềm d ẻo dựa trên các cô n g nghệ chuẩn như JavaServlet, JavaB ean, R esou rceB u nd le và X M L , cũng như hàng loạt cá c gói Jakarta C om m on (m ột dự án của A pach e Softw are Foundation nghiên cứu v ề các khía cạnh tái sử dụng cá c thành phần Java). Struts Fram ework hỗ trợ v iệ c xây dựng các ứng dụng w eb dựa trên M od el 2, m ột
biến thề cùa kiến trúc M VC.
Trong Struts Fram ew ork, thành phần C ontroller kết hợp với các công nghệ khác để hồ trợ cho các thành phần M odel và View. Với M odel, Struts Framework có thể tương tác với các kỳ thuật truy nhập dữ liệu chuẩn như JD BC (Java D ataB ase Connectivity - Kỳ thuật kết nối cơ sờ dừ liệu từ Java) và EJB (Enterprise Java Bean - Hoạt động trong các trình chứa kiểm soát các giao tác (transaction) với cơ sở dữ liệu đầu cuối, thực hiện tinh năng bảo mật và an toàn cao) cũng như với hầu hết các gói sàn phẩm của các hãng cung cấp thứ ba như H ibem ate, iBATIS, O bject Relation Bridgẹ.. Với View, Struts Framework làm việc với các trang JSP, JSTL, JSF cũng như các mẫu Velocity Tem plates, XSLT và các hệ thống trình diễn khác.
Struts Fram ew ork cung cấp hạ tầng cho các ứng dụng web chuyên nghiệp, giúp chúng ta có thể xây dựng được các ứng dụng dựa trên các chuẩn và các mẫu thiết kế đã được thừa nhận. [10]
IIỊ4.2. Thành phần Model
M odel là một thành phần của kiến trúc M V C , nó thường được chia thành 2 phần là: các trạng thái nội tại của hệ thống và các hành động làm thay đổi các trạng thái của hệ thống.
Để mô tả các trạng thái nội tại của hệ thống, nhiều ứng dụng sử dụng một hoặc nhiều các JavaBean. Các thuộc tính của JavaB ean mô tả chi tiết các trạng thái của hệ thống. Nhiều bean có thể chứa đựng và duy trì trực tiếp các thông tin trạng thái trong nó hoặc lấy các thông tin hệ thống từ các thành phần khác như cơ sở dữ liệu, các máy tìm kiếm, LD AP Server hay bất kỳ một thành phần nào khác.
C ác ứng dụng lớn thường thực thi các chức năng hệ thống bằng cách xây dựng các phương thức trên các bean. Ví dụ, chúng ta có một bean chứa
đựng thông tin về giỏ hàng của người mua hàng, bean này chứa trong đối tượng session. Bean này có thể chứa các phương thức như xác thực thẻ tín dụng hay gửi thông tin đặt hàng. M ột số hệ thống khác có thể sừ dụng các Session Enterprise JavaB ean để làm việc nàỵ
Các ứng dụng nhỏ có thể nhúng các chức năng của hệ thống trong lớp Action. Điều này là hợp lý khi chức năng này là đơn giàn và không tính đến việc tái sử dụng các chức năng nàỵ
Struts Fram ew ork đủ mềm dẻo để hỗ trợ cho bất cứ cách thức truy cập vào M odel, tuy nhiên chúng ta cần phân tách phạm vi của Model và Controller.
111.4.3. Thành phần View
View là một thành phần trong kiến trúc M VC. Trong Struts Framework, View được xây dựng bằng công nghệ JSP. Các trang JSP có thể chứa các thè chuẩn cũng như các thẻ mà người dùng tự định nghĩạ
111.4.4. Thành phần Controller
C ontroller là một thành phần trong kiến trúc M VC. Trong Struts Framework, thành phần chính của C ontroller là lớp ActionServlet. ActionServlet được cấu hình bằng các ActionM apping - mô tả đường dẫn URI (ứng với yêu cầu người dùng) với đường dẫn tới một lớp Action (ứng với đối tượng xử lý yêu cầu người dùng). Tất cả các Action của ứng dụng là lớp con của lớp org.apachẹstruts.action.Action. M ỗi Action bao gói việc định nghĩa các chức năng, thông dịch chúng và gửi các điều khiển tới View để tạo ra câu trả lờị
II 1.4.5. Phối hợp cấc thành phần MVC
Khi bắt đầu vận hành, Controller sẽ phân tích file cấu hình struts-
config.xml và sử dụng nó đề thực thi các đối tượng trong Controller. Các đổi tượng này tạo nên cấu hình của Struts Framework.
ServletAction giúp cho ActionM apping như một bộ dẫn các yêu cầu HTTP đến các trang trình diễn (JSP, HTM L, X M L ...) hoặc đến các lớp con Action. Thông thường, một yêu cầu được chuyền đến một lớp con Action sau đó được chuyền đến một trang trình diễn JSP.
A ctionM apping thường chứa các thuộc tính sau: - Đường dẫn yêu cầu (URI).
- Đối tượng xừ lý yêu cầu (lớp con của Action).
- Các thuộc tính cần thiết khác như phạm vi của yêu cầu (scope)... Đổi tượng xử lý yêu cầu có thề gửi kết quả trả về cho người dùng hoặc xác định điều khiển sẽ được chuyền tiếp tới đâụ Ví dụ, nếu đăng nhập thành công thì chuyển đến danh sách các chức năng của chương trình (main menu).
Khi một xử lý hoàn thành, đổi tượng xừ lý yêu cầu có thể không trực tiếp chuyển đi các đối tượng lưu trữ thông tin như các JavaB ean mà đặt chúng vào trong khung cảnh dùng chung của các JavaServlet. Ví dụ, một Action có