[SPRING] JSF에서 다중 자원 번들 사용하기
SPRINGJSF에서 다중 자원 번들 사용하기
JSF 페이지에서 여러 자원 번들에 액세스하려고합니다. 두 개의 리소스 번들이 있습니다.
JSF 파일에서이 두 자원 번들에 모두 액세스하려고합니다. 이 작업을 수행하는 한 가지 방법은 각 번들에 대한 특정 속성을 정의하는 것입니다.
<f:loadBundle basename="com.sample.general_messages" var="general"/>
<f:loadBundle basename="com.sample.module_message" var="module"/>
동일한 변수 이름을 사용하여이 두 리소스 번들에 모두 액세스 할 수있는 방법이 있습니까? 같은 것 :
<f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/>
또는 여러 리소스 번들에 액세스하는 가장 좋은 방법은 무엇입니까?
해결법
-
==============================
1.Spring에서 질문에 태그를 추가 했으므로 Spring MessageSource를 사용하는 것이 좋습니다. Spring MessageSource는 많은 속성 파일을 계층 적으로도 집계 할 수있다. 그것은 당신에게 오래된 Java ResourceBundle보다 많은 장점을 제공합니다.
Spring에서 질문에 태그를 추가 했으므로 Spring MessageSource를 사용하는 것이 좋습니다. Spring MessageSource는 많은 속성 파일을 계층 적으로도 집계 할 수있다. 그것은 당신에게 오래된 Java ResourceBundle보다 많은 장점을 제공합니다.
spring-config.xml에서 Spring MessageSource를 다음과 같이 정의 할 수있다.
<!-- 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>
다음과 같이 ResourceBundle을 확장 한 클래스를 정의 할 수 있습니다 (클리닝 및 리팩토링이 필요함).
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); } }
마지막으로 faces-config.xml에서 위의 Class로 리소스 번들을 선언한다. 이 같은:
<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>
여기 JSF에서 Spring MessageSource가있다. 그것이 이해할 수 있기를 바랍니다.
-
==============================
2.2 개의 자원 번들에 같은 열쇠가 포함되어있는 경우,이 열쇠를 해결하기 위해서 어느 자원 번들을 사용할 필요가 있습니까? 그래서, IMO, 같은 변수 이름을 여러 리소스 번들에 할당 할 수 있다고 생각하지 않습니다.
2 개의 자원 번들에 같은 열쇠가 포함되어있는 경우,이 열쇠를 해결하기 위해서 어느 자원 번들을 사용할 필요가 있습니까? 그래서, IMO, 같은 변수 이름을 여러 리소스 번들에 할당 할 수 있다고 생각하지 않습니다.
아마도 모든 .properties를 빌드 프로세스의 단일 .properties로 병합 할 수 있습니다 (예 : 병합 된 특성 파일의 모든 키가 고유한지 확인하십시오. 예 : 각 키에 일부 접두사를 추가하십시오.). 그런 다음 응용 프로그램에서이 단일 병합 된 .properties를 사용합니다.
-
==============================
3.JSF가 동일한 번들에 대해 여러 파일을 검사하는 유일한 상황 (알고있는 것)은 여러 로케일에 번들을 제공하는 경우입니다 (현지화 된 메시지 및 레이블 제공 참조).
JSF가 동일한 번들에 대해 여러 파일을 검사하는 유일한 상황 (알고있는 것)은 여러 로케일에 번들을 제공하는 경우입니다 (현지화 된 메시지 및 레이블 제공 참조).
f : loadBundle 태그를 특성 파일 대신 ResourceBundle을 확장하는 클래스로 지정하고 해당 클래스를 사용하여 여러 특성 파일을 참조 할 수 있습니다. 나는 그것을 전에 시도하지 않았다.
또한 Seam을 사용하는 경우 여러 개의 '전역'번들을 등록 할 수 있으며 하나 이상의보기 (facelets)와 연결할 수있는 번들을 제공합니다.이 번들은 모두 메시지를 사용하여 참조 할 수 있습니다. # {messages.my_message} (여기서는 Seam 2의 경우 Seam 3에서 약간 다를 수 있음). 나는 그것이 당신이 무엇을하고 있는지 생각합니다.
from https://stackoverflow.com/questions/6786618/using-multiple-resource-bundles-in-jsf by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Jersey 2와 Spring을 Java 기반 구성과 통합 (0) | 2019.03.17 |
---|---|
[SPRING] 스프링 부트 : PasswordEncoder를 지정하는 방법 (0) | 2019.03.17 |
[SPRING] 스프링 컨트롤러와 다른 클래스를 사용하여 JSP로 데이터 렌더링하기 (0) | 2019.03.16 |
[SPRING] 봄 : 단위 및 통합 테스트 (0) | 2019.03.16 |
[SPRING] XML을 받아들이는 Spring 용 PropertyPlaceholderConfigurer와 같은 클래스가 있습니까? (0) | 2019.03.16 |