JSP-теги со статическим выводом - PullRequest
1 голос
/ 23 октября 2008

Я рассматриваю возможность создания некоторых 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>

Есть еще больше преимуществ, но если это снижает производительность на производственных серверах, то, вероятно, оно того не стоит.

Ответы [ 3 ]

3 голосов
/ 23 октября 2008

Я совершенно уверен, что снижение производительности будет пренебрежимо малым, учитывая код, который вы только что показали.

1 голос
/ 27 октября 2008

Я сделал тест производительности. В производительности очень мало различий, так что это не проблема.

Как я сделал тест

Я создал 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();
    }
}

А затем 500 записей в TLD, как это:

<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-метки: 15-19 секунд
  • HTML-теги: 12-16 секунд

Так что есть разница, но я думаю, что она незначительна по сравнению со всем, что происходит от кликов пользователя до ответа на экране.

Другие мысли

Насколько я знаю, степень детализации в Windows составляет около 15-16 миллисекунд. Таким образом, «0 миллисекунд» фактически означает «<16 миллисекунд». Задержка менее 16/500 миллисекунд pr. тег вполне приемлем. </p>

Я пытался с 1000 тегами, но JSP-компилятор был очень недоволен этим. Я уменьшил до 500 тегов, потому что альтернативой было изменить настройку, которая делала бы мои результаты недействительными.

Я сделал сгенерированный HTML-HTML-комментарий, потому что браузер находится на той же физической машине, что и тестовый сервер, и я боялся, что браузер потребует слишком много времени загрузки процессора, даже с двухъядерным ЦПУ. Простым решением было прокомментировать HTML.

0 голосов
/ 23 октября 2008

Мне было интересно ... почему бы не использовать просто старый include ?

...