23

虽然 GWT 不能模拟所有 java 的核心,但可以用作以下替代方案:

String.format("The answer is - %d", 42)?

在 GWT 中向消息注入参数的优雅高效模式是什么?

4

7 回答 7

17

一种优雅的解决方案是使用 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

于 2013-03-16T19:10:38.237 回答
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();
 }
于 2013-03-16T20:33:55.557 回答
7

因为大多数(如 99.999%)消息格式是静态的,在编译时已知,所以 GWT 处理它的方式是在编译时解析它们。

您通常会使用Messages子接口来本地化消息,但有时您更需要SafeHtmlTemplates.

于 2013-03-16T23:01:52.553 回答
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);
}-*/;
于 2013-09-18T15:58:45.110 回答
0

你可以自己写。

我写了一个只适用于 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();
}
于 2014-07-18T13:49:48.210 回答
0

为什么不编写如下方法:

String appendAnswer(int result) {
    return "The answer is - "  + Integer.toString(result);
}

正在解决您的问题,因为您没有像在代码中那样进行格式化。

如果您遇到过将整数/字节转换为十六进制字符串等问题,您应该使用:

Integer.toString(int, 16); 
于 2017-06-06T11:51:49.417 回答
-3

我不太了解 GWT,但我正在做一个 GWT 项目,我需要这个。在尝试一些替代方案时,我发现这是可行的;

import java.text.MessageFormat;



MessageFormat.format("The answer is - {0}", 42);

我不知道该项目的开发人员是否添加了一些特殊的东西来使这项工作或默认工作。

于 2016-06-16T08:21:29.627 回答