Пользовательские теги создание пользовательских тегов

Я пытаюсь создать собственный тег, который использует другие пользовательские теги.

Мой подход был таким:

public int doAfterBody() throws JspTagException {
    BodyContent bc = getBodyContent();
    if (bc!=null) {
        String body = bc.getString().toUpperCase();
        try {
            bc.clearBody();
            bc.getEnclosingWriter().write("<some-other-custom-tag>");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return SKIP_BODY;
}

Похоже, это не работает, потому что все, что я пишу с помощью BodyContent, больше не обрабатывается, поэтому вывод JSP все еще содержит <some-other-custom-tag>. Есть ли способ обработать вывод до того, как он попадет в браузер?

РЕДАКТИРОВАТЬ: я, вероятно, не очень хорошо сформулировал свой вопрос. (Я думаю) Я в курсе, как работает компиляция и как запрос превращается в документ.

Насколько я понимаю, компилятор перебирает мой JSP и находит <custom-tag>. Он просматривает указанный TLD и находит класс Java, связанный с тегом. Он вызывает класс, устанавливает параметры и прочее, а затем выполняет такие методы, как doAfterBody() (в зависимости от того, какой тип обработчика тегов расширяет класс). Оттуда я пишу <some-other-custom-tag> в вывод JSP. Я понимаю, что это не работает, потому что компилятор не будет просматривать его снова и, следовательно, не поймет, что есть еще один пользовательский тег для обработки.

Я ищу способ либо (1) заставить компилятор обработать (части) вывода еще раз, либо (2) заставить компилятор обработать объект String, содержащий <some-other-custom-tag>, чтобы я мог записать это в вывод.

Я также открыт для любого альтернативного решения, конечно.


person icke    schedule 21.08.2012    source источник
comment
JSP обрабатывается на стороне сервера, а не в браузере.   -  person Andrei Kapelchik    schedule 21.08.2012
comment
Да, именно поэтому я спросил, есть ли способ обработать вывод прежде чем он окажется в браузере.   -  person icke    schedule 21.08.2012


Ответы (2)


Вывод текста из пользовательского тега должен быть текстом, который может быть понят браузером (HTML, JavaScript, CSS и т. д.).

Этот контент никогда больше не анализируется, потому что это не имеет особого смысла: когда сервер знает, что он должен прекратить анализ этого выходного контента и отправить его в браузер? Каковы будут накладные расходы на это?

Что вы можете сделать, так это: все, что делается этим <some-other-custom-tag>, в любом случае является кодом Java, поскольку теги JSP являются классами Java. Я бы реорганизовал классы тегов, чтобы расширить общий абстрактный, а затем поместил бы этот общий функционально в последний, чтобы оба ваших пользовательских тега могли получить к нему доступ.

person Alonso Dominguez    schedule 21.08.2012
comment
У меня нет доступа к исходному коду класса для ‹другого-настраиваемого-тега›. Декомпиляция файла класса — это вариант, но я бы предпочел его избежать. В противном случае это звучит как хорошее решение. - person icke; 21.08.2012
comment
тогда, возможно, вы сможете преобразовать код своего пользовательского тега в шаблон JSP, который будет выводить <some-other-custom-tag> на основе некоторой логики. Вы можете повторно использовать этот шаблон JSP в других JSP, используя тег <jsp:include>. - person Alonso Dominguez; 21.08.2012

Вы неправильно используете собственный пользовательский тег. Вам нужно объявить это только на странице JSP.

Все, что вы выводите с помощью метода, будет обрабатываться браузером jspWriter.write() будет обрабатываться браузером. А пользовательские теги JSP анализируются компилятором JSP и преобразуются в исполняемый сервлет на стороне сервера. Это необходимо сделать перед созданием и отправкой окончательных данных пользователю.

Просмотрите эти статьи для более точного понимания проблемы:

Жизненный цикл страницы JSP

Пользовательские теги на страницах JSP

person Andrei Kapelchik    schedule 21.08.2012