JSF

**JSF** là viết tắt của **JavaServer Faces**, một bản miêu tả kĩ thuật giúp đơn giản hóa việc phát triển giao diện cho các ứng dụng Web viết bằng Java bằng cách dùng các thành phần dùng lại được (*reusable components*).

JSF là một bộ khung (framework) phát triển các ứng dụng Web viết bằng Java nhằm làm đơn giản hóa quá trình phát triển giao diện người dùng cho các ứng dụng J2EE. Để tạo ra giao diện hiển thị, JSF dùng dạng cấu trúc cây của các thẻ, mỗi thẻ là một thành phần giao diện (*component*) và **FacesServlet** servlet sẽ thực hiện công đoạn chuyển đổi ra giao diện tương ứng cho người dùng với định dạng HTML. Ngoài ra, JSF cũng có thể sử dụng các kĩ thuật hiển thị khác, như XUL. JSF bao gồm:

#Một tập các hàm API để biểu diễn các thành phần UI (giao diện người dùng) và quản lý trạng thái của chúng, xử lý các sự kiện và kiểm tra dữ liệu đầu vào, quy định việc di chuyển trang (*page navigation*), hỗ trợ tính đa ngôn ngữ và hỗ trợ cho người sử dụng (*accessibility*)
#Một số thành phần (component) có sẵn
#Hai thư viện chứa các thẻ tùy biến JSP (*JavaServer Pages custom tag*) để có thể biểu diễn một **JavaServer Faces interface** bên trong một trang JSP.
#Mô hình sự kiện ở phía máy chủ (server-side event model)
#Khả năng quản lý trạng thái
#Managed Beans (JavaBeans được tạo bằng **[[dependency injection]]** - xem thêm Spring framework)

Bản miêu tả kĩ thuật JSF được quy định trong JSR 127 của Quá trình Cộng đồng Java.

## Mục tiêu của JSF

8 mục tiêu thiết kế sau là lý do cho sự ra đời của JSF:

# Tạo ra một bộ khung gồm các thành phần giao diện người dùng chuẩn (*standard GUI component framework*) nhằm giúp cho các công cụ phát triển dễ dàng hơn cho người dùng trong việc tạo GUI chất lượng cao đồng thời quản lý các kết quả của GUI với xử lý thực thi của chương trình.
# Định ra một tập các lớp cơ sở của Java (*lightweight Java base classes*) biểu diễn cho các thành phần UI, trạng thái mỗi thành phần, và các sự kiện đầu vào. Những lớp này sẽ xử lý những vấn đề liên quan đến chu kì sống của GUI, đặc biệt là quản lý trạng thái trong suốt chu trình sống của một trang của thành phần GUI đó.
# Cung cấp một tập các thành phần GUI chung, bao gồm các thành phần *HTML form input*. Những thành phần này sẽ được dẫn xuất từ tập đơn giản các lớp cơ sở (đề cập ở #1) đề từ đó có thể định ra các thành phần mới.
# Cung cấp một mô hình JavaBeans để có thể truyền đi (dispatch) các sự kiện từ các GUI controls phía máy khách đến các xử lý hiện thực cụ thể từ phía ứng dụng máy chủ.
# Định ra các hàm APIs để kiểm chứng dữ liệu nhập, bao gồm hỗ trợ kiểm chứng từ phía máy chủ.
# Chỉ định một mô hình để có thể đa ngôn ngữ hóa hay địa phương hóa các GUI.
# Khởi tạo tự động dữ liệu ra phù hợp cho máy khách đích, dựa vào mọi dữ liệu cấu hình ở máy khách đó, bao gồm cả dựa vào phiên bản trình duyệt, ví dụ.
# Việc khởi tạo tự động dữ liệu ra còn kèm theo các đòi hỏi về hỗ trợ người dùng (*accessibility*), được quy định bởi WAI.

## Đặc điểm
Mô hình của JSF là mô hình xử lý hướng sự kiện giống như trong các ứng dụng GUI truyền thống, sự khác biệt là nó được áp dụng cho các ứng dụng Web.

## Các phiên bản JSF
* JSF 1.0 - bản miêu tả kĩ thuật của JSF chính thức đầu tiên
* JSF 1.1 - bản sửa lỗi chính thức. Không có thay đổi về kĩ thuật hay *HTML renderkit*.
* JSF 1.2 - bản chính thức chuẩn bị ra mắt và được miêu tả bởi JSR 252. 
** những cải tiến để cung cấp những giải pháp tạm thời cho vấn đề *trộn lẫn nội dung* (*content-interweaving problem*) được nói đến tại http://www.onjava.com/pub/a/onjava/2004/06/09/jsf.html
** cung cấp các XML Schema cho các file cấu hình, thay cho việc dùng DTD
** các cải tiến để cho phép các **faces applications'' có thể xử lý nhiều khung (''multi-frame''), hay các thiết kế đa cửa sổ người dùng (''multi-window UI'') 
** các cải tiến thư viện thể f: để nâng cao **TCK coverage*, các sự kiện liên quan chu trình sống của f:view, và một số đặc tính nhỏ khác
** các cải tiến trong việc hỗ trợ <code>*trang trí*</code> cho các đối tượng API
** cải tiến an ninh cho phía trình khách trong việc lưu giữ trạng thái
** giải quyết vấn đề "duplicate button press"
** tổ chức lại bản miêu tả kĩ thuật theo từng phần tiêu chuẩn (*normative*), và không tiêu chuẩn, để giúp cho việc hiện thực dễ dàng hơn.
** Các sửa lỗi cho *'portlet'''
** Một số sửa lỗi đòi hỏi sự thay đổi chút ít trong bản miêu tả kĩ thuật

## Các hiện thực của JSF
Có hai hiện thực cho JSF được biết cho đến nay:
* JSF Reference Implementation của Sun Microsystems
* Dự án MyFaces của Apache
### Công cụ
* ICEfaces : Complete Ajax-enabled JSF component library.
* Rialto JSF : JSF encapsulation of Rialto.

## Xem thêm
* GUI
* Cổng Web

## Tham khảo

* JavaServer Faces
* Tiêu chuẩn JSF
* JSF FAQ 
* JSF 127
* JSF 252

## Sách
* David Geary, Cay Horstmann: Core JavaServer Faces, Prentice-Hall, ISBN 0131463055
* Kito D. Mann: JavaServer Faces in Action, Manning Publications Company, ISBN 1932394125
* Bill Dudney, Jonathan Lehr, Bill Willis, LeRoy Mattingly: Mastering JavaServer Faces, John Wiley & Sons, ISBN 0471462071
* Hans Bergsten: JavaServer Faces, O'Reilly & Associates, ISBN 0596005393
* Budi Kurniawan, Nancy Maragioglio: JavaServer Faces Programming, McGraw-Hill Osborne Media, ISBN 0072229837
* James Turner, Craig McClanahan, Kunal Mittal: JavaServer Faces Kick Start, SAMS, ISBN 0672325993

## Các liên kết ngoài
* JSF  của Cộng đồng JavaServer Faces 
* Phần về JSF  trong hướng dẫn của J2EE 
* Hướng dẫn JSF: ví dụ và danh mục các bài viết 
* JSF FAQ