Когда говорят о создании web-приложений на Java, то речь, как правило, в первую очередь заходит о написании их на основе предложенных самими разработчиками Java средствах. Тем не менее, существуют мощные фреймворки, которые позволяют создавать web-приложения на J2EE гораздо удобнее и быстрее. Struts - самый удачный из них по мнению многих разработчиков.
Зачем это нужно?
Говоря о Struts, я буду иметь в виду не первую версию этого фреймворка, а вторую, то есть Struts2. Дело в том, что вторая версия Struts'а довольно серьёзно отличается от первой - правда, конечно же, не по своей идеологии, а по реализации и внутренней архитектуре самого фреймворка.
Впрочем, прежде чем приступать к погружению в тайны Struts'а, стоит внести ясность в вопрос "а зачем вообще нужно использовать Struts, если Sun Microsystems вполне ясно обозначила, каким именно она видит web-приложение на Java?". Вопрос логичный. Но, согласитесь, если бы путь, предложенный создателями самой платформы Java, был так уж хорош и беспрекословно устраивал всех, то вряд ли бы кто-то стал писать собственный мощный фреймворк, предлагающий альтернативный подход к разработке таких приложений. Очевидно, Struts имеет преимущество перед стандартными средствами J2EE - по крайней мере, в некоторых областях. Какие же это преимущества? А вот давайте вместе и разберёмся.
Дело в том, что сейчас большая часть web-приложений создаётся на основе шаблона модель-представление-контроллер (Model-View-Controller, MVC). В общем, это естественный шаблон для большинства современных web-приложений, разбивающий их функциональность на три разные части. Модель - это часть, реализующая логику взаимодействия с базой данных; представление - это JSP-страницы, показываемые пользователю; контроллер - это та часть, которая обрабатывает информацию между моделью и представлением. В отличие от традиционных средств создания Java-приложений (т.е. того подхода, который предложила Sun Microsystems), Struts позволяет более просто конструировать приложения на основе шаблона модель-представление-контроллер. Более того, этот фреймворк избавляет программиста от написания большей части рутинного кода контроллера, позволяя тому заняться более творческими и важными вещами. То есть Struts позволяет намного быстрее создавать приложения в рамках шаблона MVC. Именно поэтому фреймворк стал популярен среди Java-программистов во всех уголках мира.
Архитектура Struts
Весь фреймворк Struts2 состоит из двух основных компонентов - интерцепторов и действий (очень часто используется калька с английского, и действия называются экшнами). Может, вам тоже больше нравится использовать термин "экшн" вместо "действия" - что же, их место в Struts-приложении можно увидеть на схеме.
Как видите, на деле всё довольно просто. Интерцепторы - это классы, выполняющие вспомогательный код (например, всякие проверки), а действия - это, в общем-то, именно то, что и должен реализовать программист в своём web-приложении.
Действия - это JavaBean-классы, которые реализуют методы, устанавливающие или принимающие от экземпляра класса значения каких-либо его свойств (они называются геттерами и сеттерами, от английского get - получать и set - устанавливать). Свойства эти получаются или устанавливаются в процессе обработки JSP-кода web-страниц с помощью специально предоставляемых Struts'ом JSP-тегов. Использование интерцепторов позволяет вынести некоторые общие вопросы обработки данных за рамки самих действий, то есть действия получают набор "плагинов" в виде интерцепторов и можно варьировать их свойства.
Действия складываются фреймворком в стек, причем некоторые из них должны укладываться в "цепь", то есть связываться друг с другом. Это необходимо для того, чтобы Struts мог найти в стеке свойство, к которому обратилась JSP-страница: фреймворк вытаскивает из своего стека последовательно все действия и переходит по цепочке от одного к другому. Если действия не связаны друг с другом, то он не может перейти от одного к другому, и цепочка обрывается.
Кстати, о птичках. Хотя я всё время говорю о JSP-страницах как о представлении в рамках модели MVC, вовсе не обязательно, чтобы именно они были представлением в приложениях, написанных с использованием Struts'а. Вместо JSP можно использовать и Velocity, и связку из XML и XSL-файлов - фреймворк позволяет писать web-приложения с тем представлением, с которым привыкла выполнять проекты ваша компания. Но, конечно же, лучше всего использовать JSP-страницы - именно их использует большинство тех, кто работает со Struts'ом, их поддержка приоритетна для разработчиков фреймворка и именно с ними поэтому должно быть, в итоге, меньше всего проблем.
Практика
Наверное, всё, что написано выше, кажется сумбурным и сложным для восприятия без предварительного принятия на грудь "пол-литры". На самом деле, всё не так уж "запущено", и разобраться со Struts'ом можно без медиумов или ясновидящих. Просто очень сложно воспринимать эти сведения абстрактно - поэтому самое время добавить в статью немного программного кода.
Для начала рассмотрим класс действия, предлагаемый в документации Struts'а в качестве примера "Hello World". На всякий случай скажу, что все авторские права на этот код принадлежат авторам документации к Struts'у - моими будут только комментарии.
package tutorial; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public static final String MESSAGE = "Struts is up and running ..."; public String execute() throws Exception { setMessage(MESSAGE); return SUCCESS; } private String message; public void setMessage(String message){ this.message = message; } public String getMessage() { return message; } }
Итак, что у нас есть в этом классе? Для начала обратите внимание на базовый класс - ActionSupport. Он должен быть базовым классом для всех новых Action'ов в вашем приложении (хотя во второй версии Struts'а появилась возможность реализовывать действия через поддержку классом интерфейса Action). message - это то самое поле, значение которого будет принимать или отдавать наше действие при получении или выдаче свойства. MESSAGE - это, как вы сами можете увидеть, константа. Забегая вперёд, скажу, что она выводится на экран и показывает, что мы всё правильно сконфигурировали и запустили, и Struts работает. Методы setMessage и getMessage - это те самые сеттер и геттер, о которых говорилось выше. Самый интересный же в этом классе метод -конечно же, execute. Он реализуется в каждом действии и выполняется при загрузке действия (фактически, он в некотором роде аналогичен конструктору). То есть, в терминах Struts'а, действие выполняется. В нашем случае выполнение заключается в том, чтобы установить начальное значение нашему свойству.
Для того, чтобы Struts мог распознать наше действие, нужно написать специальный конфигурационный файл для Struts'а; он имеет название struts.xml и располагается в директории WEB-INF\classes\ вашего приложения. Что мы должны написать в этом конфигурационном файле? Его содержимое вы можете увидеть в листинге.
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="HelloWorld" class="tutorial.HelloWorld"> <result>/HelloWorld.jsp</result> </action> <!- Add your actions here -> </package> </struts>
Здесь, думается, всё ещё более просто и понятно, чем в Java-коде. Внутри package'а с названием tutorial (в общем-то, всё равно, какое у него название) мы размещаем список тех действий, которые входят в данный package. Мы указываем в атрибутах те имена, которые получают наши действия, и классы, которые их реализуют. Понятно, что в нашем случае одно действие, одно имя и один класс. В качестве result'а указывается та страница, на которую будет направляться выходной поток данных действия, и в нашем случае это та же страница, с которой мы осуществляем вход в web-приложение.
Чтобы наше Struts-приложение правильно работало, нужно ещё немного поколдовать над Web.xml-файлом, в который вписывается диспетчер фильтров, который будет обрабатывать URL'и и перенаправлять те, которые относятся к действиям, Struts'у. По умолчанию, "расширение" в конце таких URL'ей - .action. Настроить диспетчер фильтров легко, о том, как это сделать, я не буду рассказывать - всё можно найти в документации к Struts'у по адресу struts.apache.org/2.x.
Теперь несколько слов о странице HelloWorld.jsp, фигурирующей в нашем web-приложении, но исходного кода которой до сих пор в статье не было. Хочу вас то ли обрадовать, то ли огорчить: мало того, что не было, - так ещё и не будет. Почему вдруг? Потому что от обычной пустой JSP-страницы она отличается только тем, что в ней подключена библиотека тегов Struts'а (делается так: <%@ taglib uri="/struts-tags" prefix="s" %>). Второе отличие - строчка <s:property value="message" />, которая вынимает значение свойства message из действия и выводит его на страницу.
Подытожим
Конечно, сколько всего не сказано о Struts'е - но ведь газетная статья, в конце концов, не справочник, и даже не учебник. Её задача - познакомить и заинтересовать, а тот, кому недостаточно такой информации, может самостоятельно поднять документацию по фреймворку (её довольно много, написана она вполне доступным английским языком). Также немало информации по Struts'у (правда, в основном, не по второй версии, а по первой) в книгах, которые исправно пишут индийцы. Русскоязычных книг по этому фреймворку лично я пока не встречал, хотя они вряд ли помешали бы - ведь Struts сегодня во многих компаниях уже стал стандартом де-факто для MVC-фреймворка, с помощью которого пишутся web-приложения на J2EE.
Если у вас возникнут сложности, то, как я уже говорил, для начала стоит обратиться к официальной странице Struts'а на сайте Apache Foundation. Существует также множество других сайтов, предназначенных для разработчиков, использующих Struts. На них можно найти различные классы-действия, задать вопросы на форумах, почитать часто задаваемые вопросы с ответами на них... В общем, Гугл в помощь. И удачи в работе со Struts'ом, конечно же!
Вадим СТАНКЕВИЧ
Комментарии
И правда написать что ли про него... Надо будет глянуть, как статьи в газету пишутся :)