2011-07-22 38 views
6

Tôi đang cố truy cập nhiều gói tài nguyên từ trang JSF. Tôi có hai bó tài nguyên:Sử dụng nhiều gói tài nguyên trong JSF

  • general_messages.properties
  • module_message.properties

tôi muốn truy cập cả hai bó tài nguyên trong một tập tin JSF. Một cách tôi có thể làm điều này là để xác định thuộc tính cụ thể cho mỗi người trong các bó:

<f:loadBundle basename="com.sample.general_messages" var="general"/> 
<f:loadBundle basename="com.sample.module_message" var="module"/> 

Có cách nào tôi có thể truy cập cả những bó tài nguyên sử dụng tên biến tương tự. Cái gì như:

<f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/> 

Hoặc bất kỳ cách tốt nhất khác để truy cập vào nhiều bó tài nguyên?

+0

Tôi đã nghĩ liệu Spring Framework có một giải pháp cho điều này? – Abdul

Trả lời

5

Bạn đã gắn thẻ câu hỏi của mình với Spring, vì vậy, tôi khuyên bạn nên sử dụng Spring MessageSource. Spring MessageSource có thể tổng hợp nhiều tệp thuộc tính thậm chí phân cấp. Nó cung cấp cho bạn nhiều lợi thế hơn cũ java ResourceBundle.

Bạn có thể định nghĩa mùa xuân MessageSource trong bạn spring-config.xml như thế này:

<!-- 
Application messages configuration. 
--> 
<bean id="messageSource" name="resourceBundle" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
    p:fallbackToSystemLocale="false" 
    p:cacheSeconds="0"> 
    <property name="basenames"> 
     <list> 
      <value>/messages/Messages</value> 
<!--  <value>${application.messages}</value>--> 
     </list> 
    </property> 
</bean> 

hơn bạn có thể xác định bạn Class kéo dài ResourceBundle như thế này (Needs some làm sạch và tái cấu trúc):

public class SpringResourceBundle extends ResourceBundle 
{ 

    private MessageSource messages; 
    private FacesContext fc; 
    private Locale locale = null; 

    public SpringResourceBundle() 
    { 
     fc = FacesContext.getCurrentInstance(); 
     WebApplicationContext webAppCtx = (WebApplicationContext) fc.getExternalContext().getApplicationMap().get(
       WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
     messages = (MessageSource) webAppCtx.getBean("messageSource"); 
    } 

    @Override 
    public Locale getLocale() 
    { 
     Locale loc = fc.getELContext().getLocale(); 
     if (fc.getExternalContext() != null) { 
      loc = fc.getExternalContext().getRequestLocale(); 
     } 
     try { 
      UIViewRoot viewRoot = fc.getViewRoot(); 
      if (viewRoot != null) { 
       loc = viewRoot.getLocale(); 
      } 
      if (loc == null) { 
       loc = fc.getApplication().getDefaultLocale(); 
      } 

     } catch (Throwable th) { 
      System.out.println(th.getMessage()); 
      loc = locale; 
     } 
     locale = loc; 
     return loc; 
    } 

    @Override 
    protected Object handleGetObject(String key) 
    { 
     try { 
      return messages.getMessage(key, null, getLocale()); 
     } catch (NoSuchMessageException e) { 
      return "???" + key + "???"; 
     } 
    } 

    @Override 
    public Enumeration<String> getKeys() 
    { 
     return Collections.enumeration(Collections.EMPTY_LIST); 
    } 
} 

finnaly trong faces-config.xml khai báo gói tài nguyên của bạn với Lớp ở trên. Một cái gì đó như thế này:

<application> 
    <locale-config> 
     <default-locale>en</default-locale> 
     <supported-locale>cs</supported-locale> 
     <supported-locale>de</supported-locale> 
     <supported-locale>en</supported-locale> 
    </locale-config> 
    <message-bundle>your.package.SpringResourceBundle</message-bundle> 
</application> 

Ở đây bạn đi Spring MessageSource in JSF.Hy vọng nó là dễ hiểu.

0

Nếu hai gói tài nguyên chứa cùng một khóa, thì các gói tài nguyên nào sẽ được sử dụng để giải quyết khóa này? Vì vậy, IMO, tôi không nghĩ rằng cùng một tên biến có thể được gán cho nhiều bó tài nguyên.

Có lẽ, bạn có thể hợp nhất tất cả .properties thành một .properties trong quá trình xây dựng của bạn (đảm bảo tất cả các khóa trong tệp thuộc tính đã hợp nhất là duy nhất, ví dụ: bằng cách thêm một số tiền tố vào mỗi khóa.). Sau đó, bạn sử dụng đơn này được hợp nhất .properties trong suốt ứng dụng.

+0

Đó là một trong những giải pháp, nhưng nếu người ta phải mô đun hóa ứng dụng, và khi có rất nhiều lĩnh vực, có mọi thứ trong một tập tin bất động sản sẽ trở thành loại vụng về và không thể quản lý được. Có thực sự phải là một giải pháp để giải quyết vấn đề này. Tôi đang cố gắng khám phá thêm về cách làm cho nó hoạt động. Một thức ăn nhanh cho suy nghĩ: Spring Framework có cung cấp cho chúng ta một giải pháp không ?? – Abdul

0

Tình huống duy nhất (mà tôi biết) trong đó JSF kiểm tra nhiều tệp cho cùng một gói là nếu bạn đang cung cấp gói cho nhiều miền địa phương (xem Providing Localized Messages and Labels).

Bạn có thể trỏ thẻ f:loadBundle vào một lớp mở rộng ResourceBundle thay vì tệp thuộc tính và sử dụng lớp đó để tham chiếu nhiều tệp thuộc tính. Tôi đã không thử điều đó trước đó.

Ngoài ra, nếu bạn đang sử dụng Seam, nó cung cấp khả năng đăng ký nhiều gói 'toàn cầu' cũng như bó có thể được liên kết với một trong nhiều khung nhìn (facelets), tất cả đều có thể được tham chiếu bằng cách sử dụng messages ví dụ: #{messages.my_message} như được mô tả here (đối với Seam 2, nó có thể hơi khác một chút trong Seam 3). Tôi nghĩ rằng đó là những gì bạn đang mặc dù.

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