Hãy tưởng tượng trang JSF có một số thành phần như <h:selectOneMenu>
, <h:dataTable>
, <h:panelGrid>
, v.v. Mỗi thành phần có một ID. Có phương pháp hay kỹ thuật nào mà tôi có thể lấy các thành phần lập trình khi hàm tạo của bean được gọi không?Lập trình UIC thành phần của khung nhìn JSF trong hàm tạo của bean
Trả lời
Bạn có thể lấy cây thành phần bởi FacesContext#getViewRoot()
và tìm thấy một thành phần đặc biệt bởi ID UIComponentBase#findComponent()
:
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component = viewRoot.findComponent("someId");
// ...
Tuy nhiên, gốc xem là không trực tiếp có sẵn trong constructor của đậu cho mỗi gia nhập. Nó có thể trả lại null
về các yêu cầu GET cho chế độ xem trong đó bean không được tham chiếu trong thẻ hoặc thuộc tính thời gian tạo chế độ xem. Tuy nhiên, nó được đảm bảo khả dụng trong sự kiện xem trước hiển thị.
<f:event type="preRenderView" listener="#{bean.init}" />
với
public void init() {
// ...
}
Không liên quan cho vấn đề cụ thể, nó không phải là rõ ràng lý do tại sao bạn cần phải làm điều này, nhưng tôi có thể nói rằng đây là hơn thường là một mùi mã. Tôi đề nghị để điều tra nếu điều này thực sự là giải pháp đúng cho các yêu cầu chức năng cụ thể bạn đã có trong tâm trí. Để tìm manh mối và gợi ý, xem thêm How does the 'binding' attribute work in JSF? When and how should it be used? và How to use component binding in JSF right ? (request-scoped component in session scoped bean).
Mã này hoạt động cho tôi. Nhưng bạn phải chỉ định đường dẫn đầy đủ đến thành phần ví dụ "form: component1: someId" – Mindaugas
@Mindaugas: đó là chính xác nếu chúng lần lượt nằm trong 'NamingContainer'. Xem thêm liên kết đến javadoc của 'findComponent()' trong câu trả lời của tôi. – BalusC
@BalusC, "không liên quan" của bạn có giá trị nhất ở đây! – Maxym
Tôi đã thử giải pháp của bạn và nó đã hoạt động :). Ở đây tôi chỉ đăng câu trả lời của tôi rằng làm thế nào tôi đã làm nó. Trên thực tế, ai đó chỉ hỏi tôi câu hỏi này mà chúng tôi có thể nhận được tất cả các thành phần bên trong một nhà xây dựng khi trang của chúng tôi gọi, tức là tại sao tôi hỏi trên diễn đàn này :). Đây là mã của tôi
/** Creates a new instance of ExporterProfileUpdateRequestGrid */
public ExporterProfileUpdateRequestGrid() {
session = ConnectionUtil.getCurrentSession();
exporterProfileUpdateRequestList = new ArrayList<ExporterProfileUpdateRequest>();
int test = selectedRadioButton;
System.out.println();
//getExporterProfileUpdateRequestGrid();
} //end of constructor
@PostConstruct
public void init() {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent component1 = viewRoot.findComponent("exporterProfileUpdateRequestGrid"); //form id
HtmlForm form = (HtmlForm)component1;
List<UIComponent> componentList = form.getChildren();
for(int i=0; i<componentList.size(); i++) {
UIComponent component = componentList.get(i);
if (component instanceof Panel) {
Panel myPanel = (Panel)component;
List<UIComponent> panelComponentList = myPanel.getChildren();
for(int j=0; j<panelComponentList.size(); j++) {
UIComponent panelComponent = panelComponentList.get(j);
System.out.println();
}
System.out.println();
}
System.out.println();
} //end of for()
UIComponent component2 = viewRoot.findComponent("panel1"); //null
UIComponent component3 = viewRoot.findComponent("myTable"); // null
} //end of init
Tôi muốn hỏi rằng tôi có biểu mẫu (HtmlForm) ở đây, nhưng panel1 và myTable null, tại sao? Mặc dù tôi nhận được bảng điều khiển và bảng bằng cách kiểm tra trẻ em HtmlForm, nhưng tại sao tôi không thể nhận được chúng trực tiếp.
Cảm ơn
Nếu bảng điều khiển và bảng là về hình thức, hãy thử như sau:
UIComponent component2 = viewRoot.findComponent("exporterProfileUpdateRequestGrid").findComponent("panel1");
thấy điều này http://horrikhalid.com/2011/01/27/how-to-find-uicomponent-in-jsf/
public UIComponent findComponent(String id) {
UIComponent result = null;
UIComponent root = FacesContext.getCurrentInstance().getViewRoot();
if (root != null) {
result = findComponent(root, id);
}
return result;
}
private UIComponent findComponent(UIComponent root, String id) {
UIComponent result = null;
if (root.getId().equals(id))
return root;
for (UIComponent child : root.getChildren()) {
if (child.getId().equals(id)) {
result = child;
break;
}
result = findComponent(child, id);
if (result != null)
break;
}
return result;
}
- 1. Tạo và thêm thành phần hỗn hợp theo cách lập trình trong bean sao lưu
- 2. Lập trình tạo một khung nhìn tre trong phần chia sẻ dựa trên một cột
- 3. Lập trình hiển thị một khung nhìn từ một trình cắm thêm của Eclipse
- 4. Giảm phần đệm ô của khung nhìn hoặc lề
- 5. Vị trí nằm ngang của các thành phần trong JSF
- 6. Giá trị động ràng buộc của thành phần JSF
- 7. Android: chỉ đặt một phần khung nhìn văn bản được lập trình
- 8. Chuyển danh sách tới thành phần JSF mà không cần sử dụng bean
- 9. Sự khác biệt giữa khung nhìn và khung giới hạn của khung nhìn + iPhone
- 10. Thành phần tổng hợp JSF
- 11. JSF gọi phương thức sao lưu bean và các thành phần reRender trên phím ENTER
- 12. Lỗi trong tạo thành phần của jQuery?
- 13. Di chuyển JSF Managed Bean sang Spring bean
- 14. Đầu ra JSON của một khung nhìn trong Grails
- 15. JSF managed-bean EJB tiêm
- 16. Mục đích của các khung nhìn trong SQL là gì?
- 17. Trình duyệt có hiển thị các phần tử canvas không nằm trong khung nhìn không?
- 18. Cách cập nhật phần nhỏ của khung nhìn trong Backbone hoặc Spine
- 19. Có cách nào để thiết lập lại quy mô của khung nhìn động đến 1.0
- 20. Truy cập các giá trị của bean được quản lý JSF trong một bean được quản lý khác
- 21. Java Spring bean với hàm tạo riêng
- 22. Tại sao các biến mẫu của trình điều khiển của tôi không hoạt động trong các khung nhìn (Rails)
- 23. Tạo khung con của khung chính trong wxPython
- 24. gọi hàm tạo của một thành viên lớp trong hàm tạo
- 25. Tạo mã Python bằng pyside-uic
- 26. CSS: Chiều cao của vùng văn bản dưới dạng phần trăm chiều cao khung nhìn
- 27. Cách lặp qua các yếu tố của khung nhìn
- 28. Khởi tạo các biến thành viên trong phần đầu của định nghĩa lớp hoặc trong hàm tạo?
- 29. Thành phần tổng hợp đặt thuộc tính trong bean sao lưu của khách hàng của nó như thế nào?
- 30. JSF 1.2: Tôi có thể tạo thành phần có thể tái sử dụng bên trong chế độ xem JSF
"thực dụng" có một ý nghĩa hoàn toàn khác với "chương trình ". Vui lòng tham khảo một từ điển nếu bạn không chắc chắn về chính tả :) – BalusC