独自のテンプレートエンジンを作成する(4)


次に、動的includeをサポートする拡張ラベルをいくつか書きます.
前述のコンパイラでは、静的includeがサポートされています.静的包含は、含まれるファイルをコンパイル期間中に含めてコンパイルします.
ダイナミックインクルードは、実行中にテンプレートエンジンを呼び出してテンプレートをコンパイルし、実行し、結果を含めます.
純粋にファイルが含まれている場合、結果的に動的包含と静的包含の違いはありません.この動的包含はstruts 2のラベルに似ています.
ファイルを動的に含めるだけでなく、含める前にクラスのメソッドを実行し、テンプレートエンジンを呼び出してテンプレートをレンダリングできます.
このような利点の1つは、ホームフェースがフレームワークにすぎず、データが含まれていないか、少ないデータしか含まれていないことです.ページの各セクションは、不要なラベルを呼び出すことでレンダリングを完了します.
これにより、ページ上の論理を可能な限り分離することができ、例えば、あるデータが多くのページに引用される可能性があり、このように分離した後、各ブロックを1つのコンポーネントにし、異なるページを異なる組み合わせにすることができる.
まず、ラベルの構造を定義します.

   

このラベルが実行されるとHelloActionが呼び出され、テンプレートエンジンがhelloをレンダリングするように呼び出されます.html.データはpageContextで転送されます.
2つのラベルを定義する必要があります.1つはActionTagで、1つはParameterTagです.まずコードを見てください.
public class ActionTag extends TagSupport implements com.skin.ayada.tagext.ParameterTag{
    private String className;
    private String method;
    private String page;
    private Parameters parameters = new Parameters();

    @Override
    public int doStartTag(){
        super.doStartTag();
        this.parameters.clear();
        return TagSupport.EVAL_PAGE;
    }

    @Override
    public int doEndTag(){
        Map<String, Object> context = null;

        if(this.className != null)
        {
            //            ,                  
            context = ActionDispatcher.dispatch(pageContext, this.parameters, this.className, this.method);
        }

        if(this.getPage() != null)
        {
            //           
            //         pageContext,                        PageContext
            //            
            TemplateManager.execute(this.getPage(), context, pageContext.getOut());
        }

        return TagSupport.EVAL_PAGE;
    }

    @Override
    public void setParameter(String name, Object value){
        parameters.setParameter(name, value);
    }

    // getter & setter
    ...
}

public class ParameterTag extends BodyTagSupport{
    private String name;
    private String value;

    @Override
    public int doEndTag()
    {
        Tag parent = this.getParent();

        if(parent instanceof com.skin.ayada.tagext.ParameterTag)
        {
            String value = this.getValue();

            if(value == null)
            {
                BodyContent body = this.getBodyContent();
                value = (body != null ? body.getString() : null);
            }

            com.skin.ayada.tagext.ParameterTag tag = (com.skin.ayada.tagext.ParameterTag)(parent);
            tag.setParameter(this.getName(), value);
            return TagSupport.EVAL_PAGE;
        }
        else
        {
            throw new RuntimeException("Illegal use of parameter-style tag without servlet as its direct parent");
        }
    }

    // getter & setter
    ...
}

ダウンロード先:
googlecode: https://code.google.com/p/ayada/
github: https://github.com/xuesong123/java-template
JAvascriptバージョン(servletのようなメカニズムを使用して開発されたnodejs付きwebserver):https://github.com/xuesong123/javascript-template