1

常に同じ出力が得られる 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 を変更したり、より動的なものに変更したりすることさえできます。私たちの設定では、タグを変更するのは簡単ですが、特定の要素を使用するすべての JSP を変更するには非常に時間がかかります。

これはまた、開発者に次のようなものを書かないように強制できることも意味します

<div class="bar" style="whatever">...</div>

さらに多くの利点がありますが、運用サーバーでのパフォーマンスが低下する場合は、おそらく価値がありません。

4

3 に答える 3

3

先ほど示したコードを考慮すると、パフォーマンスへの影響はごくわずかであると確信しています。

于 2008-10-23T08:29:48.010 に答える
1

性能テストを行いました。性能差はほとんどないので問題ありません。

テストの作り方

タグ ライブラリの 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 を取得し、2 つのコピーを作成しました。1 つは静的 HTML を含み、もう 1 つはタグを含みます。

静的 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);%>
 -->

ループが導入されたのは、どちらも 0 ミリ秒で出てきたためです。(残念ながら、私は仕事で Windows を実行しているので、ここではあまり精度が得られません。) 500 個のタグで測定可能な遅延が発生しなかったという事実は十分な答えになる可能性がありますが、繰り返しが許されるとしても、もっと欲しかったです。いくつかの最適化。

500 000 タグの結果:

  • JSP タグ: 15 ~ 19 秒
  • HTML タグ: 12 ~ 16 秒

違いはありますが、ユーザーがクリックしてから回答が画面に表示されるまでの他のすべてのことと比較すると、重要ではないと思います。

他の考え

私の知る限り、Windows の粒度は約 15 ~ 16 ミリ秒です。したがって、「0ミリ秒」は実際には「<16ミリ秒」を意味します。16/500 ミリ秒未満の遅延。タグはかなり受け入れられます。

1000 個のタグを試してみましたが、JSP コンパイラはこれに非常に不満でした。別の方法として設定を変更すると結果が無効になるため、タグを 500 個に減らしました。

生成された HTML を HTML コメントにしました。これは、ブラウザーがテスト サーバーと同じ物理マシン上にあり、デュアルコア CPU を使用しても、ブラウザーのレンダリングに CPU 時間がかかりすぎるのではないかと心配したためです。簡単な解決策は、HTML にコメントを付けることでした。

于 2008-10-27T11:38:02.130 に答える
0

私は疑問に思っていました...単純な古いincludeだけを使用しないのはなぜですか?

于 2008-10-23T07:41:10.310 に答える