|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
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> в браузер будет выведено: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.) |