Замена динамического заполнителя в свойствах в java

Я хотел динамически заменить заполнитель в свойствах java-приложения. Нравиться

 WelcomeMessage=Welcome Mr. {firstName} {lastName} !!!

Эти переменные firstName и LastName должны быть заменены динамически. Должны ли мы использовать механизм шаблонов скорости для того же? Или есть другие фреймворки с открытым исходным кодом для того же?

Спасибо, Маниш


person manish    schedule 05.02.2010    source источник


Ответы (6)


Вы можете использовать класс MessageFormat Java SE. . Это позволяет вам делать именно то, что вы просите.

В вашем случае приведенный ниже фрагмент кода должен помочь, предполагая, что props содержит все свойства, загруженные из вашего файла.

MessageFormat.format((String) props.get("WelcomeMessage"), "First", "Last");

Обратите внимание, что ваши файлы свойств должны иметь индекс параметров, а не именованные параметры, как показано ниже.

WelcomeMessage=Welcome Mr. {0} {1} !!!
person Chandra Sekar    schedule 05.02.2010
comment
Да, да, за исключением того, что необъяснимым образом он определяется с использованием числовых заполнителей, а не значимых символических. Удивительно, насколько сложнее это использовать. - person T.J. Crowder; 05.02.2010
comment
Отредактировал мой ответ так же, как вы комментировали. :) - person Chandra Sekar; 05.02.2010

Скорость довольно старая и неприятная, на мой взгляд, есть более приятные способы сделать это:

  • StringTemplate — простейший из шаблонизаторов, и он достаточно хорош для того, что вам нужно (см. примеры синтаксиса здесь).
  • Если вы уже используете Spring 3, у него есть ссылка PropertyPlaceholderHelper, который тоже может это делать, но я бы не стал использовать Spring только для того, чтобы заполучить этот единственный класс.
person skaffman    schedule 05.02.2010
comment
Скорость не идеальна. Однако я думаю, что он делает свою работу очень хорошо, и я могу его очень рекомендовать. Кроме того, концепция набора инструментов позволяет очень легко интегрировать собственную логику шаблонов. И у него отличная интеграция с сервлетами в целом (и Struts 1.x). - person Markus; 08.07.2011

Один из способов - замена строки:

WelcomeMessage=Welcome Mr. ${firstName} ${lastName} !!!

Map<String, String> valuesMap = new HashMap<String, String>();
valuesMap.put("firstName", "ram");
valuesMap.put("lastName", "Kumar");
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String message = sub.replace(WelcomeMessage);
person dpkcs    schedule 13.06.2017
comment
Самая последняя версия этого класса — StringSubstitutor в org.apache.commons.commons-text. - person Fabian Braun; 05.04.2018

Другой вариант — добавить Apache FreeMarker без зависимостей и определить шаблон как:

Welcome Mr. ${firstName} ${lastName} !!!

Apache FreeMarker™ — это механизм шаблонов: библиотека Java для создания текстового вывода (веб-страницы HTML, сообщения электронной почты, файлы конфигурации, исходный код и т. д.) на основе шаблонов и изменяющихся данных. Шаблоны написаны на языке шаблонов FreeMarker (FTL), который представляет собой простой специализированный язык.

Вы можете использовать StringTemplateLoader для загрузки шаблона с помощью String

вы можете создать StringTemplateLoader и добавить к нему каждый шаблон:

person user7294900    schedule 04.09.2018

скорость - лучший инструмент на данный момент. Но это зависит от того, какой тип файла вы хотите использовать в качестве шаблона.

Например, если вы хотите использовать документы MS Word в качестве шаблона, вам нужно расширить классы скорости и написать свою собственную реализацию.

person Joseph Kulandai    schedule 05.02.2010
comment
слишком тяжелый, слишком сложный - person msangel; 16.10.2013

В веб-приложении Java с JSF 2 это будет работать следующим образом:

src\main\webapp\WEB-INF\faces-config.xml

...
    <resource-bundle>
      <base-name>com.mycompany.resources.messages</base-name>
      <var>mytext</var>
    </resource-bundle>
...

src\main\resources\com\mycompany\resources\messages\mytext.properties

WelcomeMessage = Welcome Mr. {0} {1} !!!

index.xhtml

<h:outputFormat value="#{mytext.WelcomeMessage}" >          
  <f:param value="#{userSessionBean.first}" />
  <f:param value="#{userSessionBean.last}" />
</h:outputFormat>
person Benny Neugebauer    schedule 03.05.2014