Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование Тэгов и JavaBeans

Поиск

Тэг "hello world" не очень мощный. Определенно, он не сэкономит чьих-то усилий. В этом случае, конечно же, было бы гораздо проще напечатать слова "Hello World" самостоятельно. Давайте посмотрим на пример, который немного более продвинутый с точки зрения программирования и, в то же время, иллюстрирует, как тэги могут создавать объекты, доступные для JSP страницы.

В этот раз мы намереваемся создать приветственный тэг, который немного более полезен, чем "hello world", и поэтому немного более общий. Представьте тэг приветствия, который при использовании будет создавать объект приветствия и делать его доступным для JSP страницы. Если этот объект, JavaBean, имеет свойство, которое производит случайное приветствие, такое как "Hi there!" или "Hello", вы можете его использовать, например, так...

<tijtags:greetingtag id="randomgreeting"/>

<jsp:getProperty name="randomgreeting" property="greeting"/>


Это немного более запутано, чем последний тэг. Давайте взглянем более пристально на различия.

Во-первых, хотя это другой тэг без тела, он имеет атрибут, называемый id. Указанный выше тэг передает строку "randomgreeting" в тэг.

Далее, есть JSP действие, getProperty, которое используется для запроса значения параметра "greeting" из JavaBean'а, называемого "randomgreeting". Это не случайное совпадение, что имя этого bean'а то же самое, что и значение атрибута "id", вы можете предположить, что здесь этот тэг позволяет выполнить getProperty, используя JavaBean с этим именем. Обычно вы будете ожидать увидеть JSP действие <jsp:useBean..., объявленное в верхней части JSP файла до того, как вы сможете использовать действие getProperty, чтобы получить доступ к bean'у, но в этом случае этот тэг действительно определяет bean и делает его доступным из этой страницы.

Чтобы заставить такой тэг работать, нужно выполнить следующие шаги:

1. Создайте Javabean со свойством greeting и получите метод, который возвращает случайную строку приветствия, такую как "Hi there!" или "Hello".

2. Напишите класс, который реализует интерфейс Tag.

3. Дайте классу метод setId(), который позволит контейнеру установить атрибут id.

4. Создайте экземпляр JavaBean'а приветствия и сохраните его в контексте страницы.

5. Создайте TLD или файл дескриптора библиотеки тэга для тэга.

В этот раз нужно сделать несколько больше вещей, но они все еще достаточно очевидны. Вы уже знаете, как писать JavaBean, но здесь есть минимальное описание того, что будет необходимо.

package cx2.tags;

 

public class GreetingBean {

String greetings[] = {"Hello!","Howdy!","Hi There!","How do you do?"};

public String getGreeting() {

return greetings[(int)(Math.random()*greetings.length)];

}

}


Идея состоит в том, что класс тэга будет создавать экземпляр этого JavaBean'а, чтобы автор JSP страницы мог использовать действие getProperty на этой страницы.

Вот сам класс тэга.

package cx2.tags;

import javax.servlet.jsp.tagext.Tag;

import javax.servlet.jsp.PageContext;

import javax.servlet.jsp.JspException;

 

public class GreetingTag implements Tag {

private String id;

private PageContext pageContext;

public GreetingTag() {

}

public void setId(String id) {

this.id = id;

}

public void setPageContext(PageContext pageContext) {

this.pageContext = pageContext;

}

public void setParent(Tag parent) {

}

public Tag getParent() {

return null;

}

public int doStartTag() throws JspException {

pageContext.setAttribute(id, new GreetingBean(),

PageContext.PAGE_SCOPE);

return Tag.SKIP_BODY;

}

public int doEndTag() throws JspException {

return Tag.EVAL_PAGE;

}

public void release() {

}

}


Вы заметите, что здесь есть метод setId(). Это не метод интерфейса Tag, но контейнер все равно будет вызывать этот метод. Через него будет передаваться значение атрибута id, как это указано в JSP файле. Это высвечивает другую интересную взаимосвязь между JavaBean'ом и тэгом. Тэг, который имеет атрибуты, должен иметь параметры в стиле JavaBean'а, которые подчиняются корректному соглашению имен и должны соответствовать именам атрибутов. Эти параметры будут устанавливаться автоматически контейнером с помощью механизма JavaBean, встроенного в Java. Два дополнительных правила обычно не ассоциируются с JavaBean'ами, но здесь они очень важны, а именно: вы можете иметь только один метод установки для атрибута, и вы не должны вызывать метод установки самостоятельно, т.е. откуда угодно из кода тэга.

Как и прежде, большая часть работы для этого тега делается в методе doStartTag(). В этот раз его следует рассмотреть немного более внимательно, а именно тот факт, что каждый из методов doStartTag() и doEndTag() могут выбрасывать JspException. Это можно проигнорировать в настоящее время, но если возникает исключение в вашей реализации тэга, будет выброшено JspException, которое может завершиться тем, что оно отобразится в клиентском окне браузера, что редко бывает нужно. Техника обработки этого будет объяснена позднее.

Здесь метод doStartTag() использует метод setAttribute() объекта pageContext для создания экземпляра bean'а приветствия и хранения его в pageContext, указывая его имя и его область видимости. Имя берется их атрибута id, а область видимости - это хорошо знакомая константа PAGE_SCOPE, final параметр класса PageContext. Если это звучит запутанно, подумайте об этом как о двух частях. В класс тэга уже было передано имя через метод setId() и сохранено в переменной id. Теперь создается объект GreetingBean и добавляется в pageContext, ему передается имя, хранимое в переменной id. С точки зрения программирования это эквивалентно JSP акции: <jsp:useBean...>. Теперь JavaBean доступен для использования в действии <jsp:getProperty...> на JSP странице.

Все, что теперь осталось - это создать файл TLD. Так как такой уже существует, все, что вам нужно, это добавить другой тэг tag перед последним </taglib>.

..

<tag>

<name>greetingtag</name>

<tagclass>cx2.tags.GreetingTag</tagclass>

<bodycontent>empty</bodycontent>

<info> Adds a HelloWorld Bean to the page context. </info>

<attribute>

<name>id</name>

<required>true</required>

</attribute>

</tag>

..


Обратите внимание, что в этом тэге tag есть вложенный тэг, называемый attribute. Имя вложенного тэга attribute говорит контейнеру о том, как называется атрибут, а вложенный тэг required говорит контейнеру о том, является ли этот атрибут обязательным или нет. Обязательные вложенные тэги должны быть указаны, т.е. в данном случае

<tijtags:greetingtag id="randomgreeting"/>


в противном случае контейнер выбросит исключение, когда попытается загрузить JSP страницу.

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

Для использования тэга случайного приветствия и объекта bean'а, который он создает, вы должны будете указать тэг:

<tijtags:greetingtag id="randomgreeting"/>


который создает JavaBean в контексте страницы, чтобы вы могли его использовать.

Затем вам нужно получить свойство из bean'а:

<jsp:getProperty name="randomgreeting" property="greeting"/>


которое посылает в браузер приветствие. Эта последняя строка может затем быть использована столько раз, сколько вам нужно на JSP странице после приведенной выше декларации. При каждом появлении она будет производить разные приветствия. Обновление этой страницы в вашем браузере также станет причиной появления другого приветствия, поскольку каждый раз контейнер обрабатывает действие getProperty, в котором вызывается метод getGreeting() класса GreetingBean, который возвращает новое, случайное приветствие. (Обратите внимание, что использование метода get для JavaBean'а, возвращающего случайное значение, часто может грешить пуризмом. Здесь он использован, как хорошая демонстрация работы с bean'ом.)



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 127; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.209.89 (0.007 с.)