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

Вопрос 21.6

Читайте также:
  1. E. Некорректный вопрос
  2. I. Перечень вопросов и тем для подготовки к экзамену
  3. II. Вопросительное предложение
  4. VII. Вопросник для анализа учителем особенностей индивидуального стиля своей педагогической деятельности (А.К. Маркова)
  5. X. примерный перечень вопросов к итоговой аттестации
  6. Аграрный вопрос
  7. Анализ влияния рекламы на продвижение противопростудных средств
  8. Балканский вопрос в начале XXв. Русско-германские отношения
  9. Бланк вопросов
  10. БЛОК № 1 (1 – 10 вопрос)
  11. БЛОК № 2 (11 – 20 вопрос)
  12. Блок № 4 (31 – 40 вопрос)

Каким образом файлы cookie присоединяются к объекту-ответу HttpServletResponse resp?

1) resp.setCookie(Cookie cookie);

2) resp.addCookie(Cookie cookie);

3) resp.createCookie(Cookie cookie);

4) resp.putCookie(Cookie cookie);

5) resp.setCookies(Cookie cookie).

 
Глава 22

ПОЛЬЗОВАТЕЛЬСКИЕ ТЕГИ

Начиная с версии JSP 1.1 у разработчиков появилась возможность определения собственных тегов. Это значительно упростило жизнь Web-дизайнерам, которым привычнее использовать теги, а не код на языке Java. Если один и тот же скриптлет используется на разных страницах, то он явный кандидат для переноса кода в пользовательский тег. Фактически последний представляет собой перенос Java-кода из страницы JSP в Java-класс, что можно считать продолжением идеи
о необходимости отделения логики от представления. JSP-страница должна содержать как можно меньше логики.

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

При определении нового тега создается класс Java, который должен реализовывать интерфейс javax.servlet.jsp.tagext.Tag. Обычно создается класс, который наследует один из классов TagSupport или BodyTagSupport (для тегов без тела и с телом соответственно). Указанные классы реализуют интерфейс Tag и содержат стандартные методы, необходимые для базовых тегов. Класс для тега должен также импортировать классы из пакетов javax.servlet.jsp и, если необходима передача информации в поток вывода, то java.io или другие классы.

Простой тег

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

В качестве примера можно привести следующий класс тега, с помощью которого клиенту отправляется информация о размере некоторой коллекции объектов.

/ пример # 1: простейший тег без тела и атрибутов: GetInfoTag.java */

package test.mytag;

import javax.servlet.jsp.tagext.TagSupport;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import java.io.IOException;

// класс бизнес-логики (см. пример #7 этой главы)

import test.my.MySet;

 

public class GetInfoTag extends TagSupport {

public int doStartTag() throws JspException {

//получение информации, передаваемой на страницу

int size = new Integer(new MySet().getSize());

String str = "Size =<B>(" + size + ")</B>";

try {

JspWriter out = pageContext.getOut();

out.write(str);

} catch (IOException e) {

throw new JspException(e.getMessage());

}

return SKIP_BODY;

}

}

Если в теге отсутствует тело, метод doStartTag() должен возвратить константу SKIP_BODY, дающую указание системе игнорировать любое содержимое между начальными и конечными элементами создаваемого тега.

Чтобы сгенерировать вывод, следует использовать метод write() класса JspWriter, который выводит на страницу содержимое объекта str. Объект pageContext класса PageContext – это атрибут класса, унаследованный от класса TagSupport, обладающий доступом ко всей области имен, ассоциированной со страницей JSP. Метод getOut() этого класса возвращает ссылку на поток JspWriter, с помощью которой осуществляется вывод. С помощью методов класса PageContext можно получить:

getRequest() – объект запроса;

getResponse() – объект ответа;

getServletContext() – объект контекста сервлета;

getServletConfig() – объект конфигурации сервлета;

getSession() – объект сессии;

ErrorData getErrorData() – информацию об ошибках.

Кроме этого:

– с помощью метода forward(String relativeUrlPath) сделать перенаправление на другую страницу или action-класс;

– с помощью метода include() включить в поток выполнения текущие ресурсы ServletRequest или ServletResponse, определяемые относительным адресом.

Следующей задачей после создания класса обработчика тега является идентификация этого класса для сервера и связывание его с именем XML-тега. Эта задача выполняется в формате XML с помощью дескрипторного файла библиотеки тегов.

Файл дескриптора .tld пользовательских тегов должен содержать корневой элемент <taglib>, содержащий список описаний тегов в элементах <tag>.
Каждый из элементов определяет имя тега, под которым к нему можно обращаться на странице JSP, и идентифицирует класс, который обрабатывает тег.
Для идентификации используется полное имя класса, например: test.mytag.GetInfoTag. Также должен присутствовать стандартный заголовок XML-файла с указанием версии и адреса ресурса для схемы XSD, который определяет допустимый формат тега <taglib>.

Перед списком тегов, сразу после открывающего тега <taglib>, указываются следующие параметры:

· tlib-version – версия пользовательской библиотеки тегов;

· short-name – краткое имя библиотеки тегов. В качестве него принято указывать рекомендуемое сокращение для использования в JSP-страницах;

· uri – уникальный идентификатор ресурса, определяющий данную библиотеку. Параметр необязательный, но если его не указать, то необходимо регистрировать библиотеку в каждом новом приложении через файл web.xml;

· info – указывается область применения данной библиотеки.

Основным в элементе <taglib> является элемент <tag>. В элементе tag между его начальным <tag> и конечным </tag> тегами должны находиться четыре составляющих элемента:

· name –тело этого элемента определяет имя базового тега, к которому будет присоединяться префикс директивы taglib;

· tag-class –полное имя класса-обработчика тега;

· info – краткое описание тега;

· body-content – имеет значение empty, если теги не имеют тела. Теги с телом, содержимое которого может интерпретироваться как обычный JSP-код, используют значение jsp, а редко используемые теги, тела которых полностью обрабатываются, используют значение
tagdependent.

Вся эта информация помещается в файл mytaglib.tld,который для JSP версии 2.0 имеет вид:

<?xml version="1.0" encoding="ISO-8859-1"?>

<taglib

xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/ web-jsptaglibrary_2_0.xsd"

version="2.0"> <!--дескриптор библиотеки тегов -->

<tlib-version>1.0</tlib-version>

<short-name> mytag </short-name>

<uri> /WEB-INF/mytaglib.tld </uri>

<tag>

<name> getinfo </name>

<!--класс обработки тега -->

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

<body-content> empty </body-content>

</tag>

</taglib>

Для JSP версии 2.1 тег taglib записывается в виде:

<taglib version="2.1"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

web-jsptaglibrary_2_1.xsd">

Зарегистрировать адрес URI библиотеки пользовательских тегов mytaglib.tld для приложения можно двумя способами:

1. Указать доступ к ней в файле web.xml, для чего следует указать после
<welcome-file-list\>:

<jsp-config>

<taglib>

<taglib-uri>/WEB-INF/mytaglib.tld</taglib-uri>

<taglib-location>/WEB-INF/mytaglib.tld

</taglib-location>

</taglib>

</jsp-config>

2. Прописать URI библиотеки в файле-описании (.tld) библиотеки и по­местить этот файл в папку /WEB-INF проекта. В таком случае в файле web.xml ничего прописывать не требуется. Преимуществом данного способа является то, что так можно использовать библиотеку во многих приложениях под одним и тем же адресом URI. Естественно, в этом случае TLD-файл должен размещаться не в локальной папке проекта, а, например, в сети Интернет как независимый файл.

Непосредственное использование в странице JSP созданного и зарегистри­рованного простейшего тега выглядит следующим образом:

<!-- пример # 2: вызов простого тега: demotag1.jsp -->

<HTML><HEAD>

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

prefix="mytag" %>

</HEAD>

<BODY>

<mytag:getinfo/>

</BODY>

</HTML>

В результате выполнения тега клиент в браузере получит следующую информацию:

Size = (3)

Тег с атрибутами

Тег может содержать параметры и передавать их значения для обработки
в соответствующий ему класс. Для этого при описании тега в файле *.tld используются атрибуты, которые должны объявляться внутри элемента tag с помощью элемента attribute. Внутри элемента attribute между тегами <attribute> и </attribute> могут находиться следующие элементы:

· name – имя атрибута (обязательный элемент);

· required – указывает на то, всегда ли должен присутствовать данный атрибут при использовании тега, который принимает значение true или false (обязательный элемент);

· rtexprvalue – показывает, может ли значение атрибута быть JSP-выражением вида ${expr} или <%=expr%> (значение true) или оно должно задаваться строкой данных (значение false). По умолчанию устанавливается false, поэтому этот элемент обычно опускается, если не требуется задавать значения атрибутов во время запроса (необязательный элемент).

Соответственно для каждого из атрибутов тега класс, его реализующий, должен содержать метод set ИмяАтрибута ().

В следующем примере рассматривается простейший тег с атрибутом firstname, который выводит пользователю сообщение:

// пример # 3: тег с атрибутом: HelloTag.java

package test.mytag; import javax.servlet.jsp.tagext.TagSupport; import java.io.IOException; public class HelloTag extends TagSupport { private String firstname; public void setFirstname(String firstname) { this. firstname = firstname; } public int doStartTag() { try { pageContext.getOut().write("Hello, " + firstname); } catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; }}

В файл mytaglib.tld должна быть помещена следующая информация
о теге:

<tag>

<name> hello </name>

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

<body-content> empty </body-content>

<attribute>

<name> firstname </name>

<required> true </required>

<rtexprvalue> true </rtexprvalue>

</attribute>

</tag>

Использовать созданный тег в файле demotag2.jsp можно следующим образом:

пример # 4: вызов тега с передачей ему значения: demotag2.jsp

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="/WEB-INF/mytaglib.tld" prefix="mytag"%>

<%@ page

language="java"

contentType="text/html; charset=CP1251"

pageEncoding="CP1251"

%><HTML><HEAD>

<TITLE>demotag2.jsp</TITLE>

</HEAD>

<BODY>

<c:set var="login" value="Bender"/>

< mytag:hello firstname ="${login}" />

</BODY>

</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.011 сек.)