Gần đây tôi đã viết khá nhiều về framework JSF, nên giờ là lúc tôi tổng hợp một bài về các câu hỏi và trả lời phỏng vấn JSF. Dưới đây là bộ sưu tập câu hỏi kèm câu trả lời về JSF mà tôi đã chuẩn bị. Bạn chỉ cần đọc qua trước khi phỏng vấn, tôi chắc chắn nó sẽ giúp bạn tự tin hơn và tăng khả năng thành công trong phỏng vấn JSF, từ đó có cơ hội nhận được công việc. Lưu ý rằng bộ câu hỏi này áp dụng cho JSF 2, không phải JSF 1.

Câu hỏi phỏng vấn JSF và câu trả lời
1. JSF là gì?
Java Server Faces (JSF) là một front-end framework giúp việc xây dựng các thành phần giao diện người dùng trở nên dễ dàng hơn nhờ khả năng tái sử dụng các thành phần UI. JSF được thiết kế dựa trên mô hình Model View Controller (MVC), trong đó tách biệt phần presentation ,controller và phần business logic. Để bắt đầu với JSF, bạn có thể tham khảo JSF Tutorial for Beginners.
2. Managed Bean là gì?
Managed Bean là một Java class được đăng ký với JSF, cho phép tương tác giữa UI và business logic. Managed Beans có thể được tạo bằng annotation @ManagedBean. Để xem ví dụ chi tiết, bạn có thể tham khảo JSF Managed Bean Example.
3. JSF cung cấp những loại text fields tag nào?
Có ba loại text field tag trong JSF:
- <h:inputText> – Thêm một ô nhập liệu bên cạnh nhãn.
- <h:inputSecret> – Dùng cho các trường mật khẩu, trong đó dữ liệu nhập sẽ được ẩn đi.
- <h:inputTextarea> – Dùng cho trường nhập văn bản dài, cho phép nhập nhiều ký tự.
Ví dụ đầy đủ có thể tham khảo trong JSF Text Components.
4. Ý nghĩa của annotation @ManagedProperty là gì?
Annotation @ManagedProperty cho phép chúng ta inject một managed bean vào trong một managed bean khác. Để tìm hiểu cách hoạt động, bạn có thể tham khảo JSF Injecting Managed Bean.
5. Annotation @ApplicationScoped biểu thị điều gì
Annotation @ApplicationScoped cho biết bean sẽ có hiệu lực miễn là ứng dụng web còn hiệu lực.
6. Resource bundling trong JSF là gì?
Hiện tượng lưu trữ các nhãn giao diện người dùng (UI labels), ngày tháng, thông báo trạng thái và các thành phần văn bản khác của giao diện trong một tệp properties riêng thay vì viết cứng (hardcode) trực tiếp trong trang được gọi là resource bundling.
Chúng ta có thể sử dụng thẻ h:outputLabel để lấy các giá trị này từ tệp resource bundle trong các trang JSF view.
7. Giải thích thuộc tính required và requiredMessage của thẻ <h:inputText>?
Thuộc tính required cho biết trường là bắt buộc khi được đặt thành true. Thuộc tính requiredMessage cho phép người dùng chỉ định thông báo riêng cho các thành phần UI khi các trường này là bắt buộc.
Chúng được sử dụng cho việc xác thực khai báo (declarative validation) trong các trang JSF view.
8. Các loại Page Navigation khác nhau được hỗ trợ trong JSF là gì?
Các loại điều hướng trang được hỗ trợ trong JSF bao gồm:
-
Điều hướng ngầm định (Implicit Navigation)
-
Điều hướng thông qua Managed Bean
-
Điều hướng thông qua faces-config.xml
-
Điều hướng Forward so với Redirect
-
Điều hướng có điều kiện (Conditional Navigation)
9. Các giai đoạn (phases) trong vòng đời (life cycle) của JSF là gì?
Có sáu giai đoạn (lifecycle phases) trong vòng đời của một JSF page, bao gồm:
-
Restore View Phase
-
Apply Request Values Phase
-
Process Validations Phase
-
Update Model Values Phase
-
Invoke Application Phase
-
Render Response Phase
Mỗi giai đoạn giữ một vai trò quan trọng trong việc xử lý và hiển thị trang. Để hiểu chi tiết hơn về cách từng phase hoạt động cũng như mối liên hệ giữa chúng
10. Giải thích một số thuộc tính của thẻ <h:form> trong JSF?
Một số thuộc tính quan trọng của thẻ h:form bao gồm:
-
id: Định danh (unique identifier) để nhận diện component.
-
title: Tiêu đề cho phần tử trong form, hiển thị như tooltip.
-
onclick: Gọi hàm JavaScript khi nút được nhấn cạnh một phần tử.
-
onsubmit: Gọi hàm JavaScript khi form được submit bằng nút submit.
-
onreset: JavaScript được gọi khi reset các phần tử trong form.
-
ondblclick: JavaScript được thực thi khi nhấp đúp chuột vào một trường trong form.
-
onmouseup: JavaScript được thực thi khi thả chuột trên một component.
-
onmousedown: JavaScript được thực thi khi nhấn chuột xuống trên phần tử này.
-
binding: Biểu thức liên kết tới một property trong backing bean.
-
target: Tên frame nơi tài nguyên được tải về sẽ hiển thị.
-
accept: Danh sách nội dung mà form có thể xử lý.
-
acceptCharSet: Danh sách bộ mã ký tự (character encoding) mà form chấp nhận.
-
style: Các định nghĩa CSS có thể áp dụng cho form.
-
prependId: Cờ cho biết có thêm tiền tố id cho form hay không.
-
dir: Ghi đè hướng văn bản mặc định của component.
11. Các command component tag nào được dùng cho action và navigation trong JSF?
Các thẻ command component dùng để thực hiện action và navigation bao gồm:
-
<h:commandButton>-
Thẻ này render một nút bấm (button) để submit form, từ đó xử lý dữ liệu mà người dùng đã nhập.
-
-
<h:commandLink>-
Thẻ này tạo ra một hyperlink (tương tự thẻ anchor trong HTML) nhưng hoạt động như một nút submit. Nó có thể gắn với backing bean hoặc action class để xử lý sự kiện.
-
12. Data Bound table components là gì trong JSF?
Các component chịu trách nhiệm hiển thị dữ liệu quan hệ dưới dạng bảng được gọi là data bound table components.
-
Thẻ
<h:dataTable>được sử dụng để hiển thị dữ liệu dạng bảng. -
Thẻ
<h:column>lặp qua từng bản ghi trong nguồn dữ liệu và hiển thị chúng thành các hàng (rows).
Một số thuộc tính quan trọng của h:dataTable gồm có:
-
bgcolor: Màu nền của bảng được hiển thị.
-
border: Độ rộng (pixel) của viền bảng.
-
cellpadding: Khoảng cách giữa viền ô và nội dung bên trong ô.
-
cellspacing: Khoảng cách giữa cạnh trái bảng và cột đầu tiên, đồng thời là khoảng cách giữa các ô.
-
columnClasses: Danh sách các CSS style (ngăn cách bởi dấu phẩy) được áp dụng cho các cột của bảng.
-
bodyrows: Danh sách chỉ số hàng (ngăn cách bởi dấu phẩy) chỉ định từ hàng nào sẽ được áp dụng cho phần tử
<tbody>.
13. Event trong JSF là gì?
Sự kiện (event) được định nghĩa là một tín hiệu được kích hoạt dựa trên hành động của người dùng, chẳng hạn như nhấn nút, nhấp vào hyperlink, thay đổi giá trị input, v.v. Trong JSF, component sẽ gọi đến listener class phù hợp để xử lý sự kiện mà người dùng đã tạo ra.
14. Làm thế nào để lấy được event được sinh ra trong JSF?
Sự kiện được tạo ra có thể được lấy bằng cách gọi event.getComponent, ví dụ:
UIComponent ui = new UIComponent();
MyFacesEvent ev1 = new MyFacesEvent(ui);
UIComponent sc1 = ev1.getComponent();
15. Các loại JSF events khác nhau là gì?
Có ba loại sự kiện (JSF events) chính, bao gồm:
-
Action Events:
-
Là các sự kiện được tạo ra từ những UI component như command button hoặc command hyperlink.
-
-
Value Change Events:
-
Xuất hiện ở các UI component như textfield, radio button, list box, v.v.
-
Sự kiện này sẽ được kích hoạt ngay khi giá trị trong component thay đổi.
-
-
Phase Events:
-
Là những sự kiện xảy ra trong một trong sáu giai đoạn (phases) của vòng đời JSF, có thể ở lúc bắt đầu hoặc kết thúc mỗi phase.
-
16. Listener class trong JSF là gì?
Một class được gắn với một sự kiện được gọi là listener class.
Ví dụ: nếu sự kiện là valueChange event thì listener class tương ứng sẽ là ValueChangeListener.
17. Ý nghĩa của Facelets tag trong JSF là gì?
JSF cung cấp một tập hợp tag đặc biệt giúp bạn có thể quản lý các thẻ/thành phần dùng chung ở một nơi cho nhiều ứng dụng. Các tag này cho phép tạo ra một layout chung có thể sử dụng xuyên suốt trong nhiều ứng dụng khác nhau.
<html xmlns=”https://www.w3.org/1999/xhtml” xmlns:ui=”https://java.sun.com/jsf/facelets“
18. Một số Facelets tags trong JSF là gì?
Một số facelets tags quan trọng bao gồm:
-
<ui:component> -
<ui:composition> -
<ui:decorate> -
<ui:define> -
<ui:fragment> -
<ui:include>
19. Các loại validation khác nhau trong JSF là gì?
Có hai loại validation trong JSF, bao gồm:
-
Declarative Validations:
-
Các validation được kích hoạt thông qua JSF standard validators hoặc Bean validators đều thuộc loại declarative.
-
-
Imperative Validations:
-
Trong nhiều trường hợp, các thông báo validation mặc định là chưa đủ. Khi cần các kiểm tra phức tạp hơn do người dùng tự định nghĩa và ghi đè lên validation tiêu chuẩn, ta gọi đó là imperative validation.
-
20. Các loại expression khác nhau được JSF EL hỗ trợ là gì
JSF Expression Language (EL) hỗ trợ các loại biểu thức sau:
-
Immediate value expressions
-
Deferred value expressions
-
Value expression và Method expression
21. Immediate và Deferred Value Expressions trong JSF là gì?
Immediate expressions được đánh giá (evaluate) và hiển thị kết quả ngay khi trang vừa được load lần đầu. Cú pháp cho immediate evaluation là ${}.
Deferred expressions được đánh giá trong các giai đoạn của vòng đời (lifecycle phase) khi người dùng thực sự gọi đến. Cú pháp cho deferred evaluation là #{expression}.
22. Giải thích Value Expression và Method Expression trong JSF EL?
Value expressions thường được dùng để lấy (fetch) hoặc gán (set) giá trị. Các biểu thức này được chia thành hai loại:
-
lvalue expressions: Có thể đọc và ghi dữ liệu.
-
rvalue expressions: Chỉ có thể đọc dữ liệu.
Method expression cho phép người dùng gọi một phương thức public trong bean, phương thức này trả về kết quả cần thiết để xác thực (validate) dữ liệu của component và xử lý sự kiện.
23. Giải thích các annotation @ViewScoped, @SessionScoped, @CustomScoped và @RequestScoped trong JSF?
-
@ViewScoped: Annotation cho biết bean sẽ tồn tại miễn là người dùng còn tương tác với cùng một trang JSF view trong trình duyệt.
-
@SessionScoped: Annotation cho biết bean sẽ hợp lệ trong suốt thời gian HTTP session còn tồn tại.
-
@CustomScoped: Annotation cho biết bean sẽ tồn tại miễn là entry của nó trong custom Map (được tạo cho scope này) còn tồn tại.
-
@RequestScoped: Annotation cho biết bean chỉ tồn tại trong vòng đời của một HTTP request–response.
24. Giải thích các cách khai báo Managed Bean trong JSF?
1. Sử dụng annotation @ManagedBean trong lớp Java để chỉ ra rằng lớp đó là một managed bean, ví dụ:
@ManagedBean(name="Greetings", eager="true")
Nếu không chỉ định thuộc tính name, tên sẽ được mặc định theo tên lớp dựa trên tiêu chuẩn đặt tên của Java. Ví dụ: lớp Car sẽ có tên là "car" và CarDetails sẽ có tên là "carDetails".
2. Khai báo managed bean trong file faces-config.xml như sau:
<managed-bean>
<managed-bean-name>Greetings</managed-bean-name>
<managed-bean-class>com.Greetings.Greetings</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean-name>Greetings</managed-bean-name>
<managed-bean-class>com.Greetings.Greetings</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
25. Ý nghĩa của thuộc tính name và eager trong managed bean?
-
name: Thuộc tính name chỉ định tên cho managed bean. Nếu không khai báo, tên bean sẽ mặc định giống với tên lớp.
-
eager: Nếu eager được đặt là
"true"thì managed bean sẽ được khởi tạo ngay khi ứng dụng chạy, trước khi có yêu cầu đầu tiên. Nếu đặt là"false", bean chỉ được tạo khi có yêu cầu gọi đến nó.
26. Một số validator tag được sử dụng trong JSF?
-
f:validateLength: Kiểm tra độ dài của chuỗi.
-
f:validateLongRange: Kiểm tra phạm vi của giá trị số nguyên.
-
f:validateDoubleRange: Kiểm tra phạm vi của giá trị số thực (float/double).
-
f:validateRegex: Kiểm tra thành phần JSF bằng một biểu thức chính quy được chỉ định.
27. Lợi ích của việc sử dụng JSF Framework?
Một số lợi ích khi sử dụng framework JSF bao gồm:
-
Tách biệt rõ ràng giữa phần trình bày (presentation) và logic nghiệp vụ (business logic).
-
Quản lý trạng thái giao diện người dùng (UI state) qua nhiều yêu cầu đến server.
-
Hỗ trợ triển khai các thành phần (component) tùy chỉnh.
-
Dễ dàng luân chuyển dữ liệu giữa các thành phần.
-
Cung cấp các đặc tả (specs) JSF, hỗ trợ cho những triển khai tùy chỉnh như PrimeFaces.
28. Các Converter tag khác nhau trong JSF là gì?
-
f:convertNumber: Thẻ dùng để chuyển đổi một giá trị chuỗi thành số theo định dạng yêu cầu.
-
f:convertDateTime: Thẻ dùng để chuyển đổi một giá trị chuỗi thành ngày theo định dạng yêu cầu.
-
CustomConverter: Cho phép người dùng tự định nghĩa bộ chuyển đổi (converter) riêng trong JSF.
29. Các lợi ích của Expression Language?
-
Có thể sử dụng các phép toán số học, logic và quan hệ trong Expression Language.
-
Tự động chuyển đổi kiểu dữ liệu.
-
Hiển thị giá trị thiếu dưới dạng chuỗi rỗng thay vì gây ra NullPointerException.
-
Cung cấp khả năng truy cập dễ dàng đến các đối tượng được định nghĩa sẵn như request.
30. Các thư viện tag chuẩn trong JSF là gì?
- Thư viện thẻ JSF Core
- Thư viện thẻ JSF HTML
Sử dụng cấu hình namespace dưới đây để dùng chúng trong các trang xhtml của JSF:
<html xmlns="<https://www.w3.org/1999/xhtml>"
xmlns:h="<https://java.sun.com/jsf/html>"
xmlns:ui="<https://java.sun.com/jsf/facelets>"
xmlns:c="<https://java.sun.com/jsf/core>">
Các thẻ HTML bây giờ có thể được sử dụng với tiền tố h, ví dụ: <h:head>, <h:form>… và các thẻ core được dùng với tiền tố c.
31. Một số chức năng mà phương thức trong Backing Bean thực hiện?
-
Xác thực dữ liệu của một component
-
Xử lý sự kiện được kích hoạt bởi component
-
Thực hiện xử lý để xác định trang tiếp theo mà ứng dụng cần điều hướng đến
32. Các implementation khác nhau của JSF API?
-
ADF Faces: Triển khai JSF của Oracle.
-
Reference Implementation (RI): Triển khai tham chiếu do Sun Microsystems phát triển.
-
Apache MyFaces: Triển khai JSF mã nguồn mở.
-
PrimeFaces: Bộ component JSF tích hợp với framework Ajax.
33. Giải thích kiến trúc JSF?
JSF được phát triển dựa trên mô hình Model View Controller (MVC). Mô hình này tách biệt logic nghiệp vụ khỏi phần trình bày.
Ứng dụng JSF bao gồm:
-
Các thành phần UI (UI components) được biểu diễn dưới dạng đối tượng có trạng thái trên server.
-
Các lớp trợ giúp (helper classes) phía server.
-
Các bộ kiểm tra dữ liệu (validators), bộ xử lý sự kiện (event handlers) và bộ xử lý điều hướng (navigation handlers).
-
Tệp tài nguyên cấu hình ứng dụng để thiết lập các tài nguyên cần dùng.
-
Các thành phần JavaBeans đóng vai trò model, chứa dữ liệu và chức năng đặc thù của ứng dụng.
-
Thư viện thẻ tùy chỉnh (custom tag library) để biểu diễn event handlers và validators.
-
Thư viện thẻ tùy chỉnh để render (hiển thị) các UI components.
34. Cách các component khác nhau được render trong JSF page?
Các thành phần JSF (JSF components) được render trong các trang xhtml thông qua các thư viện thẻ (tag libraries) được khai báo, chẳng hạn như JSF core, JSF html và Facelets tag libraries.
35. JSF có hỗ trợ nhiều faces configuration files?
Có, bạn có thể sử dụng bất kỳ số lượng tệp cấu hình faces nào, nhưng chúng cần được khai báo trong tệp web.xml như minh họa bên dưới.
<?xml version=”1.0″ encoding=”UTF-8″?> <web-app version=”3.1″ xmlns=”https://xmlns.jcp.org/xml/ns/javaee” xmlns:xsi=”https://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd“> <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config1.xml,/WEB-INF/faces-config2.xml</param-value> </context-param> </web-app>
36. Sự khác biệt giữa Backing Bean và Managed Bean trong JSF là gì?
Backing Bean nên được định nghĩa trong request scope, trong khi Managed Bean có thể được định nghĩa trong request, session hoặc application scope.
Backing Bean được tham chiếu trực tiếp bởi một form, còn Managed Bean được đăng ký với JSF và sẽ được tạo tự động khi cần.
37. Cách hiển thị thông báo lỗi trong JSF?
Thẻ h:messages hiển thị tất cả các thông báo lỗi tại một chỗ, tương ứng với các phần tử giao diện (UI elements).
Thuộc tính “for” có thể được sử dụng để chỉ định trường mà thông báo lỗi cần hiển thị.
38. Ý nghĩa của thẻ selectOneMenu trong JSF?
selectOne cho phép người dùng chọn một giá trị duy nhất từ danh sách các giá trị. Thành phần này có thể được hiển thị dưới dạng hộp danh sách (list box), tập hợp các nút radio (radio buttons) hoặc menu.
39. Giải thích thuộc tính immediate và rendered?
Thuộc tính immediate nếu được đặt thành true có thể buộc việc kiểm tra hợp lệ (validation), xử lý sự kiện (event) và chuyển đổi dữ liệu (conversion) diễn ra ngay trong giai đoạn request của vòng đời JSF.
Thuộc tính immediate của một command component (như button) chỉ định điều gì sẽ xảy ra khi component đó được kích hoạt. Nếu button có thuộc tính immediate=true và trường văn bản (text field) liên quan có immediate=false, thì sự kiện sẽ được xử lý mà không áp dụng giá trị của trường vào model. Nói cách khác, giá trị nhập trong text field sẽ không được truyền đến model khi nhấn nút, mà sự kiện sẽ được xử lý ngay lập tức.
Thuộc tính rendered cho biết một component có được hiển thị trong trang view hay không. Thuộc tính này có thể sử dụng toán tử số học và hằng số với biểu thức rvalue, nhưng không hỗ trợ lvalue expressions.
40. Hai cách binding được JSF hỗ trợ?
-
Ràng buộc giá trị của component với một thuộc tính của bean hoặc một nguồn dữ liệu bên ngoài khác.
-
Ràng buộc instance (thể hiện) của component với một thuộc tính của bean.
41. Các cấu hình bắt buộc cho framework JSF?
Có hai tệp cấu hình chính:
-
web.xml: Đây là tệp cấu hình chung của ứng dụng web, chứa các thông tin triển khai. Trong đó có tham chiếu đến tệp faces-config chịu trách nhiệm xử lý ứng dụng.
-
faces-config.xml: Cho phép cấu hình ứng dụng, định nghĩa các managed beans, converters, validators và điều hướng (navigation).
42. Vai trò của các thẻ converter trong JSF?
Các thẻ converter dùng để chuyển đổi dữ liệu của UI component thành đối tượng được sử dụng trong managed bean và ngược lại.
Ví dụ: các thẻ này có thể chuyển đổi một chuỗi văn bản thành đối tượng ngày (date object) và đồng thời kiểm tra định dạng của dữ liệu đầu vào.
43. Các lợi ích của thẻ data table trong JSF?
-
DataTable có thể lặp qua một tập hợp (collection) hoặc mảng giá trị để hiển thị dữ liệu.
-
DataTable cung cấp các thuộc tính giúp chỉnh sửa dữ liệu một cách dễ dàng.
44. Cách triển khai internationalization (i18n) trong JSF?
Internationalization (i18n) là một cơ chế trong đó các thông báo trạng thái, nhãn của thành phần giao diện (GUI), đơn vị tiền tệ, ngày tháng… được lưu trữ bên ngoài mã nguồn trong resource bundle và được truy xuất động dựa trên locale (ngôn ngữ/vùng) của người dùng, thay vì viết cứng trong chương trình.
45. Component rendering model là gì?
Kiến trúc thành phần của JavaServer Faces (JSF) được thiết kế theo cách mà chức năng của các component được định nghĩa bởi các lớp component, trong khi quá trình render (hiển thị) thực tế có thể được định nghĩa bởi một renderer riêng, được gọi là mô hình render component (component rendering model).
Đó là tất cả các câu hỏi và trả lời phỏng vấn về JSF, hy vọng chúng sẽ giúp bạn trong các cuộc phỏng vấn liên quan đến JSF.