4

プロジェクトで HTML コードを生成するために StringTemplate V4 を使用しています。テンプレートに HTML 書式を設定する必要があるため、デフォルトの区切り記号<を使用>すると非常に扱いにくくなります。

したがって、区切り文字を引数として渡すグループを作成しています(この質問で推奨されているように)が、単に機能しません。

ここに私のテストコードがあります:

public void testTemplate() {
    char sep = '$';
    STGroup stGroup = new STGroupString("temp",
            "<html>hello, $name$!</html>", sep, sep);
    System.out.println("Group created");
    ST st = stGroup.getInstanceOf("temp");
    if (st == null) {
        System.out.println("Failed to get template!");
    } else {
        st.add("name", "Guest");
        System.out.println("Template initialized correctly");
    }
}

そして、これは私が得る出力です:

temp 1:1: invalid character '<'
temp 1:5: invalid character '>'
temp 1:1: garbled template definition starting at 'html'
temp 1:6: garbled template definition starting at 'hello'
temp 1:13: invalid character '$'
temp 1:18: invalid character '$'
temp 1:19: invalid character '!'
temp 1:21: invalid character '<'
temp 1:22: invalid character '/'
temp 1:14: garbled template definition starting at 'name'
temp 1:26: invalid character '>'
temp 1:22: garbled template definition starting at 'html'
Failed to get template!

ここで何が欠けていますか?

4

2 に答える 2

5

問題は、STGroupStringコンストラクターに提供されたテンプレートが有効な「グループ テンプレート」構文ではないことです。

特別な構文を必要としないグループ テンプレートを取得するには、次を試してください。

STGroup group = new STGroup('$', '$');
group.registerRenderer(...);
CompiledST compiledTemplate = group.defineTemplate("name", ...);
compiledTemplate.hasFormalArgs = false; // very important!

// later on...
ST template = group.getInstanceOf("name");

(上記は私の C# コードの適応であり、YMMV です。型/名前が有効で、構文が正しいことを確認しようとしましたが、検証していません。必要に応じて自由に更新/修正してください。)

ハッピーコーディング。

于 2012-06-21T20:34:05.567 に答える
1

上記の (pst による) 非常に興味深いトリックで、「有効なグループ テンプレート構文ではありません」というヒントも得られます。

したがって、参考までに、そのようなグループに有効な構文を使用した、彼のコードの代替を次に示します。

 STGroup groupS = new STGroupString("some group", "val(value) ::= \"<span>Value is {value; format=\\\"%1.5f\\\"}</span>\"", '{', '}');
 groupS.registerRenderer(Number.class, new NumberRenderer());
 ST valTpl = groupS.getInstanceOf("val");
 valTpl.add("value", 3.14159265358979353);
 System.out.println(valTpl.render());

Java 文字列内では構文が扱いにくくなり、多くのエスケープが発生します...

于 2012-09-04T12:53:46.227 に答える