2

Freemarker は、ninja Web フレームワークのデフォルトのテンプレート エンジンとして使用されます。フレームワークは、ninja Web フレームワークを使用するときにグローバルに使用できるテンプレートにいくつかのデフォルト値を割り当てます。CSRF-Protection を有効にするテンプレートの拡張機能を作成しました。拡張機能は、テンプレートで使用できる機能を提供します。

${foo(bar)}

現時点では、関数を特定のパラメーターで呼び出す必要がありますが、これはあまり直感的ではありません。マクロを使用すると、この呼び出しを単純化できます

@{foo}

ユーザーは正しい (例: "bar") パラメータを渡すことを心配する必要はありません。しかし、これを忍者 Web フレームワークで使用できるようにするには、プログラムでマクロを定義する必要があります。それは可能ですか?

アップデート

混乱させて申し訳ありません。@{foo} の代わりに <@foo/> を意味していました ...

Freemarker のドキュメントを見ると、私が達成したいことをより明確にすることができるかもしれません: http://freemarker.org/docs/ref_directive_macro.html

上で説明したように、カスタム関数をテンプレートに渡しているので、

${foo("bar")}

私がやりたいのは、次のようなマクロを介してこれを呼び出すことです

@<myMacro/>

しかし、次のような定義されたマクロ

<#macro myMacro>
  ${foo("bar")}
</#macro> 

テンプレートではなく、プログラムで定義する必要があります。それがより明確になることを願っています。

UPDATE2 / ソリューション

推奨される TemplateDirectiveModel を使用することになりました。

public class TemplateEngineFreemarkerAuthenticityTokenDirective implements TemplateDirectiveModel {
    private String authenticityToken;

    public TemplateEngineFreemarkerAuthenticityTokenDirective(Context context) {
        this.authenticityToken = context.getSession().getAuthenticityToken();
    }

    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
        if (!params.isEmpty()) {
            throw new TemplateException("This directive doesn't allow parameters.", env);
        }

        if (loopVars.length != 0) {
            throw new TemplateException("This directive doesn't allow loop variables.", env);
        }

        Writer out = env.getOut();
        out.append(this.authenticityToken);
    }
}
4

2 に答える 2

3

マクロを「動的に」呼び出すことができます。マクロがあるとしましょう:

<#macro myMacro>
  ${foo("bar")}
</#macro> 

次のように呼び出すことができます。

<@myMacro /> 

また

<@.vars["myMacro"] />

それで、あなたはできる...

<#assign someVar = "myMacro" />

<@.vars[someVar] />
于 2015-02-12T21:50:59.967 に答える