Введение
Вскоре после того, как в марте 1999 г. был опубликован том Graphic Java, посвященный Swing, я заметил, что Java-программы, предназначенные для работы на стороне сервера, приобретают все большую популярность. Пришлось задуматься, не следует ли посвятить мою следующую книгу именно этим вопросам. Несмотря на то что все мое время было заполнено увлекательными экспериментами с XML, XSLT и Java, я отдавал себе отчет в том, что эти средства играют, скорее, вспомогательную роль при создании Web-приложений. Основной технологией, как мне тогда казалось, являются сервлеты.
Надо признаться, сервлеты не приводили меня в восторг. Я недоумевал, как могут разработчики мириться с тем, что им приходится создавать интерфейсные элементы, формируя HTML-код посредством операций печати. С 1984 г. я участвовал в программных проектах, где к моим услугам были объектно-ориентированные языки и инструментальные средства создания пользовательских интерфейсов. Я имел опыт разработки приложений на Smalltalk, Eiffel и NeXTSTEP и мне казалось, что использование HTML, а в особенности написание программных кодов для генерации HTML-элементов, можно сравнить с попытками ездить на спортивном автомобиле по песчаным насыпям.
В 1999 г. технология JSP делала свои первые шаги, но уже тогда можно было понять, насколько она перспективна. Благодаря JSP появилась возможность объединять Java и HTML и открылись новые перспективы создания Web-приложений. Кроме того, в спецификации JSP 1.0 одна фраза привлекла особое внимание. Речь шла о том, что в спецификации JSP 1.1 будет предусмотрена поддержка расширяемых дескрипторов; эти дескрипторы можно будет применять в любом JSP-документе. Разработчик получал возможность создавать собственные элементы, инкапсулировать в них Java-код и включать в документ как обычные дескрипторы. Я понял, что темой моей следующей книги будет JSP.
Я начал работать над введением в JSP и даже написал первую главу, но тут мне пришлось пересмотреть свое решение. На то были две причины. Во-первых, в изданиях, рассчитанных на начинающих, нет недостатка, а я не хотел, чтобы моя книга стала лишь одной из многих. Во-вторых, первая глава получилась скучной, а я терпеть не могу скучных книг. Поэтому я решил оставить начатую работу и написать книгу, которую вы держите в руках.
О чем эта книга
Как видно из названия, эта книга о JavaServer Pages, в частности о расширенных средствах, предоставляемых в распоряжение разработчика JSP-документов. Главной целью было рассказать читателю о том, как с помощью компонентов bean, сервлетов и JSP создаются гибкие расширяемые приложения, удобные в сопровождении.
Данная книга начинается с рассмотрения пользовательских дескрипторов, т.е. с тех вопросов, которыми обычно заканчиваются книги, представляющие собой введение в JSP. Поддержка пользовательских дескрипторов - одно из главных преимуществ JSP, поскольку данная возможность позволяет организовывать одновременную работу нескольких специалистов, при этом они практически не зависят друг от друга. Далее в книге рассматриваются HTML-формы, JSP-шаблоны, архитектуры Model 1 и Model 2, поддержка событий, вопросы безопасности, работа с базами данных и XML. В последней главе продемонстрировано использование данных технологий при создании реального Web-приложения.
API сервлетов и JSP
Коды программ, приведенные в данной книге, соответствуют спецификациям Servlet 2.2 и JSP 1.1. Несмотря на то что проекты спецификаций Servlet 2.3 и JSP 1.2 появились в ноябре 2000 года, к моменту выхода этой книги в печать они постоянно дорабатывались. Важным дополнением, которое появилось в спецификации Servlet 2.3, стали фильтры сервлетов; они описаны в приложении А. Однако имейте в виду, что к тому времени, как эта книга попадет к вам в руки, спецификация может измениться.
Как тестировались коды
Все коды, приведенные в данной книге, были протестированы с помощью сервера Tomcat 3.2.1. Некоторые коды, в частности примеры, связанные с аутентификацией, некорректно работают с Tomcat 3.2.1, подобные случаи специально оговорены в тексте книги.
Поскольку Tomcat является основным сервером для сервлетов и JSP, коды, приведенные в этой книге, должны работать с любым контейнером сервлетов, который соответствует Servlet 2.2 и JSP 1.1 (либо более поздним версиям этих спецификаций). Если пример из книги некорректно работает с вашим контейнером сервлетов, причиной тому, вероятнее всего, является ошибка в реализации контейнера.
Примеры из данной книги были также протестированы с помощью контейнера сервлетов Resin 1.2 (он доступен по адресу http://www.caucho.com). Чтобы убедиться, что код, написанный вами, работает корректно и является переносимым, желательно протестировать его с помощью нескольких доступных вам контейнеров.
На кого рассчитана эта книга
Данная книга написана для разработчиков, имеющих опыт работы на языке Java и знакомых с сервлетами и JSP. Для большинства читателей эта книга станет второй книгой о сервлетах и JSP, прочитанной ими. Если же вы еще никогда не встречались с сервлетами и JSP, я рекомендую вам следующие книги для начинающих.
- Core Servlets and JSP, Marty Hall, Sun Microsystems Press.
- Java Servlet Programming, Jason Hunter, O'Reilly.
- Web Development with JavaServer Pages, Fields и Kolb, Manning.
Читателю не помешает также познакомиться с шаблонами проектов и UML (Unified Modeling Language - унифицированный язык моделирования). В этой книге используются диаграммы, которые показывают взаимосвязь между классами. Список ресурсов, имеющих отношение к шаблонам проектов и UML, приведен в конце главы 6.
Данная книга не предназначена для авторов Web-страниц. Если вы создаете HTML-документы, но не имеете опыта программирования на Java, знакомство с JSP вам лучше начать с одной из книг, перечисленных выше.
Как создавалась эта книга
Создание объектно-ориентированных программ - это, как правило, итеративный процесс. Вы начинаете с нескольких классов, добавляете новые, дорабатываете созданные ранее, постоянно вносите изменения до тех пор, пока не будет завершена работа над системой. Эту процедуру принято называть доводкой (refactoring).
Проработав 15 лет программистом, я привык писать книги по тому же принципу, что и программы. Каждая глава начиналась с нескольких "штрихов" и в процессе доводки выглядела так, как вы видите ее сейчас.
Вы можете представить себе процесс доводки, ознакомившись с моей статьей, посвященной JSP-шаблонам, которая была опубликована в JavaWorld (http://developer.java.sun.com/developer/technicalArticles/javaserverpages/jsp_templates). Эта статья стала "исходным материалом" для главы 4 данной книги. Сравнив статью с главой 4, вы увидите, с чего начиналась работа над главой и чем закончилась. Как текст, так и коды были существенно переработаны.
Как пользоваться этой книгой
Эта книга - не роман, поэтому вряд ли вы сядете и прочтете ее "от корки до корки". Поскольку многие предпочитают читать главы в произвольном порядке, каждая глава написана так, что она практически не зависит от других. Исключение составляет глава 6, посвященная Model 2. Архитектура Model 2 рассмотрена в главе 5, поэтому эту главу желательно прочитать перед главой 6.
В последней главе этой книги показано, как технологии, рассмотренные ранее, применяются для создания Web-приложения. Если вы хотите составить представление об этих технологиях, просмотрите последнюю главу перед тем, как приступать к чтению.
Библиотеки пользовательских дескрипторов
В данной книге рассматривается около 50 пользовательских дескрипторов JSP. Они выполняют различные задачи: от поддержки форматов, специфических для разных стран, до разбора XML-кода с использованием Document Object Model. Эти дескрипторы вы можете свободно использовать в своих разработках. Адрес, по которому расположены коды дескрипторов, будет указан ниже.
Рассмотрение пользовательских дескрипторов в данной книге преследует две цели. Во-первых, приведенный код служит примером пользовательских дескрипторов. Во-вторых, они подтверждают основные идеи, которые обсуждаются в книге. Например, в главе, посвященной поддержке кодировок и форматов различных стран, обсуждаются вопросы локализации текста, числовых значений, дат и денежных единиц. В конце этой главы показано, как реализуются пользовательские дескрипторы, предназначенные для выполнения этих задач.
Благодарности
Несмотря на то что на обложке указано только мое имя, в создании данной книги участвовали многие. В первую очередь я благодарен рецензентам и всем, кто прочитал книгу и сделал немало ценных замечаний.
Ведущий разработчик Tomcat и базового набора Apache Struts Грег МакКленехэм (Craig McClanahan) поделился со мной рядом идей относительно сервлетов и JSP. Подобные конструктивные идеи могли прийти в голову только специалисту чрезвычайно высокой квалификации, каковым является Грег.
Скотт Фергюсон (Scott Ferguson), разработчик контейнера сервлетов Resin, также сделал несколько ценных замечаний и дал ряд советов. Благодаря Скотту удалось не только выверить технические детали, но и выстроить материал данной книги в последовательности, наиболее удобной для восприятия читателем.
Лэрри Кейбл (Larry Cable), соавтор исходной спецификации JSP, также внес существенный вклад в написание данной книги. Благодаря Лэрри в главе 2 появились разделы, в которых подробно обсуждается обработка тела пользовательских дескрипторов.
Роб Гордон (Rob Gordon), с которым мы вместе работали в Sun Microsystems, дал мне много советов о структуре книги, Java-кодах, а также относительно разделов, в которых рассматриваются вопросы объектно-ориентированного проектирования. В этих советах нашла отражение высокая квалификация Роба.
Я благодарен участникам списка рассылки, посвященного обсуждению Struts, за конструктивную критику пользовательских дескрипторов, которые я предложил включить в состав Struts. Благодаря их отзывам я получил возможность существенно улучшить библиотеку дескрипторов, которая рассматривается в главе 4 данной книги. Особенно важно для меня мнение Седрика Дьюмоулина (Cedric Dumoulin), касающееся расширения библиотеки.
Огромную помощью оказали мне Юн Сэнг Джанг (Yun Sang Jung) и Чен Джа Пинг (Chen Jia Ping), которые перевели английские файлы свойств на корейский и китайский языки. Их переводы были использованы в главах 8 и 12.
Компания Rational Rose Software предоставила мне копию Rational Rose for Java, которая была использована для подготовки UML-диаграмм, представленных в данной книге.
Мэри Лоу Нор (Mary Lou Nohr), с которой мы работали еще в 1996 г. над книгой Graphic Java, проделала огромную работу по редактированию текста данной книги.
Нельзя не упомянуть Грега Донча (Greg Doench) из Prentice Hall и Рэчел Борден (Rachel Borden) из Sun Microsystems Press, которые верили в меня и помогли подготовить книгу к печати. Пэтти Герриери (Patti Guerrieri) из Prentice Hall выполнила большую работу, в результате которой рукопись превратилась в книгу.
Конечно же, я благодарен Лесэ (Lesa) и Эшли Анне Гери (Ashley Anna Geary). Без их понимания и поддержки мне не имело смысла даже приступать к написанию книги. И, наконец, я признателен Блейзи, который постоянно был со мной во время работы.