#jsf #jsf-2 #richfaces #facelets #resourcebundle
#jsf #jsf-2 #богатые интерфейсы #фасетки #resourcebundle
Вопрос:
Есть ли удобный способ передавать параметры в сообщения из пакета ресурсов компонентам, отличным от h: OutputFormat?
Например, это законно:
<h:outputFormat value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>
Но мне это нужно для кнопки, подобной этой (которая не будет работать):
<h:commandButton value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:commandButton>
Конечно, я могу использовать link вместо button, и я могу сделать это через свойство в управляемом компоненте, но в этом вопросе я ищу удобный способ использования кнопки…
Я использую RichFaces 3.3.3, JSF2, facelets.
Ответ №1:
Как насчет такого подхода?
Выражение EL позволяет определить функцию .Сначала вы определяете функцию выражения EL, которая принимает пакет ресурсов, его ключ сообщения и параметр заполнителя и выводит разрешенное сообщение.
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);
}
Затем вызовите эту функцию, чтобы получить разрешенное сообщение в <h:commandButton>
:
<h:commandButton value="#{f:geti18nMsg(myBundle , parametricMessage, someParameterValue)}"/>
Комментарии:
1. Это не работает при использовании <f:loadBundle>, потому что то, через что вы проходите, является ResouceBundleMap, а не ResouceBundle. Если вы используете <f:loadBundle>, вы можете изменить ResouceBundle на Map<Строка,String>, а затем выполнить для него .get(msgKey).
Ответ №2:
Попробуйте это:
<h:commandButton>
<h:outputFormat value="#{myBundle['parametricMessage']}">
<f:param value="#{myBundle['someParameterValue']}"/>
</h:outputFormat>
</h:commandButton>
Кстати, это делает то, что вы хотите, а также позволяет избежать необходимости писать вспомогательный bean-код.
Ответ №3:
Что ж, я не нашел хорошего ответа на этот вопрос, поэтому вопрос останется открытым. Хорошая практика, которую я обнаружил, заключается в том, чтобы иметь специальный класс, который представляет каждый пакет ресурсов (который содержит параметрический материал), и передавать туда все формирование сообщений и работать с контекстом (например, получать locale из FacesContext, получать ResourceBundle, применять параметры и т.д.). И, наконец, предоставлять доступ к синглетону такого класса обслуживания из вашего ManagedBean.
Это требует некоторой дополнительной работы, но решает проблему и стоит потраченного времени.