2011-04-17 19 views
10

Có cách nào thuận tiện để chuyển các tham số tới các thư từ gói tài nguyên tới các thành phần khác không phải là h: outputFormat?Truyền tham số cho các thông điệp từ bó tài nguyên tới các thành phần khác ** h: outputFormat **

Ví dụ, đây là quy phạm pháp luật:

<h:outputFormat value="#{myBundle['parametricMessage']}"> 
    <f:param value="#{myBundle['someParameterValue']}"/> 
</h:outputFormat> 

Nhưng tôi cần nó cho một nút, như thế này (mà sẽ không làm việc):

<h:commandButton value="#{myBundle['parametricMessage']}"> 
    <f:param value="#{myBundle['someParameterValue']}"/> 
</h:commandButton> 

Tất nhiên, tôi có thể sử dụng thay vì nút, và tôi có thể làm cho nó thông qua một tài sản trong một quản lý đậu, nhưng trong câu hỏi này tôi đang tìm kiếm một cách thuận tiện cách sử dụng nút ...

Tôi đang sử dụng RichFaces 3.3.3, JSF2, facelets.

Trả lời

13

Cách tiếp cận này như thế nào?

EL expression allow you to define a function. Trước tiên, bạn xác định chức năng của biểu thức EL, chấp nhận gói tài nguyên, khóa thông báo và thông số của trình giữ chỗ và xuất thông báo đã giải quyết.

public static String geti18nMsg(ResourceBundle bundle ,String msgKey, String paramValue) { 
    String msgValue = bundle.getString(msgKey); 
    MessageFormat messageFormat = new MessageFormat(msgValue); 
    Object[] args = {paramValue}; 
    return messageFormat.format(args); 
} 

Sau đó gọi chức năng này để nhận được thông báo giải quyết trong <h:commandButton>:

<h:commandButton value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/> 
+0

Tính năng này không hoạt động khi bạn đang sử dụng vì những gì bạn đang chuyển qua là ResouceBundleMap chứ không phải ResouceBundle. Nếu bạn sử dụng bạn có thể thay đổi ResouceBundle thành Map và sau đó bạn thực hiện một .get (msgKey) trên nó. – Lyrion

0

Tôi không tìm thấy câu trả lời đúng về điều đó, vì vậy câu hỏi sẽ vẫn mở. Một thực hành tốt mà tôi đã phát hiện, là có một lớp đặc biệt đại diện cho mỗi gói tài nguyên (có công cụ tham số), và chuyển tất cả các thông điệp hình thành, và làm việc với ngữ cảnh đó (như, lấy locale từ FacesContext, ResourceBundle, áp dụng các tham số, vv). Và cuối cùng để cung cấp quyền truy cập vào một singleton của lớp dịch vụ như vậy từ ManagedBean của bạn.

Điều này đòi hỏi một số công việc bổ sung phải được thực hiện, nhưng giải quyết được vấn đề và đáng giá thời gian.

4

Hãy thử điều này:

<h:commandButton> 
    <h:outputFormat value="#{myBundle['parametricMessage']}"> 
     <f:param value="#{myBundle['someParameterValue']}"/> 
    </h:outputFormat> 
</h:commandButton> 

Btw, điều này làm những gì bạn muốn và cũng tránh được việc phải viết ủng hộ mã đậu.