Portal Framework SOA Architecture

Trong những chuyên đề tuần trước về Web Portal, chúng ta đã nhắc đến Portlet như một trong những tên gọi của một module, một phần tử hoạt động độc lập, một đơn vị cơ bản làm nên một Web Portal. Ta cũng đề cập đến việc xây dựng các module này phải tuân theo một chuẩn nào đó, như vậy thì các module mới có thể tích hợp lại với nhau và giúp cho Portal hoạt động trôi chảy. Các chuẩn này có thể chỉ là một chuẩn nội bộ, nghĩa là chỉ đúng với 1 loại Portal cụ thể, nhưng cũng có những chuẩn mở, có thể áp dụng để xây dựng các module trên nhiều Portal khác nhau.

Trong ba loại Portal, chúng ta quan tâm đến loại Portal thứ ba, loại Portal Website. Cần nhắc lại một chút về Portal Website. Portal Website là loại Portal thông dụng nhất ở Việt Nam hiện nay, dùng để xây dựng các Website tác nghiệp cho một cơ quan, một công ty hay một tập thể cá nhân nào đó. Các Portal loại này thường có mã nguồn mở, đã xây dựng sẵn một số tính năng chung và thông dụng, cho phép nhà phát triển Website không phải tốn công xây dựng lại cũng như là những kênh mẫu để tạo ra các tính năng tác nghiệp cụ thể. Các Portal này thường sử dụng một số loại cơ sở dữ liệu thông dụng, nhưng cũng không khó để tuỳ biến và thêm vào các loại cơ sở dữ liệu khác.

Một Portal bao gồm các trang web khác nhau, mỗi trang chứa một hoặc nhiều module hoạt động độc lập. Trong các Portal Website hiện đang phổ biến tại Việt Nam, phần nhiều được viết trên nền tảng Java. Và module độc lập của một Portal Java có cái tên rất đặc trưng là Portlet – có nghĩa là “một phần tử của Portal” hay “một Portal nhỏ”. Với những nhà phát triển Java, cái tên này cũng gần gũi dễ hiểu tựa như Applet, Servlet hay MIDlet trước đây vậy. Sun Microsystem đã cùng với một số đối tác là các công ty lớn như IBM, Oracle, SAP, Apache, Borland, Novell… phát triển một chuẩn riêng cho Portlet, đó là chuẩn JSR 168. Hiện nay, chuẩn JSR 168 là chuẩn về Portal phổ biến nhất trên thế giới, một phần vì uy tín của Sun và các công ty lớn, phần khác, các Portal viết bằng Java hiện nay cũng chiếm số đông, do khả năng linh động và đa nền tảng đặc thù của công nghệ Java. Các Portal tác nghiệp (Enterprise Portal) nổi tiếng phần lớn cũng viết bằng Java và sử dụng chuẩn JSR 168.

Chuyên đề tuần này sẽ nói về đặc tả chuẩn JSR 168 cũng như mô hình lập trình một Portlet dựa trên chuẩn này. Chuẩn JSR 168 bao gồm các đặc tả một Portlet và quy trình trao đổi dữ liệu cũng như quan hệ dịch vụ giữa Portlet và Portlet Container. Do đó, trước hết chúng ta sẽ xem xét các định nghĩa cơ bản nhất về Portal và Portlet của chuẩn JSR 168.

Kiến trúc Portal theo chuẩn JSR 168

Theo chuẩn JSR 168, Portal là một ứng dụng web cung cấp tính năng cá nhân hoá, đăng nhập một lần, quản lý tích hợp nội dung từ các nguồn dữ liệu khác nhau, thực hiện phân tách giao diện với hệ thống thật sự bên trong.

Một Portal gồm nhiều trang Portal Page, với một giao diện thống nhất, kết hợp các nguồn dữ liệu khác nhau và hiển thị trên trình duyệt. Các trang Portal Page được điều hướng thông qua quá trình xác thực người dùng, không bị giới hạn gì trong suốt một phiên làm việc và được cấu thành từ các module nhỏ hơn có dữ liệu, vòng đời độc lập, đó chính là các Portlet. Để có thể tích hợp dễ dàng các module với nhau cũng như để phân tách giao diện hiển thị với phần xử lý đằng sau, JSR 168 sử dụng mô hình Portlet – Porlet Container.

Một Portlet Container chứa các Portlet và quản lý vòng đời của chúng. Portlet Container cũng cung cấp cơ chế lưu trữ bền vững cho các tham chiếu đến Portlet. Một Portlet Container và các Portlet chứa trong nó có thể được xây dựng gắn liền với nhau như một thành phần thống nhất hoặc được coi như hai thành phần riêng biệt trong một ứng dụng Web thông thường.

Các mô tả trên đây về Portal không có nhiều điểm khác như những khái niệm mà chúng ta đã đề cập đến trong chuyên đề lần trước. Tuy nhiên vì được xây dựng trên một nền tảng công nghệ cụ thể nên kiến trúc của một Portal tất nhiên là chi tiết hơn và có một cơ chế hoạt động riêng.

Yêu cầu của người dùng được gửi đến Portal, truy nhập vào một trang Web, thực chất là một Portal Page, để sử dụng dịch vụ của một Portlet nằm trong trang này. Portal sẽ gọi đến các Portlet Container chứa Portlet cần dùng thông qua giao diện Container Invoke API. Sau đó Portlet Container sẽ yêu cầu Portlet thực thi thông qua giao diện Portlet API. Giao diện Container Provider Service Provider Interface (SPI) cho phép Portlet Container hiển thị các dữ liệu trả về từ một Portlet.

Sau đây chúng ta sẽ tìm hiểu về các vấn đề cơ bản của JSR 168 như vòng đời của một Porlet, các giao diện API của chúng, các kiểu hoạt động của Portlet, cơ chế truy cập dữ liệu web, cơ chế đa ngôn ngữ…

Vòng đời của một Portlet

JSR 168 quy định vòng đời của một Portlet bao gồm ba giai đoạn :

* Giai đoạn khởi tạo : khởi tạo một Portlet và chuyển sang trạng thái sẵn sàng phục vụ yêu cầu.
* Giai đoạn xử lý yêu cầu : Thực thi các hành động khác nhau và hiển thị kết quả.
* Giai đoạn kết thúc : Huỷ đối tượng Portlet và tạm thời ngưng cung cấp dịch vụ.

Trong đó thì giai đoạn xử lý yêu cầu là giai đoạn chính. Portlet nhận yêu cầu thông qua quá trình tương tác với người dùng. Quá trình xử lý yêu cầu này bao gồm hai pha như sau

* Thực thi dịch vụ được yêu cầu :

Nếu người dùng click chuột vào một liên kết trên một Portlet, dịch vụ (hoạt động) tương ứng được kích hoạt và được thực thi. Pha này phải kết thúc trước khi việc hiển thị kết quả của cả trang Portal Page bắt đầu. Trong pha này, Portlet có thể thay đổi trạng thái của mình.

* Hiển thị kết quả trả về :

Thông qua Portal Page, Portlet sẽ hiển thị kết quả, trả về máy người dùng. Pha này không làm thay đổi trạng thái của Portlet. Nó đơn giản là gọi đến hành động refresh của trang chứa. Quá trình hiển thị kết quả của một Portlet là song song, độc lập với quá trình hiển thị kết quả của các Portlet khác.

Giao diện lập trình của Portlet

Mọi Portlet đều phải cài đặt (implement) giao diện portlet, hoặc thừa kế một lớp đã cài đặt giao diện này. Giao diện Portlet bao gồm các phương thức sau :

* init(PortletConfig config):

Phương thức khởi tạo Portlet, Phương thức này được gọi một lần duy nhất sau khi khai báo và lấy về thể hiện của một đối tượng Portlet. Trong phương thức này chúng ta có thể cài đặt đoạn mã tạo ra các nguồn tài nguyên, lấy về các kết nối dữ liệu mà Portlet này sẽ sử dụng.

* processAction(ActionRequest request, ActionResponse response):

Phương thức này dùng để cài đặt các đoạn mã thực thi việc xử lý dịch vụ mỗi khi người dùng yêu cầu thông qua việc họ kích hoạt một thành phần giao diện như việc click vào một nút bấm, click vào một liên kết, lựa chọn một mục trong một combobox… Chỉ một hành động tương tác giao diện của người dùng được kích hoạt trong một thời điểm. Trong quá trình thực thi đoạn mã, Portlet có thể thay đổi trạng thái của nó, thay đổi phương thức lưu trữ dữ liệu cũng như thiết lập các tham số để sẵn sàng hiển thị kết quả.

* render(RenderRequest request, RenderResponse response):

Phương thức này thực hiện quá trình hiển thị kết quả thông qua việc sinh ra tài liệu HTML đơn thuần với các định dạng hiển thị phù hợp với giao diện chung của trang.

* destroy():
Phương thức này chỉ ra rằng nhiệm vụ của Portlet đó đã hoàn thành và kết thúc vòng đời của Portlet đó. Các đoạn mã được cài đặt trong phương thức destroy thực thi việc giải phóng các tài nguyên mà Portlet đã sử dụng cũng như cập nhật các dữ liệu cần thiết vào bộ phận lưu trữ để đảm bảo tính bền vững của Portal.

Các kiểu Portlet

Tuỳ theo chức năng, tuỳ theo dịch vụ mà một Portlet cung cấp, JSR 168 chia ra ba kiểu Portlet khác nhau, và tất nhiên các đặc tả dành cho các loại Portlet này cũng khác nhau.

* Kiểu Portlet thông thường :

Portlet kiểu này đảm nhận việc Hiển thị, Chỉnh sửa, Cập nhật dữ liệu. Đây là chế độ mà mọi Portlet đều có thể thực hiện, thông qua mô hình Master-Detail nổi tiếng. Trang Master sẽ hiển thị các bản ghi dữ liệu theo yêu cầu của người sử dụng, có một số các điều khiển dùng để tìm kiếm các bản ghi thông qua các tiêu chí khác nhau. Mỗi bản ghi đều có định danh tương ứng để người dùng có thể Chỉnh sửa cập nhật các bản ghi dữ liệu. Khi click chọn bản ghi tương ứng, trang Detail sẽ hiển thị, cho phép người dùng (nếu có quyền) có thể đưa vào các dữ liệu mới thay cập nhật dữ liệu cũ về bản ghi đó.

* Kiểu Portlet đặc biệt :

Đây là loại Portlet đảm nhận các chức năng đặc biệt như cấu hình hệ thống, hiển thị các thông báo, thực hiện việc in ấn…

* Kiểu Portlet phụ thuộc nhà cung cấp :

Loại Portlet thực thi các tính năng tác nghiệp cụ thể của một Portal. Đây là các Portlet mà nhà phát triển Website tích hợp thêm vào khung Portal đã có sẵn.

Mô hình dữ liệu

JSR 168 định nghĩa các cơ chế khác nhau để Portlet có thể truy cập tới các dữ liệu giao dịch cũng như các dữ liệu bền vững.

Một Portlet có thể get và set các dữ liệu giao dịch thông qua các hình thức sau :

* Request : Đối tượng HttpRequest gắn vớí các dữ liệu thông qua các tham số truy vấn, các tham số này có thể được dùng để trao đổi và liên lạc giữa Portal và Portlet.
* Session : Portlet có thể lưu trữ dữ liệu lên các đối tượng HttpSession, đại diện cho một phiên làm việc. Vấn đề về phiên làm việc sẽ được đề cập ngay sau đây.
* Context : Portlet có thể lưu trữ dữ liệu trên đối tượng ngữ cảnh của Portal, vấn đề này cũng sẽ được nói cụ thể hơn.

Portlet có thể truy cập các dữ liệu bền vững thông qua các hình thức lưu trữ sau :

* Portlet : Portlet có thể lưu trữ các thông tin cá nhân hoá cũng như thông tin cấu hình trên đối tượng PortletPreference.
* User : Thông tin về cá nhân người dùng cũng được lưu trữ và quản lý thống nhất thông qua thuộc tính USER_INFO của đối tượng HttpRequest.

Vấn đề Quản lý phiên

JSR 168 quản lý phiên làm việc của người dùng dựa trên đối tượng HttpSession quen thuộc, tuy nhiên, cơ chế quản lý phiên trong JSR 168 rất thuận tiện và thống nhất, áp dụng pattern Singleton để đảm bảo tính bền vững và duy nhất của dữ liệu phiên. Các phiên làm việc trong JSR 168 có phạm vi hoạt động khác nhau. Biến phiên mức Portlet để lưu trữ dữ liệu tạm thời trong bản thân nội tại một Portlet. Biến phiên mức Portal dùng để trao đổi dữ liệu giữa các Portlet.

Tích hợp Portlet với JSP và Servlet

Để có thể cài đặt mô hình Model-View-Controller cho một Portal, Portlet có thể tích hợp nội dung tạo bởi một trang JSP hay một Servlet. Như thế, Portlet sẽ đóng vai trò một Controller, Servlet đóng vai trò Model còn việc hiển thị là nhiệm vụ của các trang JSP.

Ngữ cảnh Portal (Portal Context)

Để các Portlet có thể tích hợp vào portal và sau này portal có thể gọi đến chúng, JSR 168 cung cấp lớp PortalContext. Lớp này cung cấp các thông tin cụ thể của Portal. Thông qua lớp PortalContext, các Portlet có thể xác định các thông số cần thiết để gắn kết vào Portal.

Tính năng Đa ngôn ngữ (Localization)

JSR 168 cung cấp tính năng đa ngôn ngữ với hai cấp độ : cấp độ toàn Website và cấp độ cho từng Portlet. Ở cấp độ toàn Website, giao diện điều khiển của Portal được hiện thị theo ngôn ngữ đã thiết lập trong thuộc tính xml:lang. Và chỉ có các quản trị Portal mới có quyền thay đổi thiết lập này. Ở cấp độ từng Portlet, dựa vào gói tài nguyên cung cấp, giao diện của từng Portlet được hiện thị theo ngôn ngữ của gói tài nguyên đó. Các gói tài nguyên này thường là các file XML đặc tả giao diện theo ngôn ngữ cần hiển thị. Chúng ta có thể lấy về tham chiếu của gói tài nguyên hiện tại bằng phương thức getResourceBundle() của đối tượng PortletContext.

Ngoài các vấn đề cơ bản trên, JSR 168 cũng đặc tả để Portal cần xây dựng có các tính năng tiên tiến như caching, quản lý thống nhất thông tin người dùng, trao đổi thông tin giữa Portlet và Portlet Container cũng như việc đóng gói và triển khai một Portal.

JSR 168 chỉ là một chuẩn đặc tả, giúp cho nhà phát triển có thể xây dựng một Website theo đúng chuẩn, thống nhất, thuận tiện. Còn phần lớn các chức năng thông thường vẫn chưa được cài đặt.

Một Portal thật sự là một portal có sẵn các chức năng thông thường cũng như cho phép dễ dàng tích hợp thêm những module tác nghiệp. Trong loạt bài này tôi chỉ biên tập và đề cập đến 3 loại portal :

Dùng công nghệ Microsoft : DotNetNuke – Portal nổi tiếng nhất được viết trên nền tảng Microsoft Dotnet, và cũng là portal được sử dụng nhiều nhất ở Việt Nam.

Dùng công nghệ Java : Liferay – Portal J2EE mã nguồn mở nổi tiếng giành được hàng loạt các giải thưởng (Best Open Source Software 2007 – Best Open Source Portal – CIO 100)

Dùng công nghệ PHP + MySQL : Joomla CMS Portal – Một CMS mã nguồn mở được ưa chuộng ở Việt Nam hiện nay.

Mỗi giải pháp, mỗi dòng sản phẩm tương ứng với qui mô khác nhau khi áp dụng vào thực tế hệ thống thông tin doanh nghiệp.

About eagle081183

Passionate, Loyal
This entry was posted in Portal, SOA, Software architecture, Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s