В качестве альтернативы <f: loadBundle> я разрабатывал новый компонент <s: messageSource>, который можно использовать для представления сообщений из любого Spring MessageSource , а также предлагал несколько других преимуществ.
Новый компонент является заменой для <f: loadBundle> .
1
2
3
4
|
< s:messageSource source = "#{messageSource}" var = "messages" /> < p > < h:outputText value = "#{messages.hello}" /> </ p > |
Атрибутом источника может быть любое выражение EL, которое разрешается в экземпляр MessageSource . Если источник не указан, будет использоваться Spring ApplicationContext . Атрибут var — это имя переменной, которая будет использоваться для доступа к сообщениям.
Если вы сделаете ссылку на сообщение в своем XHTML, которое вы забыли определить, вы либо увидите предупреждающее сообщение (в процессе разработки), либо возникнет исключение (в процессе разработки).
Как и в стандартном JSF, ваши сообщения и заполнители для использования с <h: outputFormat>
1
|
pages.message.simple.welcome=Welcome to { 1 } with { 0 } |
1
2
3
4
|
< h:outputFormat value = "#{messages.welcome}" > < f:param value = "Spring" /> < f:param value = "JSF" /> </ h:outputFormat > |
Тег <h: outputFormat> немного многословен, поэтому для удобства сообщения Spring можно использовать как Map s. Это позволяет вам ссылаться на заполнители гораздо более кратко:
1
|
< h:outputText value = "#{messages.welcome['Spring']['JSF']}" /> |
Тот же синтаксис позволяет отображать объекты Java на сообщения. По умолчанию объекты сопоставляются путем создания ключа сообщения из имени класса. Например, следующий класс:
1
2
3
|
package org.example; public class ExampleObject { } |
Можно ссылаться в JSF:
1
|
< h:outputText value = "#{messages[exampleInstance]}" /> |
Разрешение на следующее сообщение:
1
|
org.example.ExampleObject=example |
Для объектов enum ключ сообщения включает имя enum, а также класс:
1
2
3
4
5
|
package org.example; public enum ExampleObject { ONE, //mapped to message key org.example.ExampleObject.ONE TWO //mapped to message key org.example.ExampleObject.TWO } |
Объектные сообщения также могут ссылаться на свойства, которые должны составлять часть сообщения:
1
2
3
4
5
6
7
8
9
|
org.example.PersonName=Name is {first} {last} ... package org.example; public class PersonName { ... public String getFirst() {...} public String getLast() {...} } |
Вы также можете определить свои собственные стратегии объектных сообщений, используя источник сообщений, который реализует интерфейс org.springframework.springfaces.message.ObjectMessageSource .
Если вы хотите проверить любой из этого кода, взгляните на пакеты org.springframework.springfaces.message и org.springframework.springfaces.message.ui из проекта GitHub .
Ссылка: Интеграция Spring & JavaServer Faces: Интернационализация и локализация от нашего партнера JCG Филиппа Уэбба в блоге Фила Уэбба в блоге.