Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Что нам дают произвольные теги?Содержание книги Поиск на нашем сайте
Мощь: Так как с помощью JavaBeans реальные проблемы программирования, такие как опрос баз данных или создание сложных вычислений и т. п., могут быть выполнены в Java коде со всей мощью библиотек Java за вашими плечами. Произвольные тэги JSP также позволяют вам создавать объекты, доступные автору web страницы посредством фрагментов Java кода, или "скриплеты", так что при аккуратном дизайне вы можете создать огромную функциональность, доступную через простой и ясный интерфейс. Последовательность: В отличие от JavaBean, представленный код четко отделяется от кода бизнес логики, потребность в скриплетах снижается и большая часть разработки выполняется с помощью HTML при использовании тэгов. Поэтому это легче понимать автору web страницы и намного легче читать и отлаживать. Инкапсуляция: Бизнес логика определяется в Java классах, которые могут решать сложные проблемы программирования, такие как сетевое взаимодействие или опрос базы данных. Этот код может быть протестирован изолировано и, наконец, представлен в виде простого тега, что идеально для web автора при использовании во время создания web приложения. Повторное использование: Тэги хранятся в библиотеках, которые в точности являются сущностями повторного использования во время web разработки. Библиотека тэгов обычно содержит набор тэгов сходной или соединенной функциональности. Библиотека может быть легко включена в web страницу автором, которому необходима эта функциональность. Тэг намного легче использовать, чем обыкновенный метод Java! Здесь, если вы помните раннее обсуждение использования Java bean из JSP в главе, посвященной JSP, вы можете спросить себя: почему это необходимо. JavaBeans в JSP также помогает нам отделить уровень представления от бизнес логики. Beans тоже могут храниться в библиотеке, они могут повторно использоваться, имеют последовательный интерфейс и могут даже взаимодействовать со скриплетами, так почему нам необходимы теги? Ответ достаточно хитрый. Beans необходимы для разработчика приложений и очень полезны, если используются в правильном месте. Фактически, как мы увидим, beans и произвольные теги очень хорошо дополняют друг друга. Хотя различия состоят в том, что bean являются компонентами, а произвольные теги являются, в сущности, действием или обработчиком. Это необходимо понять и хорошо взвешивать в вашем дизайне, не будет ли некорректным использование бина в этом месте. Beans, как и любые другие компоненты, имеют свойства, методы и внутреннее состояние. Что делает использование beans в JSP легким, это взаимодействие между JSP страницами и Java beans, предназначенными специально для получения и установки свойств bean. Если вы именуете методы вашего bean в соответствии с соглашением о JavaBeans, вы можете получить очень простой доступ к этим свойствам через JSP. Давайте вспомним JavaBeans. Рассмотрим bena персоны с двумя свойствами: имя и возраст. Чтобы получить доступ к ним через JSP теги, вам необходимо использовать <jsp:usebean …> действие и <jsp:getProperty name=”beanName” property=”requiredProperty”> действие для каждого из этих двух значений. Если вы хотите поместить их в строки HTML таблицы, вы должны указать .. <table> <tr> <td><jsp:getProperty name=”personbean” property=”name”></td> <td><jsp:getProperty name=”personbean” property=”age”></td> </tr> </table> ..
Одна из великих сил при использовании JavaBean совместно с JSP является ограниченной. Поскольку JSP теги getProperty и setProperty легко использовать для установки и чтения свойств bean'а. Помните, что это ссылки для использования методов установки и получения. Но если вы попробуете вызвать другие методы для bean'а, вы должны сделать это напрямую и вы ограничены кодом скриплета или кодом выражения, используя тэги <% %>. При этом код начинает выглядеть немного ужасающе и непоследовательно. Рассмотрим фрагмент. <ol> <% while (list.hasNextElement()) { list.nextElement(); %> <li><jsp:getProperty name=”list” property=”currentElement”></li> <% } %> </ol>
Некоторый код скриплетов неизбежен, но большинство его нежелательна. Как только возрастает сложность кода, то комбинация HTML тэгов, JSP директив, действий и кода скриплета, каждый из которых в своей нотации скобок, будет увеличивать сложность кода, делая его сложным для чтения и ухода. Как это предотвратить? Очень заманчиво написать bean, который возвращает значения, которые уже заключены в теги. Таким образом, это, на первый взгляд, удаляет большую часть HTML кода и делает документ короче и проще. Подобная реализация в виде bean может просто возвращать строковое значение из методов get, которые уже имеют форматирующие теги в себе и выходящие данные должны отображать себя лучше на экране. Как заманчиво это звучит, но это оборачивается очень плохой идеей, как вы вскоре увидите. Относительно bean, который имеет строковый метод, возвращающий таблицу строк данных, включая тэги. Это может выглядеть примерно так... public class PersonDataBean { private int age; private String name;
String getCurrentRow() { return “<tr><td>” + name + “</td><td>”+ age + “</td></tr>”; } }
.. <table> jsp:getProperty name=”personbean” property=”currentRow”> </table> ..
С точки зрения программирования дела обстоят еще хуже. Программист, используя этот bean, должен получить назад результат в таблице, не зависимо от того подходит это ему или нет. Расположение и порядок полей не может быть изменен программно и, хотя можно использовать страницу стилей для изменения стиля вывода, будет невозможно сделать что-либо специфичное (например, показать одну колонку жирным шрифтом). Это значит, что автор web страницы, использующий этот bean, теперь ограничен представляемыми данными в формате, определенном разработчиком bean'а. Разработчик bean'а может быть великолепным разработчиком баз данных, но может не быть тем человеком, который отвечает за финальное представление. Фактически, очень желательно, чтобы требования к расположению не были даже известны во время разработки bena'а. Bean должен быть написан с возможностью повторного использования в уме, но ни один дизайнер web страницы не одобрит работу с предварительно определенным расположением. Таким образом, хоть и кажется, что проблема увеличения сложности кода решена, фактически, мы потеряли возможность повторного использования кода. Вы всегда будете наталкиваться на эти проблемы расположения при динамическом web контенте. Когда разрабатывается страница, вам постоянно необходима разметка или представление, которое зависит от состояний определенных программ (таких как переменная длина таблицы, различные цвета для значений внутри определенных рамок и т. п.). Такое динамическое поведения в точности является тем, что мы можем ожидать от web страницы, но это поведение делает код тяжелым для чтения, поскольку требует скриплетного программирования с забавными скобками, встроенными в код. Понятно, что код скриплета не может быть удален их JSP страницы полностью, и это нам не нужно. Фактически, написание скриплетов с использованием JavaBeans (или использование любого другого скриптового языка с компонентами любого рода) это великолепный способ построить приложение до тех пор, пока не появится злоупотребление. До сих пор мы обнаружили две проблемы: необходимость отделить код представления от бизнес логики; и необходимость предотвратить сложности любого рода, которые вкрадываются в наш код представления при смешивании кода HTML со скриплетами. Мы также можем видеть, что не смотря на всю полезность JavaBeans, они не всегда решают эти проблемы и могут приводить к плохому дизайну. Таким образом, в игру вступают произвольные теги. О JSP тэге можно думать, как о действии или об обработчике для некоторого количества событий. Эти события реально запускаются JSP контейнером путем чтения JSP исходников и разбора каждого тэга. Различные методы, соответствующие этим событиям, это ничто иное, как doStartTag() и doEndTag() - точки, в которых они вызываются, должны быть понятны из названий. Конечно же, есть больше чем 2 метода, которые вам будут нужны для создания произвольных тегов, и когда мы пишем свои собственные тэги, мы имеем разные классы и интерфейсы, которые мы можем использовать, чтобы получить больше или меньше функциональности, по необходимости. Давайте взглянем на простейший тэг, тэг "Hello World!" будет выполнен славно. Было бы идеально, если бы тэг должен был отображать Hello World. Такой тэг должен выглядеть примерно так: <tijtags:helloworldtag/>
<tijtags:helloworldtag> </tijtags:helloworldtag>
1. Написать класс, который реализует интерфейс Tag, находящийся в пакете javax.servlet.jsp.tagext.Tag. 2. Реализовать методы "setPageContext(), doStartTag() и doEndTag()" 3. Создать TLD файл или дескриптор библиотеки тэга для тэга. Давайте позаботимся о первых двух задачах: package cx2.tags; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.JspException; import java.io.IOException;
public class HelloWorldTag implements Tag { PageContext pageContext; public void setPageContext(PageContext pageContext) { this.pageContext = pageContext; } public void setParent(Tag parent) {}
public Tag getParent() { return null; } public int doStartTag() throws JspException { try { pageContext.getOut().println("Hello World!"); } catch(IOException ioe) { ioe.printStackTrace(); } return Tag.SKIP_BODY; } public int doEndTag() throws JspException { return Tag.EVAL_PAGE; } public void release() {} }
Вы заметите, что определено свойство, называемое pageContext, имеющее тип PageContext, находящийся в пакете javax.servlet.jsp. Оно инициализируется в методе setPageContext(). Контейнер вызывает его автоматически и передает в него ссылку на PageContext при первом чтении тэга. Эта ссылка должна сохраняться, потому что она понадобится позже. Спецификация JSP Tag Extension гарантирует, что метод setPageContext всегда будет вызываться до метода doStartTag(). Дале реализован метод doStartTag(). Этот метод выполняет всю работу, которую должен делать этот тэг. С помощью объекта pageContext, который был ранее проинициализирован, запрашивается выходной поток JSP. Это выходной поток, который отправляется назад браузеру, читающему JSP страницу, и используется метод println() этого потока точно так же, как если бы вы использовали System.out. Обратите внимание, что метод doStartTag() возвращает значение Tag.SKIP_BODY. Таким образом сообщается контейнеру, что он должен игнорировать все, что находится между начальным и конечным тэгом. Так как этот тэг не имеет тела, это все, что нам нужно в настоящий момент. Реализация метода doEndTag() просто возвращает значение Tag.EVAL_PAGE. Это говорит контейнеру, что нужно продолжить процесс обработки JSP страницы, как это было до того, как нашли наш тэг. Опять таки, поскольку наш тэг очень прост, это все, что нужно. Есть несколько других методов в интерфейсе Tag, которые должны быть реализованы, но только три упомянутых выше метода важны в настоящий момент. Все, что теперь осталось сделать для тэга HelloWorld - это описать для контейнера, что ваш новый тэг вызывает и в каком классе он реализован. Чтобы сделать это, вам необходимо написать дескриптор библиотеки тэга - это XML файл, который используется контейнером для получения информации о тэге или тэгах, определенных вами. Этот файл сохраняется с расширением.tld и помещается на ваш сервер с вашими JSP файлами. <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>htl</shortname> <uri>http://www.eckelobjects.com/tagtut/tags1.0</uri> <info> Library of tags on increasing complexity to demonstrate the use of tag libraries.</info> <tag> <name>helloworldtag</name> <tagclass>cx2.tags.HelloWorldTag</tagclass> <bodycontent>empty</bodycontent> <info> echo's hello world to the browser. </info> </tag> </taglib>
Чтобы использовать новый тэг в JSP странице вы должны указать что-то наподобие этого: <%@ taglib uri="/tijtags.tld" prefix="tijtags"%> <b> <tijtags:helloworldtag/> </b> Вот и все, что вам нужно сделать, чтобы послать "Hello World" назад в браузер! В первой строке помещена директива JSP taglib. Атрибут uri говорит контейнеру, что ваш дескриптор библиотеки тэгов может быть найден в файле, называемом "tijtags.tld" в текущем каталоге. Атрибут prefix говорит контейнеру, какое пространство имен вы используете, чтобы ссылаться на ваши тэги. Тэг <b> - это просто декорация, чтобы особо указать на то, что вы можете свободно использовать HTML вместе с JSP тэгами. Такая комбинация становится очень мощной, когда вы пишите тэги итераций.
|
||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 126; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.3.204 (0.012 с.) |