質問
常に同じ出力を提供するJSPタグを作成することを検討しています。例:
<foo:bar>baz</foo:bar>
常に出力します:
<div class="bar">baz</div>
JSPタグを生成されたサーブレットの静的出力のように動作させる方法はありますか?
例:
out.write("<div class=\"bar\">");
...
out.write("</div>");
の代わりに
x.y.z.foo.BarTag _jspx_th_foo_bar_0 = new x.y.z.foo.BarTag();
_jspx_th_foo_bar_0.setPageContext(pageContext);
_jspx_th_foo_bar_0.setParent(null);
_jspxTagObjects.push(_jspx_th_foo_bar_0);
int _jspx_eval_foo_bar_0 = _jspx_th_foo_bar_0.doStartTag();
etc...
etc...
etc...
背景
パフォーマンスが心配です。私はまだこれをテストしていませんが、生成されたサーブレットは非常に単純なものに対して多くのことをしているようで、パフォーマンスは非常に重要です。
しかし、出力がJSPに直接書き込まれたようにサーブレットが動作する場合、本番環境のコストはゼロになります。
これを行うことでいくつかの利点が得られます。すべてのポートレットを編集せずに、静的なHTMLを変更したり、より動的なHTMLに変更することさえできます。このセットアップでは、タグの変更は簡単ですが、特定の要素を使用するすべてのJSPを変更するのは非常に時間がかかります。
これはまた、開発者に次のようなものを書かないように強制できることも意味します
<div class="bar" style="whatever">...</div>
さらに多くの利点がありますが、実稼働サーバーでパフォーマンスが低下する場合は、おそらく価値がありません。
解決 2
パフォーマンステストを行いました。パフォーマンスにはほとんど違いがないため、問題ありません。
テストの作成方法
タグライブラリの1つに(プログラムで)500個の個別タグを作成しました。 (だからそれは瓶などに包まれています) それらはすべてこのように見えますが、唯一の違いは数字です:
package XX.XX.XX.XX
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class Test0001Tag extends TagSupport {
public Test0001Tag() {
}
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("<div class=\"Test0001\">");
} catch (IOException e) {
throw new JspException(e);
}
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspException {
try {
pageContext.getOut().print("</div>");
} catch (IOException e) {
throw new JspException(e);
}
return EVAL_PAGE;
}
public void release() {
super.release();
}
}
そして、TLDの500エントリは次のようになります。
<tag>
<name>test0001</name>
<tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
<bodycontent>JSP</bodycontent>
</tag>
次に、小さなコードを含むJSPを取得し、静的HTMLとタグを含む2つのコピーを作成しました。
静的HTMLを使用するもの:
<!--
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<div class="Test0001">X</div>
<div class="Test0002">X</div>
<div class="Test0003">X</div>
...
<div class="Test0498">X</div>
<div class="Test0499">X</div>
<div class="Test0500">X</div>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
-->
タグのあるもの:
<!--
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<bddesign:test0001>X</bddesign:test0001>
<bddesign:test0002>X</bddesign:test0002>
<bddesign:test0003>X</bddesign:test0003>
...
<bddesign:test0498>X</bddesign:test0498>
<bddesign:test0499>X</bddesign:test0499>
<bddesign:test0500>X</bddesign:test0500>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
-->
両方ともゼロミリ秒で出てきたため、ループが導入されました。 (残念ながら、私は職場でWindowsを実行しているので、ここではあまり正確になりません。) 500個のタグで測定可能な遅延が発生しなかったという事実で十分な答えが得られる可能性がありますが、繰り返しによって最適化が可能になる場合でも、さらに多くのタグが必要でした。
500 000タグの結果:
- JSPタグ:15〜19秒
- HTMLタグ:12〜16秒
違いはありますが、ユーザーのクリックから回答までが画面に表示される他のすべてと比較すると、重要ではないと思います。
その他の考え
私が知る限り、Windowsの粒度は約15〜16ミリ秒です。 <!> quot; 0ミリ秒<!> quot;実際には<!> quot; <!> lt; 16ミリ秒<!> quot;を意味します。 16/500ミリ秒未満の遅延。タグはまったく問題ありません。
1000個のタグを試してみましたが、JSPコンパイラーは非常に不満でした。選択肢は結果を無効にする設定を変更することであったため、500タグに減らしました。
ブラウザはテストサーバーと同じ物理マシン上にあるため、生成されたHTMLをHTMLコメントにしました。 CPU。簡単な解決策は、HTMLにコメントすることでした。
他のヒント
今示したコードを考慮すると、パフォーマンスへの影響は無視できると確信しています。
私は疑問に思っていました...なぜ単純な古い include を使用しないのですか?