АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Http://localhost:8080/FirstProject/demotag2.jsp

в браузер будет выведено:

Hello, Бендер

Тег с телом

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

· 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 клиенту будет возвращено:

Рис. 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();

}

}

Элементы action

Элемент jsp:attribute позволяет определить значение атрибута тега в теле XML-элемента, а не через значение атрибута стандартного или пользовательского тега:

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

<HTML>

<mytag:hello>

<jsp:attribute name="firstname">

Bender

</jsp:attribute>

</mytag:hello>

</HTML>

в браузер будет выведено:


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 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.)