带有静态输出的JSP标记

时间:2008-10-23 07:37:32

标签: jsp jsp-tags

我正在考虑创建一些总是提供相同输出的JSP标记。例如:

<foo:bar>baz</foo:bar>

将始终输出:

<div class="bar">baz</div>

有没有办法让JSP标记在生成的servlet中表现得像静态输出一样?

例如:

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...

背景

我担心表现。我还没有测试过这个,但看起来生成的servlet非常简单,并且性能非常重要。

但是如果servlet的行为就像输出直接写在JSP中一样,那么生产中的成本将为零。

通过这样做,我看到了一些优点。我可以更改静态HTML甚至更改为更动态的内容,而无需编辑每个portlet。在我们的设置中,更改标签很容易,但更改使用特定元素的每个JSP都非常耗时。

这也意味着我可以强迫开发人员不要写像

这样的东西
<div class="bar" style="whatever">...</div>

还有更多优势,但如果它在生产服务器上的性能成本,则可能不值得。

3 个答案:

答案 0 :(得分:3)

考虑到您刚刚展示的代码,我确信性能损失是可以忽略不计的。

答案 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,并制作了两个副本:一个带有静态HTML,另一个带有标签。

具有静态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-tags:15-19秒
  • HTML标签:12-16秒

所以存在差异,但我认为与用户点击到答案的其他所有内容相比,它在屏幕上呈现时无关紧要。

其他想法

据我所知,Windows中的粒度约为15-16毫秒。所以“0毫秒”实际上意味着“<16毫秒”。延迟小于16/500毫秒pr。标签是完全可以接受的。

我尝试了1000个标签,但JSP编译器对此非常不满意。我减少了500个标签,因为替代方法是更改​​设置,这会使我的结果无效。

我将生成的HTML作为HTML注释,因为浏览器与测试服务器位于同一物理机器上,我担心浏览器会占用太多的CPU时间,即使是双核中央处理器。简单的解决方案是评论HTML。

答案 2 :(得分:0)

我在想......为什么不使用普通的包含