2013-04-06 33 views
25

Sự khác biệt giữa FacesContextExternalContext là gì? Khi nào tôi có thể sử dụng cái này hay cái khác? Cái gì và cái kia có cái gì?Sự khác nhau giữa FacesContext và ExternalContext

Các mẫu sau đây là từ cuốn sách JavaServer Faces 3rd edition:

<h:commandButton ... actionListener="#{rushmore.handleMouseClick}" /> 

Sao đậu:

public void handleMouseClick(ActionEvent e) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    String clientId = e.getComponent().getClientId(context); 
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap(); 
    // ... 
} 

Tại sao yêu cầu tham số trong ExternalContext? clientId là gì? Nó được tạo ra bởi JSF khi ứng dụng được bắt đầu?

Trả lời

40

Hãy xem kỹ các javadocs của chúng để xem phương thức nào chúng cung cấp và chính xác những gì tất cả các phương pháp đó đều làm.

Nếu bạn nhìn sâu hơn về các phương pháp đó được liệt kê trong javadoc, bạn sẽ nhận thấy rằng FacesContext thường có thể sử dụng JSF cụ thể hiện vật mà là tiếp tục không có cách nào liên quan đến Servlet "" cơ bản hoặc API Portlet mà JSF được thiết kế để chạy trên đầu trang. Ví dụ. tạo các trình biến đổi, trình duyệt tính hợp lệ, các thành phần, biểu thức EL, etcetera và lấy thông tin về khung nhìn gốc, các ngôn ngữ được hỗ trợ, etcetera và thêm các trình lắng nghe pha, các trình lắng nghe sự kiện hệ thống, etcetera. Mọi thứ dành riêng cho API JSF.

Và, ExternalContext thường cung cấp quyền truy cập vào các đồ tạo tác của Servlet hoặc Portlet cụ thể mà JSF hiện đang sử dụng "dưới nắp". Ví dụ: khi chạy trên vùng chứa Servlet, HTTP servlet request, HTTP servlet response, HTTP sessionServlet context và vốn dĩ cũng là tất cả các tạo tác của chúng. Nhấp vào các liên kết đó, bạn sẽ thấy rằng chúng lần lượt cung cấp các phương thức cũng được ủy quyền bởi ExternalContext, chẳng hạn như getRequestParameterMap(). Xem thêm the javadoc. Vâng, cũng nhấp vào liên kết đó, bạn sẽ thấy rằng nó đề cập đến một cách rõ ràng theo yêu cầu servlet:

Servlet: Đây phải là tập hợp các thông số có sẵn thông qua các phương pháp javax.servlet.ServletRequestgetParameter()getParameterNames().

có thể được cung cấp bởi các cả ngữ cảnh. Vì vậy, hoàn toàn không có lý do để thích cái này hay cái kia. Chỉ cần sử dụng một trong những quyền cho công việc bạn cần phải thực hiện.

Đối với ID khách hàng, nó thực sự được tạo bởi JSF, nhưng chắc chắn không phải trên khởi động của máy chủ. Nó chỉ được tạo cho mỗi thành phần JSF đơn trên cơ sở mỗi lần xem. Trong trường hợp của các thành phần đầu vào như <h:inputText>, mà tạo ra một phần tử HTML <input>, nó cũng trở thành thuộc tính name như vậy

<input type="text" id="formId:inputId" name="formId:inputId" ... /> 

Các formId:inputId chính là JSF client ID. Nó trở thành tên tham số yêu cầu. Biểu diễn HTML của nút lệnh cũng có một name kết thúc dưới dạng tên thông số yêu cầu với giá trị của nút làm giá trị tham số.

Các vấn đề liên quan