2013-05-30 32 views
9

Tôi có một Facelet có thể được sử dụng trong các ứng dụng khác nhau. Tôi không sao chép nó, nhưng tái sử dụng nó. Tôi cần chuyển đậu phụ sẽ quản lý chế độ xem dưới dạng thông số, vì một số logic có thể thay đổi tùy theo ứng dụng được sử dụng.Truyền bean sao lưu làm tham số cho một Facelet bao gồm

Tôi không muốn sử dụng thành phần hỗn hợp, nhưng chỉ bao gồm Facelet và chỉ định bean nào sẽ quản lý khung nhìn. Làm thế nào tôi có thể đạt được điều này?

Hãy để tôi đưa ra một ví dụ:

<ui:composition template="/resources/common/templates/template.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
    <ui:define name="content"> 
     <!-- somehow establish the backing bean that will manage formView.xhtml --> 
     <!-- f:set assign="ParameterBean" value="#{Bean}"/--> 
     <ui:include src="formView.xhtml" /> 
    </ui:define> 
</ui:composition> 

formView.xhtml:

<ui:composition template="/resources/common/templates/template.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
    <ui:define name="content"> 
     <h:outputText value="#{ParameterBean.texto}" /> 
    </ui:define> 
</ui:composition> 

Trả lời

22

Bạn có thể sử dụng <ui:param> cho điều đó. Nó cần được lồng trong <ui:include>.

<ui:include src="formView.xhtml"> 
    <ui:param name="ParameterBean" value="#{Bean}" /> 
</ui:include> 

Không liên quan cho vấn đề cụ thể, tiêu chuẩn Java Naming Conventions trạng thái đó dụ tên biến phải bắt đầu bằng chữ thường. Bạn nên thay đổi mã của mình theo cách tương ứng parameterBean#{bean} sẽ được sử dụng.

+0

làm thế nào để bạn tham khảo 'ParameterBean' để gọi các phương thức trên dụ? – Thufir

0

Bởi vì tôi sẽ đã tìm thấy nó hữu ích ngày hôm qua, khi tôi đang tìm kiếm này, đây là một phiên bản đơn giản về cách để làm điều này, mà không cần mẫu không liên quan, xác định và không gian tên:

File1.xhtml (gốc thẻ không quan trọng)

<ui:include src="File2.xhtml"> 
    <ui:param name="person" value="#{whatever_value_you_want_to_pass}" /> 
</ui:include> 

File2.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <h:outputLabel value="#{person.name}" /> 
</ui:composition> 


Bạn cũng có thể làm tổ hơn nữa trong theo cách tương tự.

File1.xhtml

<ui:include src="File2.xhtml"> 
    <ui:param name="person" value="#{whatever_value_you_want_to_pass}" /> 
</ui:include> 

File2.xhtml

<ui:composition ... xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <ui:include src="File3.xhtml"> 
    <ui:param name="name" value="#{person.name}" /> 
    </ui:include> 
</ui:composition> 

File3.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <h:outputLabel value="#{name.length}" /> 
</ui:composition> 
+0

Tôi không thấy điều này khác với câu trả lời dưới đây như thế nào? – Kukeltje

+0

Tôi đã có một thời gian khó hiểu chính xác làm thế nào câu trả lời được cho là được sử dụng vì vậy tôi đã cố gắng để làm cho nó rõ ràng hơn cho những người khác. – Chris

+0

Sau đó, bạn có thể 'chỉnh sửa' các câu hỏi và loại bỏ những điều này và đề cập đến trong 'bình luận' lý do tại sao bạn đã làm điều này. Khi người khác chấp nhận 'thay đổi, nó sẽ được hiển thị. Không cần phải tạo ra một câu trả lời thứ hai sau đó. – Kukeltje