powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSP Custom Tag need help
3 сообщений из 3, страница 1 из 1
JSP Custom Tag need help
    #33529551
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрабатываю custom tag. Занимаюсь этим первый раз.

В итоге получится что-то вроде этого:


Код: plaintext
1.
2.
3.
4.
<ct:table items="<%=some_collection%>">
<ct:column name="firstName" title="Name"/>
<ct:column name="lastName" title="Last Name"/>
<ct:footer/>
</ct:table>
Т.е. на основании коллекции будет генериться таблица.
<ct:table будет идти итератором по коллекции и потом делать EVAL_BODY_TAG если элементы еще есть>

<ct:columnt> будет смотреть нужные ему атрибуты в своем предке (<ct:table> и на основании этого выводить нужные данные

<ct:footer> выведется только после того когда закончится коллекция.

Начал с простого. Сделать таг, который будет проходить по кругу и каждый раз генерить свое содержимое.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<tag>
<name>table</name>
<tagclass>somepack.MainTableTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>

Класс тега:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 package  somepack;

 import  javax.servlet.jsp.tagext.BodyTagSupport;
 import  javax.servlet.jsp.tagext.BodyContent;
 import  javax.servlet.jsp.JspException;
 import  javax.servlet.jsp.JspWriter;
 import  java.io.IOException;
 import  java.util.Collection;
 import  java.util.Iterator;

 public   class  MainTableTag  extends  BodyTagSupport {
 private  Collection items =  null ;
 private  Iterator it =  null ;
 private  String currentItem;

 public  String getCurrentItem() {
 return  currentItem;
}

 public   void  setCurrentItem(String currentItem) {
 this .currentItem = currentItem;
}

 public  Collection getItems() {
 return  items;
}

 public   void  setItems(Collection items) {
 this .items = items;
}

 public   int  doStartTag()  throws  JspException {
 if  (items.size()>= 1 ) {
it = items.iterator();
 return  (EVAL_BODY_BUFFERED);
}  else  {
 return  (SKIP_BODY);
}
}

 public   int  doAfterBody()  throws  JspException {
 if  (it.hasNext()) {
BodyContent body = getBodyContent();
setCurrentItem(it.next().toString());
JspWriter out = body.getEnclosingWriter();
 try  {
out.println(body.getString());
}  catch  (IOException e) {
 throw   new  JspException(e.getMessage());
}
body.clearBody();
 return  (EVAL_BODY_BUFFERED);
}  else  {
// items = null;
 return  (SKIP_BODY);
}
}
}
т.е. здесь вся функциональность пока сводится к тому, что мы проходим по всей коллекции и генерируется каждый раз тело тега.

currentItem - для будущего использования вложенными тегами.

Тестирую на такой вот JSP:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<%@ page  import ="java.util.Collection"%>
<%@ page  import ="java.util.ArrayList"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="ct" prefix="ct"%>
<html>
<head>
<title>Table tag test</title>
</head>
<body>
<%! ArrayList c =  new  ArrayList(); %>
<%
c.add("Hello");
c.add("Good morning");
c.add("Good day!");
c.add("Gooten tak!");
%>


<ct:table items="<%=c%>">
Hello<br>
</ct:table>



</body>
</html>
Результат довольно интересный

Ссылка на эту страницу есть с index.jsp, который запускается сразу. Открываем эту страницу первый раз. Все ок. Четыре раза Hello. Нажимаю back, открываю опять. Опять все хорошо. Но на третий раз выводится уже не 4, а 8 Hello, на четвертый раз - 12 Hello и так далее. В чем затык? В коде класса тега есть закомментированная строчка //items = null. При раскомментировании - никакого результата.

Изменил код:

Код: plaintext
1.
2.
3.
4.
 public   void  setItems(Collection items) {
System.out.println("<DEBUG> --> setItems()");
System.out.println("ITEMS: "+items);
 this .items = items;
}

При третьем заходе коллекция ставится удвоенная и т.д.

Ошибка на JSP или в коде тега?
...
Рейтинг: 0 / 0
JSP Custom Tag need help
    #33530791
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс для тага, в твоем случае MainTableTag создается только один раз и затем всеми пользуется. Поэтому все глобальные переменные нужно обнулять, т.е. в классе тага, в методе , который выполняется самым последним (не помно что за метод) написать - items = null; и желательно это делать для всех глобальных переменных.
...
Рейтинг: 0 / 0
JSP Custom Tag need help
    #33532326
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я написал там отдельно, что есть закомментированная строчка. которые по-любому выполняется. ошибку я нашел, она оказалась в JSP.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSP Custom Tag need help
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]