虽然GWT并不模仿所有java的核心,但可以用作替代:
String.format("The answer is - %d", 42)?
在GWT中为消息注入参数的优雅和有效模式是什么?
答案 0 :(得分:15)
一个优雅的解决方案是使用SafeHtml模板。您可以在以下界面中定义多个此类模板:
public interface MyTemplates extends SafeHtmlTemplates {
@Template("The answer is - {0}")
SafeHtml answer(int value);
@Template("...")
...
}
然后使用它们:
public static final MyTemplates TEMPLATES = GWT.create(MyTemplates.class);
...
Label label = new Label(TEMPLATES.answer(42));
虽然这需要设置一些工作,但它具有巨大的优势,即参数可以自动进行HTML转义。有关详细信息,请参阅https://developers.google.com/web-toolkit/doc/latest/DevGuideSecuritySafeHtml
如果您想更进一步,并将消息国际化,请参阅https://developers.google.com/web-toolkit/doc/latest/DevGuideI18nMessages#SafeHtmlMessages
答案 1 :(得分:7)
你可以简单地编写自己的format function
,而不是做脑风暴。
public static String format(final String format, final String... args,String delimiter) {
String[] split = format.split(delimiter);//in your case "%d" as delimeter
final StringBuffer buffer= new StringBuffer();
for (int i= 0; i< split.length - 1; i+= 1) {
buffer.append(split[i]);
buffer.append(args[i]);
}
buffer.append(split[split.length - 1]);
return buffer.toString();
}
答案 2 :(得分:7)
因为大多数(如99.999%)消息格式是静态的,在编译时是已知的,所以GWT接近它的方式是在编译时解析它们。
您通常会使用Messages
subinterface来定位邮件,但有时您需要SafeHtmlTemplates
。
答案 3 :(得分:6)
在编译时不知道模板的0.001%时,您可以使用Javascript sprintf(参见:http://www.diveintojavascript.com/projects/javascript-sprintf),如下所示:
public static native String format (String format, JsArrayMixed values) /*-{
return vsprintf(format, values);
}-*/;
答案 4 :(得分:1)
你可以自己写。
我写了一个与Strings(%s)一起使用的版本:
public static String format(final String format, final Object... args)
{
checkNotNull(format);
checkNotNull(args);
final String pattern = "%s";
int start = 0, last = 0, argsIndex = 0;
final StringBuilder result = new StringBuilder();
while ((start = format.indexOf(pattern, last)) != -1)
{
if (args.length <= argsIndex)
{
throw new IllegalArgumentException("There is more replace patterns than arguments!");
}
result.append(format.substring(last, start));
result.append(args[argsIndex++]);
last = start + pattern.length();
}
if (args.length > argsIndex)
{
throw new IllegalArgumentException("There is more arguments than replace patterns!");
}
result.append(format.substring(last));
return result.toString();
}
答案 5 :(得分:0)
为什么不写一个像这样的方法:
String appendAnswer(int result) {
return "The answer is - " + Integer.toString(result);
}
正在解决您的问题,因为您在代码中不执行任何格式化操作。
如果你遇到像将整数/字节转换为十六进制字符串这样的问题,你应该使用:
Integer.toString(int, 16);
答案 6 :(得分:-1)
我不太了解GWT,但我正在研究GWT项目,我需要这个。在尝试一些替代方案时,我发现这是有效的;
import java.text.MessageFormat;
MessageFormat.format("The answer is - {0}", 42);
我不知道该项目的开发人员是否添加了一些特殊内容以使其正常工作或默认情况下正在运行。