Тег с телом JSP

Как и в обычных тегах, между открывающим и закрывающим пользовательскими тегами может находиться тело тега, или body. Пользовательские теги могут использовать содержимое элемента bodycontent. На данный момент поддерживаются следующие значения для bodycontent:

· empty – пустое тело;

· jsp – тело состоит из всего того, что может находиться в JSP-файле. Используется для расширения функциональности JSP-страницы;

· tagdependent – тело интерпретируется классом, реализующим данный тег. Используется в очень частных случаях.

Когда разрабатывается пользовательский тег с телом, то лучше наследовать класс тега от класса BodyTagSupport, реализующего в свою очередь интерфейс BodyTag. Кроме методов класса TagSupport (суперкласс для BodyTagSupport), он имеет методы, среди которых следует выделить:

void doInitBody() – вызывается один раз перед первой обработкой тела, после вызова метода doStartTag() и перед вызовом doAfterBody();

int doAfterBody() – вызывается после каждой обработки тела. Если вернуть в нем константу EVAL_BODY_AGAIN, то doAfterBody() будет вызван еще раз. Если SKIP_BODY, то обработка тела будет завершена;

int doEndTag() – вызывается один раз, когда отработаны все остальные методы.

Для того чтобы тело было обработано, метод doStartTag() должен вернуть EVAL_BODY_INCLUDE или EVAL_BODY_BUFFERED; если будет возвращено SKIP_BODY, то метод doInitBody() не вызывается.

В следующем примере рассматривается класс обработки тега, который получает значения атрибута num (в данном случае методом установки значения для атрибута num будет метод setNum(String num)) и формирует таблицу с указанным количеством строк, куда заносятся значения из тела тега:

// пример # 5 : тег с телом : AttrTag.java

package test.mytag;

import java.io.IOException;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

public class AttrTag extends BodyTagSupport {

private int num;

public void setNum(String num) {

this.num = new Integer(num);

}

public int doStartTag() throws JspTagException {

try {

pageContext.getOut().write(

"<TABLE BORDER=\"3\" WIDTH=\"100%\">");

pageContext.getOut().write("<TR><TD>");

} catch (IOException e) {

throw

new JspTagException(e.getMessage());

}

return EVAL_BODY_INCLUDE;

}

public int doAfterBody()

throws JspTagException {

if (num– > 1) {

try {

pageContext.getOut().write("</TD></TR><TR><TD>");

} catch (IOException e) {

throw

new JspTagException(e.getMessage());

}

return EVAL_BODY_AGAIN;

} else {

return SKIP_BODY;

}

}

public int doEndTag() throws JspTagException {

try {

pageContext.getOut().write("</TD></TR>");

pageContext.getOut().write("</TABLE>");

} catch (IOException e) {

throw

new JspTagException(e.getMessage());

}

return SKIP_BODY;

}

}

В файл.tld следует вставить информацию о теге в виде:

<tag>

<name>bodyattr</name>

<tag-class>test.mytag.AttrTag</tag-class>

<body-content>JSP</body-content>

<attribute>

<name>num</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

При использовании в файле JSP тег bodyattr может вызываться с параметрами и без них:

пример # 6 : тег с телом : demotag3.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-5" pageEncoding="ISO-8859-5"%>

<%@ taglib uri="/WEB-INF/mytaglib.tld" prefix="mytag" %>

<HTML><HEAD>

<TITLE>Example</TITLE>

</HEAD><BODY>

<jsp:useBean id="rw" scope="request" class=

"test.my.MySet"/>

<mytag:bodyattr num="${rw.size}">

${rw.element}

</mytag:bodyattr>

<mytag:bodyattr> Просто текст </mytag:bodyattr>

</BODY></HTML>

В результате запуска этой JSP клиенту будет возвращено:

clip_image002

Рис. 22.1. Выполнение тега с телом

В примерах данной главы были использованы методы класса Rows, который приведен ниже:

/* пример # 7 : примитивный класс бизнес-логики : MySet.java */

package test.my;

public class MySet extends java.util.HashSet {

private java.util.Iterator it;

public MySet() {

//переписать этот класс на чтение информации из БД

this.add("Sun");

this.add("Microsoft");

this.add("IBM");

}

public String getSize() {

it = this.iterator();

return Integer.toString(this.size());

}

public String getElement() {

return it.next().toString();

}

}

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100