Передавать параметры в сообщения из пакета ресурсов компонентам, отличным от ** h: OutputFormat**

#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.

Это требует некоторой дополнительной работы, но решает проблему и стоит потраченного времени.