独自のテンプレートエンジンを作成する(4)
次に、動的includeをサポートする拡張ラベルをいくつか書きます.
前述のコンパイラでは、静的includeがサポートされています.静的包含は、含まれるファイルをコンパイル期間中に含めてコンパイルします.
ダイナミックインクルードは、実行中にテンプレートエンジンを呼び出してテンプレートをコンパイルし、実行し、結果を含めます.
純粋にファイルが含まれている場合、結果的に動的包含と静的包含の違いはありません.この動的包含はstruts 2のラベルに似ています.
ファイルを動的に含めるだけでなく、含める前にクラスのメソッドを実行し、テンプレートエンジンを呼び出してテンプレートをレンダリングできます.
このような利点の1つは、ホームフェースがフレームワークにすぎず、データが含まれていないか、少ないデータしか含まれていないことです.ページの各セクションは、不要なラベルを呼び出すことでレンダリングを完了します.
これにより、ページ上の論理を可能な限り分離することができ、例えば、あるデータが多くのページに引用される可能性があり、このように分離した後、各ブロックを1つのコンポーネントにし、異なるページを異なる組み合わせにすることができる.
まず、ラベルの構造を定義します.
このラベルが実行されるとHelloActionが呼び出され、テンプレートエンジンがhelloをレンダリングするように呼び出されます.html.データはpageContextで転送されます.
2つのラベルを定義する必要があります.1つはActionTagで、1つはParameterTagです.まずコードを見てください.
ダウンロード先:
googlecode: https://code.google.com/p/ayada/
github: https://github.com/xuesong123/java-template
JAvascriptバージョン(servletのようなメカニズムを使用して開発されたnodejs付きwebserver):https://github.com/xuesong123/javascript-template
前述のコンパイラでは、静的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