我有几个网页上有类似的表格。
多个页面中存在的一个字段是电子邮件地址。
我希望能够使用特定于页面的消息代码,但我希望能够引用另一个消息代码以获得单个声明。通过这种方式,我可以在一个地方更改电子邮件地址标签的外观,并在所有网页中更改它,但同时,我可以更改仅包含属性文件更新的单个页面的文本。 / p>
我正在寻找这样的功能:
message.properties:
label.email=Email address
webpage1.label.email=${label.email}
webpage2.label.email=${label.email}
然而, 使用以下jsp代码时:
<spring:message code="webpage1.label.email"/>
我的网页上有文字$ {label.email}而不是“电子邮件地址”。
任何提示?
答案 0 :(得分:2)
您可以使用以下内容替换DefaultPropertiesPersister:
这将允许您引用其他条目,例如:
user=User
user.add=Add ${user}
user.delete=Delete ${user}
只需使用MessageSource指定此持久性,例如messageSource.setPropertiesPersister(new RecursivePropertiesPersister());
来源:
public class RecursivePropertiesPersister extends DefaultPropertiesPersister {
private final static Pattern PROP_PATTERN = Pattern.compile("\\$'?\\{'?([^}']*)'?\\}'?");
private final static String CURRENT = "?LOOP?";
@Override
public void load(Properties props, Reader reader) throws IOException {
Properties propsToLoad = new Properties();
super.load(propsToLoad, reader);
replace(propsToLoad, props);
}
@Override
public void load(Properties props, InputStream is) throws IOException {
Properties propsToLoad = new Properties();
super.load(propsToLoad, is);
replace(propsToLoad,props);
}
protected void replace ( Properties src, Properties dest) {
for (Map.Entry entry: src.entrySet()) {
String key = (String) entry.getKey();
String value = (String)entry.getValue();
replace(src, dest, key, value);
}
}
protected String replace(Properties src, Properties dest, String key, String value) {
String replaced = (String) dest.get(key);
if (replaced != null) {
// already replaced (or loop), just return the string
return replaced;
}
dest.put(key,CURRENT); // prevent loops
final Matcher matcher = PROP_PATTERN.matcher(value);
final StringBuffer sb = new StringBuffer();
while (matcher.find()) {
final String subkey = matcher.group(1);
final String replacement = (String)src.get(subkey);
matcher.appendReplacement(sb,replace(src,dest,subkey,replacement));
}
matcher.appendTail(sb);
final String resolved = sb.toString();
dest.put(key, resolved);
return resolved;
}
}