具有静态输出的JSP标记

具有静态输出的JSP标记,jsp,jsp-tags,Jsp,Jsp Tags,我正在考虑创建一些JSP标记,这些标记将始终提供相同的输出。例如: <foo:bar>baz</foo:bar> out.write("<div class=\"bar\">"); ... out.write("</div>"); 背景 我担心表现。我还没有对此进行测试,但看起来生成的servlet在一些非常简单的事情上做了很多工作,性能非常重要 但是,如果servlet的行为就像输出直接写入JSP一样,那么生产成本将为零 我认为这样做有一些好

我正在考虑创建一些JSP标记,这些标记将始终提供相同的输出。例如:

<foo:bar>baz</foo:bar>
out.write("<div class=\"bar\">");
...
out.write("</div>");
背景 我担心表现。我还没有对此进行测试,但看起来生成的servlet在一些非常简单的事情上做了很多工作,性能非常重要

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

我认为这样做有一些好处。我可以更改静态HTML,甚至可以更改为更动态的内容,而无需编辑每个portlet。在我们的设置中,更改标记很容易,但是更改使用特定元素的每个JSP非常耗时

这也意味着我可以强制开发人员不要编写类似

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

还有更多的优势,但如果它在生产服务器上降低了性能,那么它可能就不值得了。

我想知道。。。为什么不只使用一个普通的旧的include

我想知道。。。为什么不使用一个普通的旧include

考虑到您刚才显示的代码,我很确定性能的影响是可以忽略的

考虑到您刚才展示的代码,我很确定性能的影响是可以忽略的

我做了一个性能测试。在性能上几乎没有差别,所以这没有问题

我是怎么考的 我在一个标记库中创建了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();
    }
}
包装XX.XX.XX.XX
导入java.io.IOException;
导入javax.servlet.jsp.JspException;
导入javax.servlet.jsp.tagext.TagSupport;
公共类Test0001标记扩展了标记支持{
公共Test0001Tag(){
}
public int doStartTag()抛出JSPEException{
试一试{
pageContext.getOut().print(“”);
}捕获(IOE异常){
抛出新的JSPEException(e);
}
返回评估主体,包括:;
}
public int doEndTag()抛出JspException{
试一试{
pageContext.getOut().print(“”);
}捕获(IOE异常){
抛出新的JSPEException(e);
}
返回评估页面;
}
公开无效释放(){
super.release();
}
}
然后TLD中的500个条目如下:

<tag>
   <name>test0001</name>
   <tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
   <bodycontent>JSP</bodycontent> 
</tag>

测试0001
二十、 XX.XX.XX.test0001标签
JSP
然后我抓起一个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个标签没有产生可测量的延迟这一事实可能就足够了,但我想要更多,即使重复可能允许一些优化

500000个标签的结果:

  • JSP标记:15-19秒
  • HTML标记:12-16秒
所以这是有区别的,但我认为这与从用户点击到答案呈现在屏幕上的其他事情相比是微不足道的

其他想法
据我所知,Windows中的粒度大约为15-16毫秒。所以“0毫秒”实际上意味着“我做了一个性能测试,性能差别很小,所以这没有问题

我是怎么考的 我在一个标记库中(以编程方式)创建了500个单独的标记(因此它被包装在一个jar中) 它们都是这样的,唯一的区别是数字:

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();
    }
}
包装XX.XX.XX.XX
导入java.io.IOException;
导入javax.servlet.jsp.JspException;
导入javax.servlet.jsp.tagext.TagSupport;
公共类Test0001标记扩展了标记支持{
公共Test0001Tag(){
}
public int doStartTag()抛出JSPEException{
试一试{
pageContext.getOut().print(“”);
}捕获(IOE异常){
抛出新的JSPEException(e);
}
返回评估主体,包括:;
}
public int doEndTag()抛出JspException{
试一试{
pageContext.getOut().print(“”);
}捕获(IOE异常){
抛出新的JSPEException(e);
}
返回评估页面;
}
公开无效释放(){
super.release();
}
}
然后TLD中的500个条目如下:

<tag>
   <name>test0001</name>
   <tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
   <bodycontent>JSP</bodycontent> 
</tag>

测试0001
二十、 XX.XX.XX.test0001标签
JSP
然后我抓起一个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个标签没有产生可测量的延迟这一事实可能就足够了,但我想要更多,即使重复可能允许一些优化

500000个标签的结果:

  • JSP标记:15-19秒
  • HTML标记:12-16秒
所以这是有区别的,但我认为这与从用户点击到答案呈现在屏幕上的其他事情相比是微不足道的

其他想法
据我所知,Windows中的粒度大约为15-16毫秒,所以“0毫秒”实际上意味着“简单的回答:与使用jsp标记相比,它没有什么优势。如果我详细解释我们的设置,我相信你也会这么认为。但我确实明白你的观点,include是非常“便宜”的。简单的回答是:与使用jsp标记相比,它几乎没有什么优势。如果我详细解释我们的设置,我相信你也会这么认为。但我确实明白你的意思,包括是非常“便宜”。