2010-02-09 39 views
5

Làm cách nào để liên kết giá trị của thành phần nhất định một cách linh động khi chạy? Ví dụ, tôi có thẻ thành phần sau đây,Giá trị động ràng buộc của thành phần JSF

<h:inputText value="#{bean.someProp}" /> 

Trong trường hợp của tôi, "# {bean.someProp}" chỉ được biết đến khi chạy.

Chiến lược tốt nhất để thực hiện điều này là gì?

Tôi có nên đi qua cây thành phần và đặt giá trị ràng buộc theo chương trình không? Nếu có, tại đó giai đoạn vòng đời JSF tôi nên làm việc đi qua?

Trả lời

15

Bạn có thể liên kết nó với thuộc tính bean Map<String, Object> trong đó phím String ít hoặc nhiều tên thuộc tính động. Bạn có thể truy cập vào các giá trị bản đồ trong EL theo cách sau:

<h:inputText value="#{bean.map.someProp}" /> 

hoặc

<h:inputText value="#{bean.map['someProp']}" /> 

mà thậm chí có thể được thực hiện một chút động nhiều nơi someVar thực sự giải quyết đến một giá trị String của "someProp":

<h:inputText value="#{bean.map[someVar]}" /> 

Bạn chỉ cần đảm bảo rằng Map được tạo trong khi khởi tạo bean, nếu không JSF không thể truy cập giá trị bản đồ. EL cụ thể sẽ không precreate "thuộc tính lồng nhau" cho bạn. Do đó, ví dụ: trực tiếp instantiation:

public class Bean { 
    private Map<String, Object> map = new HashMap<String, Object>(); 
} 

.. hoặc bên trong một Constructor hoặc @PostConstruct nếu bạn muốn.

+0

Ok tôi hiểu ý của bạn là gì. Đây là một ý tưởng hay, ngoại trừ việc tôi sẽ mất tất cả siêu dữ liệu được xác định trong các chú thích trong các thực thể của tôi. Điều này cũng có nghĩa là mất lợi thế khi sử dụng (thẻ xác thực ngủ đông từ SEAM) và tất cả cơ sở hạ tầng khác phụ thuộc vào siêu dữ liệu chú thích. FYI, tôi đang thực hiện việc này để tạo một khuôn khổ triển khai mẫu 'đối tượng khỏa thân' (một triển khai thực hiện ref là http://www.nakedobjects.org/). Về cơ bản nó kiểm tra một thực thể và tự động xây dựng các bảng và biểu mẫu liên quan (trong trường hợp này là cây thành phần). – bungrudi

+0

Urm, ... trên suy nghĩ thứ hai, sử dụng cách tiếp cận này, tôi không phải mất tất cả các siêu dữ liệu chú thích đó. Tôi sẽ thử điều này và cho bạn biết. – bungrudi

+0

Đây là cách tôi làm điều đó hiện tại. Bằng cách này, tôi mất lợi thế của và phải triển khai lại xác thực ở nơi khác. Đó là tầm thường mặc dù, chỉ cần một vấn đề gọi hibernateValidator.validate (đậu). – bungrudi

0

Một tùy chọn khác là bạn có thể thêm lớp trừu tượng vào bean của mình.

public String getDynamicProp() { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

public void setDynamicProp(String input) { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

Sau đó, bạn sẽ buộc JSF bạn trực tiếp đến prop động:

#{bean.dynamicProp} 

Tuy nhiên, điều này sẽ không bám vào siêu dữ liệu như xác nhận và như bạn đang muốn. Tuy nhiên, bạn có thể lập trình gọi xác thực và tự xử lý nó.

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