Вопрос

Я подумываю о создании нескольких 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>

Плюсов еще больше, но если это снижает производительность на рабочих серверах, то, вероятно, оно того не стоит.

Это было полезно?

Решение 2

Я сделал тест производительности.Разница в производительности очень небольшая, так что это не проблема.

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

Я создал 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 миллисекунд пр.тег вполне приемлемый.

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top