Файлы тегов JSP: проверка на вложение - PullRequest
2 голосов
/ 01 апреля 2009

Я пишу некоторые вложенные пользовательские теги, используя JSP. Я понимаю, что есть два способа сделать это: 1) написать обработчик тега, расширяющий BodyTagSupport, 2) написать файл тега.

В 1-м методе код ужасен. И я не смог найти способ включить текущие теги Struts. Если я пишу следующее с использованием JspWriter, я получаю эту строку в окончательном выводе HTML вместо значимого вывода, сгенерированного скомпилированным JSP.

 <bean:write name="label">

Итак, я перешел ко 2-му способу, я написал файлы тегов. Тогда вышеуказанная проблема решена. Однако тогда у меня возникают проблемы с получением родительского тега тега, так как я не знаю класс родительского тега. Я мог бы сделать следующее, если бы написал свой собственный обработчик тегов,

    ParentTag parent = 
        (ParentTag)findAncestorWithClass(this, ParentTag.class);
      if (parent == null) {
        throw new JspTagException("this tag is outside of its parent tag");
      }

Но так как я использовал файлы тегов, я не совсем знаю, к какому классу относится его родитель.

Как я мог решить эту проблему?

Ответы [ 3 ]

1 голос
/ 15 апреля 2009

Что ж, файл тегов сам по себе не является "классом", как обработчик тегов (я имею в виду, что он, как и все файлы JSP, очевидно, но вы меня поняли).

Когда мне приходится делать «вложенные» теги с файлами тегов, я помещаю данные о состоянии в запрос под «хорошо известным именем». Эффективный общий «секрет» между двумя тегами.

Например, в одном файле тега я мог бы сделать:

<%
jspContext.setAttribute("_myWellKnownName", new java.util.LinkedHashMap(), PageContext.REQUEST_SCOPE);
%>

Затем в последующем файле тегов:

<%
    java.util.LinkedHashMap map = (java.util.LinkedHashMap) jspContext.findAttribute("_myWellKnownName");
%>

Затем я манипулирую этой переменной все, что хочу.

В родительском теге исполняется код дочерних тегов, поэтому после того, как моя карта (в данном случае) заполнена, и я могу делать с ней все, что мне нужно сделать в этот момент.

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

У меня не было необходимости в моих тегах, где у меня есть родители, вложенные в других родителей (то есть, когда один тег будет конфликтовать с состоянием другого), хотя, очевидно, это может быть проблемой с этим методом в общем смысле. Тем не менее, все еще эффективен для моих целей.

0 голосов
/ 31 марта 2011

Может быть это будет полезным.

Майкл Брид 9 ноября 2010 года в 1:23

Я знаю, что это почти год сейчас, но, как я случайно я сам решил использовать файлы тегов Я бы исправил заявленное ограничение Вот. Фактически возможно ввести несколько разделов, используя то, что термины JSP «Фрагменты» и использование jsp: invoke тег. Вот как:

0 голосов
/ 15 апреля 2009

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

Я не уверен, стоит ли мне тогда закрывать этот вопрос. Потому что ответ несколько глупый. Старшие пользователи StackOverflow, пожалуйста, сообщите.

...