Учебники

Struts 2 — Краткое руководство

Базовая архитектура MVC

Модульная версия Контроллер или MVC, как его обычно называют, — это шаблон проектирования программного обеспечения для разработки веб-приложений. Модель контроллера представления модели состоит из следующих трех частей:

  • Модель — самый низкий уровень шаблона, который отвечает за ведение данных.

  • Просмотр — отвечает за отображение всех или части данных пользователю.

  • Контроллер — программный код, который контролирует взаимодействие между моделью и представлением.

Модель — самый низкий уровень шаблона, который отвечает за ведение данных.

Просмотр — отвечает за отображение всех или части данных пользователю.

Контроллер — программный код, который контролирует взаимодействие между моделью и представлением.

MVC популярен, поскольку он изолирует логику приложения от уровня пользовательского интерфейса и поддерживает разделение задач. Здесь Контроллер получает все запросы для приложения и затем работает с Моделью, чтобы подготовить любые данные, необходимые для Представления. Затем представление использует данные, подготовленные контроллером, для генерации окончательного презентабельного ответа. Абстракция MVC может быть графически представлена ​​следующим образом.

Struts MVC

Модель

Модель отвечает за управление данными приложения. Он отвечает на запрос от представления и также отвечает на инструкции от контроллера, чтобы обновить себя.

Вид

Это означает представление данных в определенном формате, вызванное решением контроллера представить данные. Это основанные на сценариях системы шаблонов, такие как JSP, ASP, PHP, и их очень легко интегрировать с технологией AJAX.

Контроллер

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

Struts2 — основанный на MVC фреймворк. В следующих главах давайте посмотрим, как мы можем использовать методологию MVC в Struts2.

Struts 2 — Обзор

Struts2 — это популярная и зрелая среда веб-приложений, основанная на шаблоне проектирования MVC. Struts2 — это не просто новая версия Struts 1, а полная переработка архитектуры Struts.

Платформа Webwork изначально начиналась со среды Struts в качестве основы, и ее цель состояла в том, чтобы предложить улучшенную и улучшенную среду, основанную на Struts, чтобы упростить веб-разработку для разработчиков.

Через некоторое время фреймворк Webwork и сообщество Struts объединились, чтобы создать знаменитый фреймворк Struts2.

Особенности Struts 2 Framework

Вот некоторые из замечательных функций, которые могут заставить вас рассмотреть Struts2 —

  • Формы POJO и Действия POJO — Struts2 покончил с формами действий, которые были неотъемлемой частью структуры Struts. С Struts2 вы можете использовать любой POJO для получения ввода формы. Точно так же теперь вы можете видеть любой POJO как класс Action.

  • Поддержка тегов — Struts2 улучшил теги формы и новые теги, которые позволяют разработчикам писать меньше кода.

  • Поддержка AJAX — Struts2 признал преимущество технологий Web2.0 и интегрировал поддержку AJAX в продукт, создавая теги AJAX, эта функция очень похожа на стандартные теги Struts2.

  • Простая интеграция — интеграция с другими средами, такими как Spring, Tiles и SiteMesh, теперь стала проще благодаря разнообразной интеграции, доступной со Struts2.

  • Поддержка шаблонов — Поддержка создания представлений с использованием шаблонов.

  • Поддержка плагинов — базовое поведение Struts2 может быть улучшено и дополнено с помощью плагинов. Для Struts2 доступно несколько плагинов.

  • Профилирование — Struts2 предлагает интегрированное профилирование для отладки и профилирования приложения. В дополнение к этому Struts также предлагает интегрированную отладку с помощью встроенных инструментов отладки.

  • Легко изменить теги — разметки тегов в Struts2 можно настроить с помощью шаблонов Freemarker. Это не требует знаний JSP или Java. Для изменения тегов достаточно базовых знаний HTML, XML и CSS.

  • Продвигать меньше настроек — Struts2 продвигает меньше настроек с помощью использования значений по умолчанию для различных настроек. Вам не нужно настраивать что-либо, если оно не отличается от настроек по умолчанию, установленных Struts2.

  • Технологии просмотра — Struts2 имеет отличную поддержку нескольких вариантов просмотра (JSP, Freemarker, Velocity и XSLT)

Формы POJO и Действия POJO — Struts2 покончил с формами действий, которые были неотъемлемой частью структуры Struts. С Struts2 вы можете использовать любой POJO для получения ввода формы. Точно так же теперь вы можете видеть любой POJO как класс Action.

Поддержка тегов — Struts2 улучшил теги формы и новые теги, которые позволяют разработчикам писать меньше кода.

Поддержка AJAX — Struts2 признал преимущество технологий Web2.0 и интегрировал поддержку AJAX в продукт, создавая теги AJAX, эта функция очень похожа на стандартные теги Struts2.

Простая интеграция — интеграция с другими средами, такими как Spring, Tiles и SiteMesh, теперь стала проще благодаря разнообразной интеграции, доступной со Struts2.

Поддержка шаблонов — Поддержка создания представлений с использованием шаблонов.

Поддержка плагинов — базовое поведение Struts2 может быть улучшено и дополнено с помощью плагинов. Для Struts2 доступно несколько плагинов.

Профилирование — Struts2 предлагает интегрированное профилирование для отладки и профилирования приложения. В дополнение к этому Struts также предлагает интегрированную отладку с помощью встроенных инструментов отладки.

Легко изменить теги — разметки тегов в Struts2 можно настроить с помощью шаблонов Freemarker. Это не требует знаний JSP или Java. Для изменения тегов достаточно базовых знаний HTML, XML и CSS.

Продвигать меньше настроек — Struts2 продвигает меньше настроек с помощью использования значений по умолчанию для различных настроек. Вам не нужно настраивать что-либо, если оно не отличается от настроек по умолчанию, установленных Struts2.

Технологии просмотра — Struts2 имеет отличную поддержку нескольких вариантов просмотра (JSP, Freemarker, Velocity и XSLT)

Выше перечислены 10 основных функций Struts 2, которые делают его интегрированной средой Enterprise.

Struts 2 Недостатки

Хотя Struts 2 поставляется со списком замечательных функций, в текущей версии есть некоторые ограничения — Struts 2, который нуждается в дальнейшем улучшении. Перечислены некоторые из основных моментов —

  • Большая кривая обучения — чтобы использовать MVC со Struts, вы должны быть знакомы со стандартными JSP, API-сервлетами и большой и сложной структурой.

  • Плохая документация. По сравнению со стандартными сервлетами и API-интерфейсами JSP, в Struts меньше онлайн-ресурсов, и многие новички считают онлайн-документацию по Apache запутанной и плохо организованной.

  • Менее прозрачный. С приложениями Struts за кулисами происходит гораздо больше, чем с обычными веб-приложениями на основе Java, что затрудняет понимание инфраструктуры.

Большая кривая обучения — чтобы использовать MVC со Struts, вы должны быть знакомы со стандартными JSP, API-сервлетами и большой и сложной структурой.

Плохая документация. По сравнению со стандартными сервлетами и API-интерфейсами JSP, в Struts меньше онлайн-ресурсов, и многие новички считают онлайн-документацию по Apache запутанной и плохо организованной.

Менее прозрачный. С приложениями Struts за кулисами происходит гораздо больше, чем с обычными веб-приложениями на основе Java, что затрудняет понимание инфраструктуры.

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

Struts 2 является одним из лучших веб-фреймворков и широко используется для разработки многофункциональных интернет-приложений (RIA).

Struts 2 — Настройка среды

Наша первая задача — запустить минимальное приложение Struts 2. В этой главе вы узнаете, как подготовить среду разработки для начала работы с Struts 2.

Я предполагаю, что на вашей машине уже установлены JDK (5+), Tomcat и Eclipse. Если у вас не установлены эти компоненты, выполните следующие шаги в ускоренном режиме —

Шаг 1 — Настройка Java Development Kit (JDK)

Вы можете скачать последнюю версию SDK с сайта Oracle на Java — Java SE Downloads . В загруженных файлах вы найдете инструкции по установке JDK, следуйте инструкциям по установке и настройке. Наконец, установите переменные окружения PATH и JAVA_HOME, чтобы они ссылались на каталог, содержащий java и javac, обычно это java_install_dir / bin и java_install_dir соответственно.

Если вы используете Windows и установили SDK в C: \ jdk1.5.0_20, вы должны ввести следующую строку в файл C: \ autoexec.bat.

set PATH = C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME = C:\jdk1.5.0_20

Кроме того, в Windows NT / 2000 / XP —

  • Вы можете щелкнуть правой кнопкой мыши Мой компьютер, выбрать Свойства, затем Дополнительно, затем Переменные среды. Затем вы обновите значение PATH и нажмете кнопку ОК.

  • В Unix (Solaris, Linux и т. Д.), Если SDK установлен в /usr/local/jdk1.5.0_20 и вы используете оболочку C, вы должны поместить в файл .cshrc следующее.

Вы можете щелкнуть правой кнопкой мыши Мой компьютер, выбрать Свойства, затем Дополнительно, затем Переменные среды. Затем вы обновите значение PATH и нажмете кнопку ОК.

В Unix (Solaris, Linux и т. Д.), Если SDK установлен в /usr/local/jdk1.5.0_20 и вы используете оболочку C, вы должны поместить в файл .cshrc следующее.

В Unix (Solaris, Linux и т. Д.), Если SDK установлен в /usr/local/jdk1.5.0_20 и вы используете оболочку C, вы должны поместить в файл .cshrc следующее.

setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20

В качестве альтернативы, если вы используете интегрированную среду разработки (IDE), такую ​​как Borland JBuilder, Eclipse, IntelliJ IDEA или Sun ONE Studio, скомпилируйте и запустите простую программу, чтобы подтвердить, что IDE знает, где вы установили Java, в противном случае выполните правильную настройку согласно данный документ IDE.

Шаг 2 — Настройка Apache Tomcat

Вы можете загрузить последнюю версию Tomcat с https://tomcat.apache.org/ . После загрузки установки распакуйте бинарный дистрибутив в удобное место.

Например, в C: \ apache-tomcat-6.0.33 в Windows или /usr/local/apachetomcat-6.0.33 в Linux / Unix и создайте переменную среды CATALINA_HOME, указывающую на эти места.

Вы можете запустить Tomcat, выполнив следующие команды на машине с Windows, или вы можете просто дважды щелкнуть на файле startup.bat

%CATALINA_HOME%\bin\startup.bat
 
or
 
C:\apache-tomcat-6.0.33\bin\startup.bat

Tomcat можно запустить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):

$CATALINA_HOME/bin/startup.sh
 
or
 
/usr/local/apache-tomcat-6.0.33/bin/startup.sh

После успешного запуска веб-приложения по умолчанию, включенные в Tomcat, будут доступны по адресу http: // localhost: 8080 / . Если все хорошо, то должен отобразиться следующий результат —

Tomcat Домашняя страница

Дополнительную информацию о настройке и запуске Tomcat можно найти в документации, включенной здесь, а также на веб-сайте Tomcat: https://tomcat.apache.org/

Tomcat можно остановить, выполнив следующие команды на машине с Windows —

%CATALINA_HOME%\bin\shutdown

or

C:\apache-tomcat-5.5.29\bin\shutdown

Tomcat можно остановить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):

$CATALINA_HOME/bin/shutdown.sh

or

/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh

Шаг 3 — Настройка Eclipse (IDE)

Все примеры в этом руководстве написаны с использованием Eclipse IDE. Я полагаю, что на вашей машине установлена ​​последняя версия Eclipse.

Чтобы установить Eclipse Загрузите последние двоичные файлы Eclipse со страницы https://www.eclipse.org/downloads/ . После загрузки установки распакуйте бинарный дистрибутив в удобное место.

Например, в C: \ eclipse для Windows или / usr / local / eclipse в Linux / Unix и, наконец, установите переменную PATH соответствующим образом. Eclipse можно запустить, выполнив следующие команды на компьютере с Windows, или вы можете просто дважды щелкнуть по eclipse.exe

%C:\eclipse\eclipse.exe

Eclipse можно запустить, выполнив следующие команды на компьютере Unix (Solaris, Linux и т. Д.):

$/usr/local/eclipse/eclipse

После успешного запуска, если все в порядке, должен отображаться следующий результат —

Eclipse Home page

Шаг 4 — Настройка библиотек Struts2

Теперь, если все в порядке, вы можете приступить к настройке фреймворка Struts2. Ниже приведены простые шаги для загрузки и установки Struts2 на вашем компьютере.

  • Выберите, хотите ли вы установить Struts2 в Windows или Unix, а затем перейдите к следующему шагу, чтобы загрузить .zip-файл для windows и .tz-файл для Unix.

  • Загрузите последнюю версию двоичных файлов Struts2 со страницы https://struts.apache.org/download.cgi .

  • На момент написания этого руководства я скачал struts-2.0.14-all.zip, и когда вы разархивируете загруженный файл, он даст вам структуру каталогов внутри C: \ struts-2.2.3 следующим образом.

Выберите, хотите ли вы установить Struts2 в Windows или Unix, а затем перейдите к следующему шагу, чтобы загрузить .zip-файл для windows и .tz-файл для Unix.

Загрузите последнюю версию двоичных файлов Struts2 со страницы https://struts.apache.org/download.cgi .

На момент написания этого руководства я скачал struts-2.0.14-all.zip, и когда вы разархивируете загруженный файл, он даст вам структуру каталогов внутри C: \ struts-2.2.3 следующим образом.

Каталоги Штурта

Второй шаг — извлечь zip-файл в любом месте, я скачал и распаковал struts-2.2.3-all.zip в папку c: \ на моем компьютере с Windows 7, чтобы у меня были все файлы jar в C: \ struts-2.2 .3 \ lib . Убедитесь, что вы правильно установили переменную CLASSPATH, иначе вы столкнетесь с проблемой при запуске приложения.

Struts 2 — Архитектура

С высокого уровня Struts2 является фреймворком pull-MVC (или MVC2). Шаблон Model-ViewController в Struts2 реализован с помощью следующих пяти основных компонентов:

  • действия
  • Перехватчики
  • Стек значений / OGNL
  • Результаты / Типы результатов
  • Посмотреть технологии

Struts 2 немного отличается от традиционной инфраструктуры MVC, где действие берет на себя роль модели, а не контроллера, хотя есть некоторые совпадения.

Struts 2 Архитектура

Приведенная выше диаграмма изображает контроллер M odel, V iew и C для архитектуры высокого уровня Struts2. Контроллер реализован с помощью сервлет-фильтра Struts2 и перехватчиков, эта модель реализована с помощью действий, а представление представляет собой комбинацию типов результатов и результатов. Стек значений и OGNL обеспечивают общий поток, связывая и обеспечивая интеграцию между другими компонентами.

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

Это обзор архитектуры шаблона Struts 2 MVC. Мы рассмотрим каждый компонент более подробно в последующих главах.

Запросить жизненный цикл

На основе приведенной выше диаграммы вы можете понять рабочий процесс в жизненном цикле запросов пользователя в Struts 2 следующим образом:

  • Пользователь отправляет запрос на сервер для запроса какого-либо ресурса (например, страниц).

  • Диспетчер фильтров просматривает запрос и затем определяет соответствующее действие.

  • Применяются настроенные функции перехватчика, такие как проверка, загрузка файла и т. Д.

  • Выбранное действие выполняется на основании запрошенной операции.

  • Опять же, настроенные перехватчики применяются для выполнения любой последующей обработки, если это необходимо.

  • Наконец, результат подготавливается представлением и возвращает результат пользователю.

Пользователь отправляет запрос на сервер для запроса какого-либо ресурса (например, страниц).

Диспетчер фильтров просматривает запрос и затем определяет соответствующее действие.

Применяются настроенные функции перехватчика, такие как проверка, загрузка файла и т. Д.

Выбранное действие выполняется на основании запрошенной операции.

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

Наконец, результат подготавливается представлением и возвращает результат пользователю.

Struts 2 — Пример Hello World

Как вы уже узнали из архитектуры Struts 2, когда вы щелкаете гиперссылку или отправляете HTML-форму в веб-приложении Struts 2, входная информация собирается контроллером, который отправляется в класс Java с именем Actions. После того, как Действие выполнено, результат выбирает ресурс для отображения ответа. Ресурс, как правило, представляет собой JSP, но это также может быть файл PDF, электронная таблица Excel или окно апплета Java.

Предполагая, что вы уже создали свою среду разработки. Теперь давайте приступим к созданию нашего первого проекта Hello World Struts2 . Целью этого проекта является создание веб-приложения, которое собирает имя пользователя и отображает «Hello World», за которым следует имя пользователя.

Мы должны были бы создать следующие четыре компонента для любого проекта Struts 2 —

Sr.No Компоненты и описание
1

действие

Создайте класс действий, который будет содержать полную бизнес-логику и контролировать взаимодействие между пользователем, моделью и представлением.

2

Перехватчики

При необходимости создайте перехватчики или используйте существующие перехватчики. Это часть контроллера.

3

Посмотреть

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

4

Конфигурационные файлы

Создайте файлы конфигурации для соединения Action, View и Controllers. Это файлы struts.xml, web.xml, struts.properties.

действие

Создайте класс действий, который будет содержать полную бизнес-логику и контролировать взаимодействие между пользователем, моделью и представлением.

Перехватчики

При необходимости создайте перехватчики или используйте существующие перехватчики. Это часть контроллера.

Посмотреть

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

Конфигурационные файлы

Создайте файлы конфигурации для соединения Action, View и Controllers. Это файлы struts.xml, web.xml, struts.properties.

Я собираюсь использовать Eclipse IDE, чтобы все необходимые компоненты были созданы в рамках динамического веб-проекта. Давайте начнем с создания динамического веб-проекта.

Создать динамический веб-проект

Запустите Eclipse, затем выберите «Файл»> «Создать»> «Динамический веб-проект», введите имя проекта как HelloWorldStruts2 и задайте остальные параметры, как показано на следующем экране.

Hello World Sturts1

Выберите все параметры по умолчанию на следующих экранах и, наконец, установите флажок « Создать дескриптор развертывания Web.xml» . Это создаст динамичный веб-проект для вас в Eclipse. Теперь перейдите в Windows> Показать представление> Project Explorer , и вы увидите окно вашего проекта примерно так:

Hello World Sturts2

Теперь скопируйте следующие файлы из папки C Struts 2 lib C: \ struts-2.2.3 \ lib в папку WEB-INF \ lib нашего проекта. Для этого вы можете просто перетащить все следующие файлы в папку WEB-INF \ lib.

  • Обще-FileUpload-xyzjar
  • Обще-ю-xyzjar
  • Обще-Ланг-xyjar
  • Обще-каротаж xyzjar
  • Обще-каротаж апи-xyjar
  • FreeMarker-xyzjar
  • javassist-.xy.z.GA
  • OGNL-xyzjar
  • struts2-ядро-xyzjar
  • xwork-core.xyzjar

Создать класс действий

Класс действий является ключом к приложению Struts 2, и мы реализуем большую часть бизнес-логики в классе действий. Итак, давайте создадим Java-файл HelloWorldAction.java в разделе Java Resources> src с именем пакета com.tutorialspoint.struts2 с содержимым, приведенным ниже.

Класс Action отвечает на действие пользователя, когда пользователь щелкает URL-адрес. Выполняется один или несколько методов класса Action и возвращается результат String. На основе значения результата отображается конкретная страница JSP.

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Это очень простой класс с одним свойством под названием «имя». У нас есть стандартные методы получения и установки для свойства «name» и метод execute, который возвращает строку «success».

Каркас Struts 2 создаст объект класса HelloWorldAction и вызовет исполняемый метод в ответ на действие пользователя. Вы помещаете свою бизнес-логику в этот метод, который в итоге возвращает константу String. Другими словами, для каждого URL вам нужно будет реализовать один класс действия, и вы можете использовать это имя класса непосредственно в качестве имени действия или сопоставить его с другим именем, используя файл struts.xml, как показано ниже.

Создать представление

Нам нужен JSP для представления окончательного сообщения, эта страница будет вызываться платформой Struts 2, когда произойдет предопределенное действие, и это отображение будет определено в файле struts.xml. Итак, давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse. Для этого щелкните правой кнопкой мыши папку WebContent в проводнике проекта и выберите « Создать»> «Файл JSP» .

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Директива taglib сообщает контейнеру сервлетов, что на этой странице будут использоваться теги Struts 2 и что этим тегам будет предшествовать s .

Тег s: property отображает значение свойства класса действия «name>, которое возвращается методом getName () класса HelloWorldAction.

Создать главную страницу

Нам также нужно создать index.jsp в папке WebContent. Этот файл будет служить начальным URL-адресом действия, по которому пользователь может щелкнуть, чтобы сообщить платформе Struts 2, чтобы она вызывала определенный метод класса HelloWorldAction и отображала представление HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Действие hello, определенное в приведенном выше файле представления, будет сопоставлено с классом HelloWorldAction и его методом execute с использованием файла struts.xml. Когда пользователь нажимает кнопку «Отправить», это заставляет платформу Struts 2 запустить метод execute, определенный в классе HelloWorldAction и основанный на возвращенном значении метода, соответствующее представление будет выбрано и отображено как ответ.

Конфигурационные файлы

Нам нужно сопоставление, чтобы связать URL-адрес, класс HelloWorldAction (Model) и HelloWorld.jsp (представление). Сопоставление сообщает платформе Struts 2, какой класс будет реагировать на действия пользователя (URL), какой метод этого класса будет выполнен и какое представление будет отображаться на основе результата String, который возвращает метод.

Итак, давайте создадим файл с именем struts.xml . Поскольку Struts 2 требует наличия Struts.xml в папке классов. Следовательно, создайте файл struts.xml в папке WebContent / WEB-INF / classes. Eclipse не создает папку «classes» по умолчанию, поэтому вам нужно сделать это самостоятельно. Для этого щелкните правой кнопкой мыши папку WEB-INF в проводнике проекта и выберите « Создать»> «Папка» . Ваш struts.xml должен выглядеть так:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
     <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

Несколько слов, которые необходимо понять относительно вышеуказанного файла конфигурации. Здесь мы устанавливаем для константы struts.devMode значение true , потому что мы работаем в среде разработки, и нам нужно увидеть некоторые полезные сообщения журнала. Затем мы определяем пакет под названием helloworld .

Создание пакета полезно, когда вы хотите сгруппировать свои действия вместе. В нашем примере мы назвали наше действие «hello», которое соответствует URL /hello.action и поддерживается HelloWorldAction.class . Метод execute для HelloWorldAction.class — это метод, который запускается при вызове URL /hello.action . Если результат метода execute возвращает «success», то мы переводим пользователя в HelloWorld.jsp .

Следующим шагом является создание файла web.xml, который является точкой входа для любого запроса в Struts 2. Точкой входа приложения Struts2 будет фильтр, определенный в дескрипторе развертывания (web.xml). Следовательно, мы определим запись класса org.apache.struts2.dispatcher.FilterDispatcher в web.xml. Файл web.xml необходимо создать в папке WEB-INF в разделе WebContent. Eclipse уже создал скелетный файл web.xml для вас, когда вы создавали проект. Итак, давайте просто изменим это следующим образом —

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Мы указали index.jsp в качестве файла приветствия. Затем мы настроили фильтр Struts2 для запуска по всем URL-адресам (т. Е. По любому URL-адресу, соответствующему шаблону / *).

Включить подробный журнал

Вы можете включить все функции ведения журнала при работе со Struts 2, создав файл logging.properties в папке WEB-INF / classes . Сохраните следующие две строки в вашем файле свойств —

org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
   java.util.logging.ConsoleHandler

В файле logging.properties по умолчанию указывается ConsoleHandler для маршрутизации ведения журнала на стандартный вывод, а также FileHandler. Порог уровня журнала обработчика может быть установлен с помощью SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST или ALL.

Вот и все. Мы готовы запустить наше приложение Hello World с использованием инфраструктуры Struts 2.

Порядок оформления заявки

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War».

Затем разверните эту WAR в каталоге веб-приложений Tomcat.

Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это даст вам следующий экран —

Hello World Struts4

Введите значение «Struts2» и отправьте страницу. Вы должны увидеть следующую страницу

Hello World Struts5

Обратите внимание, что вы можете определить индекс как действие в файле struts.xml, и в этом случае вы можете вызвать страницу индекса как http: // localhost: 8080 / HelloWorldStruts2 / index.action . Проверьте ниже, как вы можете определить индекс как действие —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "index">
         <result >/index.jsp</result>
      </action>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Struts 2 — файлы конфигурации

Эта глава проведет вас через базовую настройку, которая требуется для приложения Struts 2 . Здесь мы увидим, что можно настроить с помощью нескольких важных файлов конфигурации, таких как web.xml, struts.xml, strutsconfig.xml и struts.properties

Честно говоря, вы можете начать работать, просто используя конфигурационные файлы web.xml и struts.xml (как вы уже видели в нашей предыдущей главе, где наш пример работал с использованием этих двух файлов). Тем не менее, для вашего сведения мы расскажем и о других файлах.

Файл web.xml

Файл конфигурации web.xml — это файл конфигурации J2EE, который определяет, как элементы HTTP-запроса обрабатываются контейнером сервлета. Это не строго файл конфигурации Struts2, но это файл, который необходимо настроить для работы Struts2.

Как обсуждалось ранее, этот файл предоставляет точку входа для любого веб-приложения. Точкой входа приложения Struts2 будет фильтр, определенный в дескрипторе развертывания (web.xml). Следовательно, мы определим запись класса FilterDispatcher в web.xml. Файл web.xml необходимо создать в папке WebContent / WEB-INF .

Это первый файл конфигурации, который вам нужно будет настроить, если вы запускаете его без помощи шаблона или инструмента, который его генерирует (например, Eclipse или Maven2).

Ниже приводится содержимое файла web.xml, который мы использовали в нашем последнем примере.

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

</web-app>

Обратите внимание, что мы сопоставляем фильтр Struts 2 с / * , а не с /*.action, что означает, что все фильтры будут проанализированы фильтром Struts. Мы расскажем об этом, когда пройдем главу «Аннотации».

Файл Struts.xml

Файл struts.xml содержит информацию о конфигурации, которую вы будете изменять при разработке действий. Этот файл можно использовать для переопределения настроек по умолчанию для приложения, например struts.devMode = false и других настроек, определенных в файле свойств. Этот файл можно создать в папке WEB-INF / classes .

Давайте посмотрим на файл struts.xml, который мы создали в примере Hello World, описанном в предыдущей главе.

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
     
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>
      
      <-- more actions can be listed here -->

   </package>
   <-- more packages can be listed here -->

</struts>

Первое, что нужно отметить, это DOCTYPE . Файл конфигурации всех стоек должен иметь правильный тип документа, как показано в нашем небольшом примере. <struts> является корневым элементом тега, под которым мы объявляем различные пакеты, используя теги <package>. Здесь <пакет> позволяет разделение и модульность конфигурации. Это очень полезно, когда у вас большой проект и проект разделен на разные модули.

Например, если у вашего проекта есть три домена — business_application, customer_application и staff_application, вы можете создать три пакета и сохранить связанные действия в соответствующем пакете.

Тег пакета имеет следующие атрибуты —

Sr.No Атрибут и описание
1

имя (обязательно)

Уникальный идентификатор пакета

2

продолжается

Из какого пакета распространяется этот пакет? По умолчанию мы используем struts-default в качестве базового пакета.

3

Аннотация

Если отмечено значение true, пакет недоступен для конечного пользователя.

4

Пространство имен

Уникальное пространство имен для действий

имя (обязательно)

Уникальный идентификатор пакета

продолжается

Из какого пакета распространяется этот пакет? По умолчанию мы используем struts-default в качестве базового пакета.

Аннотация

Если отмечено значение true, пакет недоступен для конечного пользователя.

Пространство имен

Уникальное пространство имен для действий

Тег константы вместе с атрибутами name и value следует использовать для переопределения любого из следующих свойств, определенных в default.properties , как мы только устанавливаем свойство struts.devMode . Установка свойства struts.devMode позволяет нам видеть больше сообщений отладки в файле журнала.

Мы определяем теги действий, соответствующие каждому URL-адресу, к которому мы хотим получить доступ, и определяем класс с помощью метода execute (), к которому будет обращаться каждый раз, когда мы будем обращаться к соответствующему URL-адресу.

Результаты определяют, что возвращается браузеру после выполнения действия. Строка, возвращаемая из действия, должна быть именем результата. Результаты настраиваются для каждого действия, как указано выше, или как «глобальный» результат, доступный для каждого действия в пакете. Результаты имеют необязательные атрибуты name и type . Значение имени по умолчанию — «успех».

Файл Struts.xml со временем может сильно увеличиться, поэтому разбиение его по пакетам является одним из способов его модуляции, но Struts предлагает другой способ модульности файла struts.xml. Вы можете разбить файл на несколько XML-файлов и импортировать их следующим образом.

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <include file="my-struts1.xml"/>
   <include file="my-struts2.xml"/>
</struts>

Другой файл конфигурации, который мы не рассмотрели, это struts-default.xml. Этот файл содержит стандартные параметры конфигурации для Struts, и вам не нужно трогать эти параметры для 99,99% ваших проектов. По этой причине мы не будем вдаваться в подробности этого файла. Если вам интересно, взгляните на файл default.properties, доступный в файле struts2-core-2.2.3.jar.

Файл Struts-config.xml

Файл конфигурации struts-config.xml является связующим звеном между компонентами просмотра и модели в веб-клиенте, но вам не нужно трогать эти параметры для 99,99% ваших проектов.

Файл конфигурации в основном содержит следующие основные элементы —

Sr.No Перехватчик и описание
1

распорки-конфигурации

Это корневой узел файла конфигурации.

2

форм-бобы

Здесь вы сопоставляете свой подкласс ActionForm с именем. Это имя используется в качестве псевдонима для вашей ActionForm в остальной части файла strutsconfig.xml и даже на страницах JSP.

3

глобальные форварды

В этом разделе отображается имя страницы в вашем веб-приложении. Вы можете использовать это имя для ссылки на фактическую страницу. Это позволяет избежать жесткого кодирования URL-адресов на ваших веб-страницах.

4

остросюжетные отображения

Здесь вы объявляете обработчики форм, и они также известны как отображения действий.

5

контроллер

В этом разделе настраиваются внутренние компоненты Struts, и они редко используются в практических ситуациях.

6

вставной

Этот раздел сообщает Struts, где найти файлы свойств, которые содержат подсказки и сообщения об ошибках.

распорки-конфигурации

Это корневой узел файла конфигурации.

форм-бобы

Здесь вы сопоставляете свой подкласс ActionForm с именем. Это имя используется в качестве псевдонима для вашей ActionForm в остальной части файла strutsconfig.xml и даже на страницах JSP.

глобальные форварды

В этом разделе отображается имя страницы в вашем веб-приложении. Вы можете использовать это имя для ссылки на фактическую страницу. Это позволяет избежать жесткого кодирования URL-адресов на ваших веб-страницах.

остросюжетные отображения

Здесь вы объявляете обработчики форм, и они также известны как отображения действий.

контроллер

В этом разделе настраиваются внутренние компоненты Struts, и они редко используются в практических ситуациях.

вставной

Этот раздел сообщает Struts, где найти файлы свойств, которые содержат подсказки и сообщения об ошибках.

Ниже приведен пример файла struts-config.xml:

<?xml version = "1.0" Encoding = "ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
   "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

<struts-config>

   <!-- ========== Form Bean Definitions ============ -->
   <form-beans>
      <form-bean name = "login" type = "test.struts.LoginForm" />
   </form-beans>

   <!-- ========== Global Forward Definitions ========= -->
   <global-forwards>
   </global-forwards>

   <!-- ========== Action Mapping Definitions ======== -->
   <action-mappings>
      <action
         path = "/login"
         type = "test.struts.LoginAction" >

         <forward name = "valid" path = "/jsp/MainMenu.jsp" />
         <forward name = "invalid" path = "/jsp/LoginView.jsp" />
      </action>
   </action-mappings>

   <!-- ========== Controller Definitions ======== -->
   <controller contentType = "text/html;charset = UTF-8"
      debug = "3" maxFileSize = "1.618M" locale = "true" nocache = "true"/>

</struts-config>

Для получения более подробной информации о файле struts-config.xml, пожалуйста, проверьте документацию по Struts.

Файл Struts.properties

Этот файл конфигурации предоставляет механизм для изменения поведения платформы по умолчанию. Фактически, все свойства, содержащиеся в файле конфигурации struts.properties, также можно настроить в файле web.xml с помощью init-param , а также с помощью тега константы в файле конфигурации struts.xml . Но если вы хотите, чтобы вещи были отдельными и более конкретными, то вы можете создать этот файл в папке WEB-INF / classes .

Значения, настроенные в этом файле, переопределят значения по умолчанию, заданные в default.properties, который содержится в дистрибутиве struts2-core-xyzjar. Есть несколько свойств, которые вы можете изменить при помощи файла struts.properties:

### When set to true, Struts will act much more friendly for developers
struts.devMode = true

### Enables reloading of internationalization files
struts.i18n.reload = true

### Enables reloading of XML configuration files
struts.configuration.xml.reload = true

### Sets the port that the server is run on
struts.url.http.port = 8080

Здесь любая строка, начинающаяся с хеша (#), будет считаться комментарием и будет игнорироваться Struts 2 .

Struts 2 — Действия

Действия являются ядром инфраструктуры Struts2, как и для любой инфраструктуры MVC (Model View Controller). Каждый URL привязан к определенному действию, которое обеспечивает логику обработки, которая необходима для обслуживания запроса от пользователя.

Но действие также служит в двух других важных качествах. Во-первых, действие играет важную роль в передаче данных от запроса до представления, будь то JSP или другой тип результата. Во-вторых, действие должно помочь каркасу определить, какой результат должен отображать представление, которое будет возвращено в ответе на запрос.

Создать действие

Единственное требование для действий в Struts2 — наличие одного метода noargument, который возвращает объект String или Result и должен быть POJO. Если метод без аргументов не указан, по умолчанию используется метод execute ().

При желании вы можете расширить класс ActionSupport, который реализует шесть интерфейсов, включая интерфейс Action . Интерфейс Action выглядит следующим образом:

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

Давайте посмотрим на метод действия в примере Hello World —

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Чтобы проиллюстрировать, что метод действия управляет представлением, давайте внесем следующее изменение в метод execute и расширим класс ActionSupport следующим образом:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      if ("SECRET".equals(name)) {
         return SUCCESS;
      } else {
         return ERROR;  
      }
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

В этом примере у нас есть некоторая логика в методе execute для просмотра атрибута name. Если атрибут равен строке «SECRET» , мы возвращаем SUCCESS в качестве результата, в противном случае мы возвращаем ERROR в качестве результата. Поскольку мы расширили ActionSupport, мы можем использовать строковые константы SUCCESS и ERROR. Теперь давайте изменим наш файл struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Создать представление

Давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse. Для этого щелкните правой кнопкой мыши папку WebContent в проводнике проекта и выберите « Создать»> «Файл JSP» . Этот файл будет вызываться в случае, если возвращаемый результат — SUCCESS, который является строковой константой «success», как определено в интерфейсе Action.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Ниже приведен файл, который будет вызываться платформой в случае, если результатом действия является ОШИБКА, равная строковой константе «ошибка». Ниже приводится содержание AccessDenied.jsp

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>  
   <head>
      <title>Access Denied</title>
   </head>
   
   <body>
      You are not authorized to view this page.
   </body>
</html>

Нам также нужно создать index.jsp в папке WebContent. Этот файл будет служить начальным URL-адресом действия, по которому пользователь может щелкнуть, чтобы сообщить платформе Struts 2 о необходимости вызвать метод execute класса HelloWorldAction и отобразить представление HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>  
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Вот и все, для файла web.xml никаких изменений не требуется, поэтому давайте воспользуемся тем же файлом web.xml, который мы создали в главе « Примеры» . Теперь мы готовы запустить наше приложение Hello World с использованием инфраструктуры Struts 2.

Выполнить заявку

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> « Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это даст вам следующий экран —

Hello World Struts4

Давайте введем слово как «СЕКРЕТ», и вы должны увидеть следующую страницу —

helloworldstruts51

Теперь введите любое слово, кроме «СЕКРЕТНО», и вы должны увидеть следующую страницу —

helloworldstruts6

Создать несколько действий

Вы будете часто определять более одного действия для обработки разных запросов и предоставления разных URL-адресов пользователям, соответственно вы будете определять разные классы, как определено ниже —

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport {
   public static String GOOD = SUCCESS;
   public static String BAD = ERROR;
}

public class HelloWorld extends ActionSupport {
   ...
   public String execute() {
      if ("SECRET".equals(name)) return MyAction.GOOD;
      return MyAction.BAD;
   }
   ...
}

public class SomeOtherClass extends ActionSupport {
   ...
   public String execute() {
      return MyAction.GOOD;
   }
   ...
}

Вы настроите эти действия в файле struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorld" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
      
      <action name = "something" 
         class = "com.tutorialspoint.struts2.SomeOtherClass" 
         method = "execute">
         <result name = "success">/Something.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

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

Чтобы обойти эту проблему, предлагается создать класс, который содержит результаты результатов.

Struts 2 — Перехватчики

Перехватчики концептуально такие же, как фильтры сервлетов или прокси-класс JDK. Перехватчики позволяют реализовать функциональность пересекающихся функций отдельно от действия, а также от структуры. Используя перехватчики, вы можете добиться следующего:

  • Предоставление логики предварительной обработки перед вызовом действия.

  • Предоставление логики постобработки после вызова действия.

  • Перехват исключений, чтобы можно было выполнить альтернативную обработку.

Предоставление логики предварительной обработки перед вызовом действия.

Предоставление логики постобработки после вызова действия.

Перехват исключений, чтобы можно было выполнить альтернативную обработку.

Многие функции, предоставляемые в структуре Struts2 , реализованы с использованием перехватчиков;

Примеры включают обработку исключений, загрузку файлов, обратные вызовы жизненного цикла и т. Д. Фактически, поскольку Struts2 подчеркивает большую часть своей функциональности на перехватчиках, маловероятно, что на действие будет назначено 7 или 8 перехватчиков.

Структурные перехватчики Struts2

Структура Struts 2 предоставляет хороший список готовых перехватчиков, которые предварительно настроены и готовы к использованию. Немногие из важных перехватчиков перечислены ниже —

Sr.No Перехватчик и описание
1

псевдоним

Позволяет параметрам иметь разные псевдонимы имен в запросах.

2

флажок

Помогает в управлении флажками, добавляя значение параметра false для флажков, которые не отмечены.

3

conversionError

Помещает информацию об ошибках из преобразования строк в типы параметров в ошибки поля действия.

4

CreateSession

Автоматически создает сеанс HTTP, если он еще не существует.

5

отладка

Предоставляет разработчику несколько разных экранов отладки.

6

execAndWait

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

7

исключение

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

8

файл загружен

Облегчает простую загрузку файлов.

9

i18n

Отслеживает выбранную локаль во время сеанса пользователя.

10

лесоруб

Обеспечивает простое ведение журнала путем вывода имени выполняемого действия.

11

Титулы

Устанавливает параметры запроса на действие.

12

подготовить

Обычно это используется для выполнения предварительной обработки, такой как настройка соединений с базой данных.

13

профиль

Позволяет регистрировать простую информацию профилирования для действий.

14

объем

Сохраняет и получает состояние действия в области сеанса или приложения.

15

ServletConfig

Предоставляет действию доступ к различной информации на основе сервлетов.

16

таймер

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

17

знак

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

18

Проверка

Обеспечивает поддержку проверки действий

псевдоним

Позволяет параметрам иметь разные псевдонимы имен в запросах.

флажок

Помогает в управлении флажками, добавляя значение параметра false для флажков, которые не отмечены.

conversionError

Помещает информацию об ошибках из преобразования строк в типы параметров в ошибки поля действия.

CreateSession

Автоматически создает сеанс HTTP, если он еще не существует.

отладка

Предоставляет разработчику несколько разных экранов отладки.

execAndWait

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

исключение

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

файл загружен

Облегчает простую загрузку файлов.

i18n

Отслеживает выбранную локаль во время сеанса пользователя.

лесоруб

Обеспечивает простое ведение журнала путем вывода имени выполняемого действия.

Титулы

Устанавливает параметры запроса на действие.

подготовить

Обычно это используется для выполнения предварительной обработки, такой как настройка соединений с базой данных.

профиль

Позволяет регистрировать простую информацию профилирования для действий.

объем

Сохраняет и получает состояние действия в области сеанса или приложения.

ServletConfig

Предоставляет действию доступ к различной информации на основе сервлетов.

таймер

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

знак

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

Проверка

Обеспечивает поддержку проверки действий

Пожалуйста, ознакомьтесь с документацией Struts 2 для получения полной информации о вышеупомянутых перехватчиках. Но я покажу вам, как вообще использовать перехватчик в вашем приложении Struts.

Как использовать перехватчики?

Давайте посмотрим, как использовать уже существующий перехватчик для нашей программы «Hello World». Мы будем использовать таймер- перехватчик, цель которого — измерить, сколько времени потребовалось для выполнения метода действия. В то же время я использую params interceptor, цель которого — отправить параметры запроса в действие. Вы можете попробовать свой пример, не используя этот перехватчик, и вы обнаружите, что свойство name не устанавливается, поскольку параметр не может достичь действия.

Мы сохраним файлы HelloWorldAction.java, web.xml, HelloWorld.jsp и index.jsp, как они были созданы в главе « Примеры», но давайте изменим файл struts.xml, добавив перехватчик следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "timer" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст —

INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM 
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.

Здесь нижняя строка генерируется из-за таймера- перехватчика, который сообщает, что для выполнения действия потребовалось всего 109 мсек.

Создание пользовательских перехватчиков

Использование пользовательских перехватчиков в вашем приложении — это элегантный способ обеспечить сквозные функции приложения. Создать собственный перехватчик легко; интерфейс, который должен быть расширен, является следующим интерфейсом Interceptor

public interface Interceptor extends Serializable {
   void destroy();
   void init();
   String intercept(ActionInvocation invocation)
   throws Exception;
}

Как следует из названий, метод init () предоставляет способ инициализации перехватчика, а метод destroy () предоставляет средство для очистки перехватчика. В отличие от действий, перехватчики повторно используются в запросах и должны быть поточно-ориентированными, особенно метод intercept ().

Объект ActionInvocation обеспечивает доступ к среде выполнения. Это позволяет получить доступ к самому действию и методам, чтобы вызвать действие и определить, было ли уже вызвано действие.

Если вам не нужен код инициализации или очистки, класс AbstractInterceptor может быть расширен. Это обеспечивает реализацию nooperation по умолчанию методов init () и destroy ().

Создать класс перехватчика

Давайте создадим следующий MyInterceptor.java в разделе Ресурсы Java> папка src

package com.tutorialspoint.struts2;

import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

   public String intercept(ActionInvocation invocation)throws Exception {

      /* let us do some pre-processing */
      String output = "Pre-Processing"; 
      System.out.println(output);

      /* let us call action or next interceptor */
      String result = invocation.invoke();

      /* let us do some post-processing */
      output = "Post-Processing"; 
      System.out.println(output);

      return result;
   }
}

Как вы заметили, фактическое действие будет выполнено с использованием перехватчика с помощью вызова invocation.invoke () . Таким образом, вы можете выполнить некоторую предварительную и постобработку в зависимости от ваших требований.

Фреймворк сам запускает процесс, выполняя первый вызов invoke () объекта ActionInvocation. Каждый раз, когда вызывается invoke () , ActionInvocation проверяет свое состояние и запускается в зависимости от того, какой перехватчик последует. Когда все сконфигурированные перехватчики были вызваны, метод invoke () вызовет выполнение самого действия.

Следующая диаграмма показывает ту же концепцию в потоке запросов —

ActionInvocation

Создать класс действий

Давайте создадим Java-файл HelloWorldAction.java в разделе « Ресурсы Java> src» с именем пакета com.tutorialspoint.struts2 с содержимым, приведенным ниже.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      System.out.println("Inside action....");
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Это тот же класс, который мы видели в предыдущих примерах. У нас есть стандартные методы получения и установки для свойства «name» и метод execute, который возвращает строку «success».

Создать представление

Давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Создать главную страницу

Нам также нужно создать index.jsp в папке WebContent. Этот файл будет служить начальным URL-адресом действия, по которому пользователь может щелкнуть платформу Struts 2, чтобы вызвать определенный метод класса HelloWorldAction и отобразить представление HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Действие hello, определенное в приведенном выше файле представления, будет сопоставлено с классом HelloWorldAction и его методом execute с использованием файла struts.xml.

Конфигурационные файлы

Теперь нам нужно зарегистрировать наш перехватчик и затем вызвать его, как мы уже называли перехватчик по умолчанию в предыдущем примере. Для регистрации вновь определенного перехватчика теги <interceptors> … </ interceptors> помещаются непосредственно под тегом <package> ins Struts.xml . Вы можете пропустить этот шаг для перехватчиков по умолчанию, как мы делали в предыдущем примере. Но здесь давайте регистрироваться и использовать его следующим образом —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <interceptors>
         <interceptor name = "myinterceptor"
            class = "com.tutorialspoint.struts2.MyInterceptor" />
      </interceptors>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "myinterceptor" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Следует отметить, что вы можете зарегистрировать более одного перехватчика внутри тега <package> и в то же время вы можете вызвать более одного перехватчика внутри тега <action> . Вы можете вызывать один и тот же перехватчик с разными действиями.

Файл web.xml необходимо создать в папке WEB-INF в WebContent следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст внизу —

Pre-Processing
Inside action....
Post-Processing

Укладка нескольких перехватчиков

Как вы можете себе представить, необходимость настроить несколько перехватчиков для каждого действия быстро станет чрезвычайно неуправляемой. По этой причине перехватчики управляются стеками перехватчиков. Вот пример, прямо из файла strutsdefault.xml —

<interceptor-stack name = "basicStack">
   <interceptor-ref name = "exception"/>
   <interceptor-ref name = "servlet-config"/>
   <interceptor-ref name = "prepare"/>
   <interceptor-ref name = "checkbox"/>
   <interceptor-ref name = "params"/>
   <interceptor-ref name = "conversionError"/>
</interceptor-stack>

Вышеуказанная ставка называется basicStack и может использоваться в вашей конфигурации, как показано ниже. Этот узел конфигурации находится под узлом <package … />. Каждый тег <interceptor-ref … /> ссылается либо на перехватчик, либо на стек перехватчиков, который был настроен перед текущим стеком перехватчиков. Поэтому очень важно обеспечить, чтобы имя было уникальным во всех конфигурациях стека перехватчиков и перехватчиков при настройке начальных перехватчиков и стеков перехватчиков.

Мы уже видели, как применить перехватчик к действию, применение стеков перехватчика ничем не отличается. На самом деле, мы используем точно такой же тег —

<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
   <interceptor-ref name = "basicStack"/>
   <result>view.jsp</result>
</action

Вышеуказанная регистрация «basicStack» зарегистрирует полную ставку всех шести перехватчиков с действием hello. Следует отметить, что перехватчики выполняются в том порядке, в котором они были настроены. Например, в вышеприведенном случае сначала будет выполнено исключение, во-вторых будет config-сервлет и так далее.

Struts 2 — результаты и типы результатов

Как упоминалось ранее, тег <results> играет роль представления в среде Struts2 MVC. Действие отвечает за выполнение бизнес-логики. Следующим шагом после выполнения бизнес-логики является отображение представления с использованием тега <results> .

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

  • Успешный вход в систему
  • Неудачный вход в систему — Неверное имя пользователя или пароль
  • Учетная запись заблокирована

В этом сценарии метод действия будет настроен с тремя возможными последовательностями результатов и тремя различными представлениями для отображения результата. Мы уже видели это в предыдущих примерах.

Но Struts2 не связывает вас с использованием JSP в качестве технологии просмотра. В конце концов, вся цель парадигмы MVC состоит в том, чтобы разделять слои и настраивать их. Например, для клиента Web2.0 вы можете захотеть вернуть XML или JSON в качестве вывода. В этом случае вы можете создать новый тип результата для XML или JSON и добиться этого.

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

Тип результата Диспетчер

Тип результата диспетчера является типом по умолчанию и используется, если не указан другой тип результата. Он используется для пересылки на сервер сервлету, JSP, HTML-странице и т. Д. Он использует метод RequestDispatcher.forward () .

Мы видели сокращенную версию в наших предыдущих примерах, где мы указали путь JSP в качестве тела тега результата.

<result name = "success">
   /HelloWorld.jsp
</result>

Мы также можем указать файл JSP, используя тег <param name = «location»> внутри элемента <result …> следующим образом:

<result name = "success" type = "dispatcher">
   <param name = "location">
      /HelloWorld.jsp
   </param >
</result>

Мы также можем предоставить параметр разбора , который по умолчанию имеет значение true. Параметр parse определяет, будет ли анализироваться параметр местоположения для выражений OGNL.

Тип результата FreeMaker

В этом примере мы увидим, как мы можем использовать FreeMaker в качестве технологии просмотра. Freemaker — это популярный шаблонизатор, который используется для генерации выходных данных с использованием предопределенных шаблонов. Теперь давайте создадим файл шаблона Freemaker под названием hello.fm со следующим содержимым:

Hello World ${name}

Приведенный выше файл является шаблоном, где name — это параметр, который будет передан извне с помощью определенного действия. Вы сохраните этот файл в своем CLASSPATH.

Далее, давайте изменим struts.xml, чтобы указать результат следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success" type = "freemarker">
            <param name = "location">/hello.fm</param>
         </result>
      </action>
      
   </package>

</struts>

Давайте сохраним наши файлы HelloWorldAction.java, HelloWorldAction.jsp и index.jsp, как мы их создали в главе с примерами.

Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War».

Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран.

Hello World Struts 4

Введите значение «Struts2» и отправьте страницу. Вы должны увидеть следующую страницу.

Hello World Struts 5

Как вы можете видеть, это в точности то же самое, что и представление JSP, за исключением того, что мы не привязаны к использованию JSP в качестве технологии представления. В этом примере мы использовали Freemaker.

Тип результата перенаправления

Тип результата перенаправления вызывает стандартный метод response.sendRedirect () , в результате чего браузер создает новый запрос к указанному местоположению.

Мы можем указать местоположение либо в теле элемента <result …>, либо в качестве элемента <param name = «location»>. Redirect также поддерживает параметр parse . Вот пример, настроенный с использованием XML:

<action name = "hello" 
   class = "com.tutorialspoint.struts2.HelloWorldAction"
   method = "execute">
   <result name = "success" type = "redirect">
      <param name = "location">
         /NewWorld.jsp
      </param >
   </result>
</action>

Так что просто измените свой файл struts.xml, чтобы определить тип перенаправления, как упомянуто выше, и создайте новый файл NewWorld.jpg, куда вы будете перенаправлены всякий раз, когда действие приветствия вернет успех. Вы можете проверить пример Struts 2 Redirect Action для лучшего понимания.

Struts 2 — стек значений / OGNL

Стек значений

Стек значений — это набор из нескольких объектов, который хранит следующие объекты в указанном порядке:

Sr.No Объекты и описание
1

Временные объекты

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

2

Модельный объект

Если вы используете объекты модели в приложении Struts, объект текущей модели помещается перед действием в стеке значений.

3

Объект действия

Это будет текущий объект действия, который выполняется.

4

Именованные объекты

Эти объекты включают в себя #application, #session, #request, #attr и #parameters и ссылаются на соответствующие области сервлетов.

Временные объекты

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

Модельный объект

Если вы используете объекты модели в приложении Struts, объект текущей модели помещается перед действием в стеке значений.

Объект действия

Это будет текущий объект действия, который выполняется.

Именованные объекты

Эти объекты включают в себя #application, #session, #request, #attr и #parameters и ссылаются на соответствующие области сервлетов.

Доступ к стеку значений можно получить через теги, предоставленные для JSP, Velocity или Freemarker. Существуют различные теги, которые мы будем изучать в отдельных главах, которые используются для получения и установки стека значений 2.0. Вы можете получить объект valueStack внутри вашего действия следующим образом:

ActionContext.getContext().getValueStack()

Получив объект ValueStack, вы можете использовать следующие методы для управления этим объектом:

Sr.No ValueStack Методы и описание
1

Object findValue (String expr)

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

2

CompoundRoot getRoot ()

Получите CompoundRoot, который содержит объекты, помещенные в стек.

3

Просмотр объекта ()

Получить объект на вершине стека без изменения стека.

4

Объект pop ()

Получить объект на вершине стека и удалить его из стека.

5 Пустой толчок (Объект o)

Поместите этот объект на вершину стека.

6

void set (Строковый ключ, Объект o)

Устанавливает объект в стеке с заданным ключом, чтобы его можно было найти с помощью findValue (key, …)

7

void setDefaultType (класс defaultType)

Устанавливает тип по умолчанию для преобразования, если при получении значения тип не указан.

8

void setValue (String expr, Object value)

Пытается установить свойство для bean-компонента в стеке с заданным выражением, используя порядок поиска по умолчанию.

9

int size ()

Получить количество объектов в стеке.

Object findValue (String expr)

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

CompoundRoot getRoot ()

Получите CompoundRoot, который содержит объекты, помещенные в стек.

Просмотр объекта ()

Получить объект на вершине стека без изменения стека.

Объект pop ()

Получить объект на вершине стека и удалить его из стека.

Поместите этот объект на вершину стека.

void set (Строковый ключ, Объект o)

Устанавливает объект в стеке с заданным ключом, чтобы его можно было найти с помощью findValue (key, …)

void setDefaultType (класс defaultType)

Устанавливает тип по умолчанию для преобразования, если при получении значения тип не указан.

void setValue (String expr, Object value)

Пытается установить свойство для bean-компонента в стеке с заданным выражением, используя порядок поиска по умолчанию.

int size ()

Получить количество объектов в стеке.

ОГНЛ

Язык навигации объектов-графиков (OGNL) — это мощный язык выражений, который используется для ссылки и манипулирования данными в ValueStack. OGNL также помогает в передаче данных и преобразовании типов.

OGNL очень похож на язык выражений JSP. OGNL основан на идее наличия корневого объекта или объекта по умолчанию в контексте. На свойства объекта по умолчанию или корневого объекта можно ссылаться, используя обозначение разметки, которое является символом фунта.

Как упоминалось ранее, OGNL основан на контексте, и Struts создает карту ActionContext для использования с OGNL. Карта ActionContext состоит из следующих элементов:

  • Приложение — переменные области применения

  • Session — переменные области видимости

  • Стек корня / значения — все ваши переменные действия хранятся здесь

  • Запрос — Запрос переменных области

  • Параметры — параметры запроса

  • Атрибуты — Атрибуты, хранящиеся в области страницы, запроса, сеанса и приложения.

Приложение — переменные области применения

Session — переменные области видимости

Стек корня / значения — все ваши переменные действия хранятся здесь

Запрос — Запрос переменных области

Параметры — параметры запроса

Атрибуты — Атрибуты, хранящиеся в области страницы, запроса, сеанса и приложения.

Важно понимать, что объект Action всегда доступен в стеке значений. Поэтому, если ваш объект Action имеет свойства «x» и «y», вы легко можете его использовать.

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

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

<s:property value = "name"/>

вместо

<s:property value = "#name"/>

Если у вас есть атрибут в сеансе, называемый «логин», вы можете получить его следующим образом:

<s:property value = "#session.login"/>

OGNL также поддерживает работу с коллекциями, а именно с картой, списком и набором. Например, чтобы отобразить раскрывающийся список цветов, вы можете сделать:

<s:select name = "color" list = "{'red','yellow','green'}" />

Выражение OGNL умно интерпретирует «красный», «желтый», «зеленый» как цвета и строит список на основе этого.

Выражения OGNL будут широко использоваться в следующих главах, когда мы будем изучать различные теги. Поэтому вместо того, чтобы рассматривать их по отдельности, давайте рассмотрим их на примерах, приведенных в разделе «Теги форм / Контрольные теги / Теги данных и Теги Ajax».

Пример ValueStack / OGNL

Создать действие

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

package com.tutorialspoint.struts2;

import java.util.*; 

import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      ValueStack stack = ActionContext.getContext().getValueStack();
      Map<String, Object> context = new HashMap<String, Object>();

      context.put("key1", new String("This is key1")); 
      context.put("key2", new String("This is key2"));
      stack.push(context);

      System.out.println("Size of the valueStack: " + stack.size());
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

На самом деле, Struts 2 добавляет ваше действие к вершине valueStack при выполнении. Итак, обычный способ поместить вещи в стек значений — это добавить методы получения / установки для значений в ваш класс Action и затем использовать тег <s: property> для доступа к значениям. Но я покажу вам, как именно ActionContext и ValueStack работают в стойках.

Создать представления

Давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse. Это представление будет отображаться в случае, если действие вернет успех —

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Entered value : <s:property value = "name"/><br/>
      Value of key 1 : <s:property value = "key1" /><br/>
      Value of key 2 : <s:property value = "key2" /> <br/>
   </body>
</html>

Нам также нужно создать index.jsp в папке WebContent, содержимое которого выглядит следующим образом:

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Конфигурационные файлы

Ниже приводится содержание файла struts.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat.

Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст внизу —

Size of the valueStack: 3

Это отобразит следующий экран, который будет отображать любое значение, которое вы введете, и значение ключей 1 и 2, которые мы поместили в ValueStack.

Struts 2 — Загрузка файлов

Инфраструктура Struts 2 обеспечивает встроенную поддержку обработки загрузки файлов с помощью «Загрузка файлов на основе форм в HTML». Когда файл загружен, он, как правило, сохраняется во временном каталоге, и ваш класс Action должен обрабатывать или перемещать его в постоянный каталог, чтобы гарантировать, что данные не будут потеряны.

Примечание. На серверах может быть установлена ​​политика безопасности, запрещающая запись в каталоги, отличные от временного каталога и каталогов, принадлежащих вашему веб-приложению.

Загрузка файлов в Struts возможна через предварительно определенный перехватчик, называемый перехватчиком FileUpload, который доступен через класс org.apache.struts2.interceptor.FileUploadInterceptor и включен как часть defaultStack . Тем не менее, вы можете использовать это в вашем struts.xml для установки различных параметров, как мы увидим ниже.

Создать просмотр файлов

Давайте начнем с создания нашего представления, которое потребуется для просмотра и загрузки выбранного файла. Итак, давайте создадим index.jsp с простой формой загрузки HTML, которая позволяет пользователю загружать файл —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>File Upload</title>
   </head>
   
   <body>
      <form action = "upload" method = "post" enctype = "multipart/form-data">
         <label for = "myFile">Upload your file</label>
         <input type = "file" name = "myFile" />
         <input type = "submit" value = "Upload"/>
      </form>
   </body>
</html>

В приведенном выше примере стоит отметить пару моментов. Во-первых, для enctype формы устанавливается значение multipart / form-data . Это должно быть установлено так, чтобы пересылка файлов успешно выполнялась закачкой файлов. Следующее, что нужно отметить, — это метод действия формы загрузки и имя поля загрузки файла — myFile . Нам нужна эта информация для создания метода действия и конфигурации распорок.

Далее, давайте создадим простой jsp-файл success.jsp для отображения результата загрузки нашего файла в случае успеха.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>File Upload Success</title>
   </head>
   
   <body>
      You have successfully uploaded <s:property value = "myFileFileName"/>
   </body>
</html>

Ниже будет файл результата error.jsp, если при загрузке файла произошла ошибка —

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>File Upload Error</title>
   </head>
   
   <body>
      There has been an error in uploading the file.
   </body>
</html>

Создать класс действий

Далее, давайте создадим Java-класс uploadFile.java, который позаботится о загрузке файла и его сохранении в безопасном месте.

package com.tutorialspoint.struts2;

import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException; 

import com.opensymphony.xwork2.ActionSupport;

public class uploadFile extends ActionSupport {
   private File myFile;
   private String myFileContentType;
   private String myFileFileName;
   private String destPath;

   public String execute() {
      /* Copy file to a safe location */
      destPath = "C:/apache-tomcat-6.0.33/work/";

      try {
         System.out.println("Src File name: " + myFile);
         System.out.println("Dst File name: " + myFileFileName);
     	    	 
         File destFile  = new File(destPath, myFileFileName);
         FileUtils.copyFile(myFile, destFile);
  
      } catch(IOException e) {
         e.printStackTrace();
         return ERROR;
      }

      return SUCCESS;
   }
   
   public File getMyFile() {
      return myFile;
   }
   
   public void setMyFile(File myFile) {
      this.myFile = myFile;
   }
   
   public String getMyFileContentType() {
      return myFileContentType;
   }
   
   public void setMyFileContentType(String myFileContentType) {
      this.myFileContentType = myFileContentType;
   }
   
   public String getMyFileFileName() {
      return myFileFileName;
   }
   
   public void setMyFileFileName(String myFileFileName) {
      this.myFileFileName = myFileFileName;
   }
}

UploadFile.java — очень простой класс. Важно отметить, что перехватчик FileUpload вместе с перехватчиком параметров делает всю тяжелую работу за нас.

Перехватчик FileUpload делает три параметра доступными для вас по умолчанию. Они названы в следующем порядке —

  • [ваш параметр имени файла] — это фактический файл, который пользователь загрузил. В этом примере это будет «myFile»

  • [параметр имени вашего файла] ContentType — это тип содержимого файла, который был загружен. В этом примере это будет «myFileContentType»

  • [параметр имени вашего файла] FileName — это имя файла, который был загружен. В этом примере это будет «myFileFileName»

[ваш параметр имени файла] — это фактический файл, который пользователь загрузил. В этом примере это будет «myFile»

[параметр имени вашего файла] ContentType — это тип содержимого файла, который был загружен. В этом примере это будет «myFileContentType»

[параметр имени вашего файла] FileName — это имя файла, который был загружен. В этом примере это будет «myFileFileName»

Три параметра доступны для нас, благодаря перехватчикам Struts. Все, что нам нужно сделать, — это создать три параметра с правильными именами в нашем классе Action, и автоматически эти переменные будут автоматически подключены для нас. Итак, в приведенном выше примере у нас есть три параметра и метод действия, который просто возвращает «success», если все идет хорошо, в противном случае он возвращает «error».

Конфигурационные файлы

Ниже приведены свойства конфигурации Struts2, которые управляют процессом загрузки файлов.

Sr.No Свойства и описание
1

struts.multipart.maxSize

Максимальный размер (в байтах) файла, который будет принят как загрузка файла. По умолчанию 250M.

2

struts.multipart.parser

Библиотека, используемая для загрузки многочастной формы. По умолчанию это Джакарта

3

struts.multipart.saveDir

Расположение для хранения временного файла. По умолчанию это javax.servlet.context.tempdir.

struts.multipart.maxSize

Максимальный размер (в байтах) файла, который будет принят как загрузка файла. По умолчанию 250M.

struts.multipart.parser

Библиотека, используемая для загрузки многочастной формы. По умолчанию это Джакарта

struts.multipart.saveDir

Расположение для хранения временного файла. По умолчанию это javax.servlet.context.tempdir.

Чтобы изменить любой из этих параметров, вы можете использовать постоянный тег в файле struts.xml приложений, как я сделал, чтобы изменить максимальный размер файла для загрузки.

Давайте иметь наш struts.xml следующим образом —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.multipart.maxSize" value = "1000000" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
         <result name = "success">/success.jsp</result>
         <result name = "error">/error.jsp</result>
      </action>
   </package>
</struts>

Поскольку перехватчик FileUpload является частью стека перехватчиков по умолчанию, нам не нужно настраивать его подробно. Но вы можете добавить тег <interceptor-ref> внутри <action>. Перехватчик fileUpload принимает два параметра: (a) MaximumSize и (b) allowTypes .

Параметр MaximumSize устанавливает максимально допустимый размер файла (по умолчанию приблизительно 2 МБ). Параметр allowTypes представляет собой список допустимых типов содержимого (MIME), разделенных запятыми, как показано ниже:

<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
   <interceptor-ref name = "basicStack">
   <interceptor-ref name = "fileUpload">
      <param name = "allowedTypes">image/jpeg,image/gif</param>
   </interceptor-ref>
   <result name = "success">/success.jsp</result>
   <result name = "error">/error.jsp</result>
</action>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / upload.jsp . Это создаст следующий экран —

Hello World Struts 7

Теперь выберите файл «Contacts.txt» с помощью кнопки «Обзор» и нажмите кнопку «Загрузить», после чего файл будет загружен на ваш сервер, и вы должны увидеть следующую страницу. Вы можете проверить, что загруженный файл должен быть сохранен в C: \ apache-tomcat-6.0.33 \ work.

Hello World Struts 8

Обратите внимание, что FileUpload Interceptor автоматически удаляет загруженный файл, поэтому вам придется программно сохранить загруженный файл в каком-то месте, прежде чем он будет удален.

Сообщения об ошибках

Перехватчик fileUplaod использует несколько ключей сообщений об ошибках по умолчанию —

Sr.No Ключ сообщения об ошибке и описание
1

struts.messages.error.uploading

Общая ошибка, которая возникает, когда файл не может быть загружен.

2

struts.messages.error.file.too.large

Происходит, когда загружаемый файл слишком велик, как указано в MaximumSize.

3

struts.messages.error.content.type.not.allowed

Происходит, когда загруженный файл не соответствует ожидаемым указанным типам содержимого.

struts.messages.error.uploading

Общая ошибка, которая возникает, когда файл не может быть загружен.

struts.messages.error.file.too.large

Происходит, когда загружаемый файл слишком велик, как указано в MaximumSize.

struts.messages.error.content.type.not.allowed

Происходит, когда загруженный файл не соответствует ожидаемым указанным типам содержимого.

Вы можете переопределить текст этих сообщений в файлах ресурсов WebContent / WEB-INF / classes / messages.properties .

Struts 2 — доступ к базе данных

В этой главе вы узнаете, как получить доступ к базе данных с помощью Struts 2 за несколько простых шагов. Struts — это инфраструктура MVC, а не база данных, но она обеспечивает отличную поддержку интеграции JPA / Hibernate. Мы рассмотрим интеграцию hibernate в следующей главе, но в этой главе мы будем использовать старый добрый JDBC для доступа к базе данных.

Первый шаг в этой главе — настроить и заполнить нашу базу данных. Я использую MySQL в качестве базы данных для этого примера. На моем компьютере установлен MySQL, и я создал новую базу данных с именем «struts_tutorial». Я создал таблицу с именем login и заполнил ее некоторыми значениями. Ниже приведен скрипт, который я использовал для создания и заполнения таблицы.

Моя база данных MYSQL имеет имя пользователя по умолчанию «root» и пароль «root123»

CREATE TABLE `struts_tutorial`.`login` (
   `user` VARCHAR( 10 ) NOT NULL ,
   `password` VARCHAR( 10 ) NOT NULL ,
   `name` VARCHAR( 20 ) NOT NULL ,
   PRIMARY KEY ( `user` )
) ENGINE = InnoDB;

INSERT INTO `struts_tutorial`.`login` (`user`, `password`, `name`)
VALUES ('scott', 'navy', 'Scott Burgemott');

Следующим шагом является загрузка jar-файла MySQL Connector и размещение этого файла в папке WEB-INF \ lib вашего проекта. После того, как мы это сделали, мы готовы создать класс действий.

Создать действие

Класс действия имеет свойства, соответствующие столбцам в таблице базы данных. У нас есть имя пользователя, пароль и имя в качестве атрибутов String. В методе действия мы используем параметры user и password, чтобы проверить, существует ли пользователь, если это так, мы отображаем имя пользователя на следующем экране.

Если пользователь ввел неверную информацию, мы снова отправляем его на экран входа в систему.

Ниже приводится содержание файла LoginAction.java

package com.tutorialspoint.struts2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

   private String user;
   private String password;
   private String name;

   public String execute() {
      String ret = ERROR;
      Connection conn = null;

      try {
         String URL = "jdbc:mysql://localhost/struts_tutorial";
         Class.forName("com.mysql.jdbc.Driver");
         conn = DriverManager.getConnection(URL, "root", "root123");
         String sql = "SELECT name FROM login WHERE";
         sql+=" user = ? AND password = ?";
         PreparedStatement ps = conn.prepareStatement(sql);
         ps.setString(1, user);
         ps.setString(2, password);
         ResultSet rs = ps.executeQuery();

         while (rs.next()) {
            name = rs.getString(1);
            ret = SUCCESS;
         }
      } catch (Exception e) {
         ret = ERROR;
      } finally {
         if (conn != null) {
            try {
               conn.close();
            } catch (Exception e) {
            }
         }
      }
      return ret;
   }

   public String getUser() {
      return user;
   }

   public void setUser(String user) {
      this.user = user;
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Создать главную страницу

Теперь давайте создадим файл JSP index.jsp для сбора имени пользователя и пароля. Это имя пользователя и пароль будут проверены по базе данных.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Login</title>
   </head>
   
   <body>
      <form action = "loginaction" method = "post">
         User:<br/><input type = "text" name = "user"/><br/>
         Password:<br/><input type = "password" name = "password"/><br/>
         <input type = "submit" value = "Login"/>		
      </form>
   </body>
</html>

Создать представления

Теперь давайте создадим файл success.jsp, который будет вызываться в случае, если действие возвращает SUCCESS, но у нас будет другой файл представления в случае возврата ОШИБКИ из действия.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Successful Login</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Ниже будет показан файл представления error.jsp в случае возврата ОШИБКИ из действия.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Invalid User Name or Password</title>
   </head>
   
   <body>
      Wrong user name or password provided.
   </body>
</html>

Конфигурационные файлы

Наконец, давайте соберем все вместе, используя конфигурационный файл struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
   
      <action name = "loginaction" 
         class = "com.tutorialspoint.struts2.LoginAction"
         method = "execute">
         <result name = "success">/success.jsp</result>
         <result name = "error">/error.jsp</result>
      </action>
   
   </package>
</struts>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Hello World Struts 9

Введите неверное имя пользователя и пароль. Вы должны увидеть следующую страницу.

Hello World Struts 10

Теперь введите scott в качестве имени пользователя и navy в качестве пароля. Вы должны увидеть следующую страницу.

Hello World Struts 11

Struts 2 — Отправка электронной почты

В этой главе объясняется, как вы можете отправить электронное письмо, используя приложение Struts 2.

Для этого упражнения вам необходимо скачать и установить mail.jar из JavaMail API 1.4.4 и поместить файл mail.jar в папку WEB-INF \ lib, а затем перейти к стандартным шагам создания действия, просмотра и настройки. файлы.

Создать действие

Следующим шагом является создание метода Action, который позаботится об отправке электронной почты. Давайте создадим новый класс Emailer.java со следующим содержимым.

package com.tutorialspoint.struts2;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.opensymphony.xwork2.ActionSupport;

public class Emailer extends ActionSupport {

   private String from;
   private String password;
   private String to;
   private String subject;
   private String body;

   static Properties properties = new Properties();
   static {
      properties.put("mail.smtp.host", "smtp.gmail.com");
      properties.put("mail.smtp.socketFactory.port", "465");
      properties.put("mail.smtp.socketFactory.class",
         "javax.net.ssl.SSLSocketFactory");
      properties.put("mail.smtp.auth", "true");
      properties.put("mail.smtp.port", "465");
   }

   public String execute() {
      String ret = SUCCESS;
      try {
         Session session = Session.getDefaultInstance(properties,  
            new javax.mail.Authenticator() {
               protected PasswordAuthentication 
               getPasswordAuthentication() {
                  return new 
                  PasswordAuthentication(from, password);
               }
            }
         );

         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress(from));
         message.setRecipients(Message.RecipientType.TO, 
            InternetAddress.parse(to));
         message.setSubject(subject);
         message.setText(body);
         Transport.send(message);
      } catch(Exception e) {
         ret = ERROR;
         e.printStackTrace();
      }
      return ret;
   }

   public String getFrom() {
      return from;
   }

   public void setFrom(String from) {
      this.from = from;
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public String getTo() {
      return to;
   }

   public void setTo(String to) {
      this.to = to;
   }

   public String getSubject() {
      return subject;
   }

   public void setSubject(String subject) {
      this.subject = subject;
   }

   public String getBody() {
      return body;
   }

   public void setBody(String body) {
      this.body = body;
   }

   public static Properties getProperties() {
      return properties;
   }

   public static void setProperties(Properties properties) {
      Emailer.properties = properties;
   }
}

Как видно из исходного кода выше, Emailer.java имеет свойства, которые соответствуют атрибутам формы на странице email.jsp, приведенной ниже. Эти атрибуты —

  • От — адрес электронной почты отправителя. Поскольку мы используем SMTP от Google, нам нужен правильный идентификатор gtalk

  • Пароль — пароль вышеуказанного аккаунта

  • Кому — кому отправить электронное письмо?

  • Тема — тема письма

  • Тело — фактическое сообщение электронной почты

От — адрес электронной почты отправителя. Поскольку мы используем SMTP от Google, нам нужен правильный идентификатор gtalk

Пароль — пароль вышеуказанного аккаунта

Кому — кому отправить электронное письмо?

Тема — тема письма

Тело — фактическое сообщение электронной почты

Мы не рассматривали какие-либо проверки в вышеуказанных полях, проверки будут добавлены в следующей главе. Давайте теперь посмотрим на метод execute (). Метод execute () использует библиотеку javax Mail для отправки электронной почты с использованием предоставленных параметров. Если письмо отправлено успешно, действие возвращает SUCCESS, в противном случае возвращается ERROR.

Создать главную страницу

Давайте напишем файл JSP главной страницы index.jsp , который будет использоваться для сбора информации, связанной с электронной почтой, упомянутой выше —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
   <title>Email Form</title>
   </head>
   
   <body>
      <em>The form below uses Google's SMTP server. 
         So you need to enter a gmail username and password
      </em>
      
      <form action = "emailer" method = "post">
         <label for = "from">From</label><br/>
         <input type = "text" name = "from"/><br/>
         <label for = "password">Password</label><br/>
         <input type = "password" name = "password"/><br/>
         <label for = "to">To</label><br/>
         <input type = "text" name = "to"/><br/>
         <label for = "subject">Subject</label><br/>
         <input type = "text" name = "subject"/><br/>
         <label for = "body">Body</label><br/>
         <input type = "text" name = "body"/><br/>
         <input type = "submit" value = "Send Email"/>
      </form>
   </body>
</html>

Создать представления

Мы будем использовать файл JSP success.jsp, который будет вызываться в случае, если действие возвращает SUCCESS, но у нас будет другой файл представления в случае возврата ОШИБКИ из действия.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Email Success</title>
   </head>
   
   <body>
      Your email to <s:property value = "to"/> was sent successfully.
   </body>
</html>

Ниже будет показан файл представления error.jsp в случае возврата ОШИБКИ из действия.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Email Error</title>
   </head>
   
   <body>
      There is a problem sending your email to <s:property value = "to"/>.
   </body>
</html>

Конфигурационные файлы

Теперь давайте соберем все вместе, используя конфигурационный файл struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "emailer" 
         class = "com.tutorialspoint.struts2.Emailer"
         method = "execute">
         <result name = "success">/success.jsp</result>
         <result name = "error">/error.jsp</result>
      </action>

   </package>
</struts>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Ввод пользователя по электронной почте

Введите необходимую информацию и нажмите кнопку « Отправить письмо» . Если все идет хорошо, вы должны увидеть следующую страницу.

Письмо успешно

Struts 2 — структура валидации

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

Проверка на стороне клиента обычно достигается с помощью Javascript. Однако не следует полагаться только на проверку на стороне клиента. Лучшие практики предполагают, что проверка должна быть введена на всех уровнях вашей прикладной платформы. Теперь давайте рассмотрим два способа добавления проверки в наш проект Struts.

Здесь мы возьмем пример сотрудника, чье имя и возраст должны быть записаны с использованием простой страницы, и мы поместим эти две проверки, чтобы убедиться, что пользователь всегда вводит имя и возраст, которые должны находиться в диапазоне от 28 до 65.

Давайте начнем с главной страницы JSP примера.

Создать главную страницу

Давайте напишем файл JSP главной страницы index.jsp , который будет использоваться для сбора информации о сотрудниках, упомянутой выше.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form</title>
   </head>

   <body>
      <s:form action = "empinfo" method = "post">
         <s:textfield name = "name" label = "Name" size = "20" />
         <s:textfield name = "age" label = "Age" size = "20" />
         <s:submit name = "submit" label = "Submit" align="center" />
      </s:form>
   </body>
</html>

Index.jsp использует тег Struts, который мы еще не рассмотрели, но мы изучим их в главах, связанных с тегами. Но пока предположим, что тег s: textfield печатает поле ввода, а s: submit печатает кнопку отправки. Мы использовали свойство label для каждого тега, которое создает ярлык для каждого тега.

Создать представления

Мы будем использовать файл JSP success.jsp, который будет вызываться в случае, если определенное действие вернет SUCCESS.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      Employee Information is captured successfully.
   </body>
</html>

Создать действие

Итак, давайте определим небольшой класс действия Employee , а затем добавим метод с именем validate (), как показано ниже в файле Employee.java . Убедитесь, что ваш класс действий расширяет класс ActionSupport , иначе ваш метод validate не будет выполнен.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport {
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   public String getName() {
       return name;
   }
   
   public void setName(String name) {
       this.name = name;
   }
   
   public int getAge() {
       return age;
   }
   
   public void setAge(int age) {
       this.age = age;
   }

   public void validate() {
      if (name == null || name.trim().equals("")) {
         addFieldError("name","The name is required");
      }
      
      if (age < 28 || age > 65) {
         addFieldError("age","Age must be in between 28 and 65");
      }
   }
}

Как показано в приведенном выше примере, метод проверки проверяет, имеет ли поле «Имя» значение или нет. Если значение не было предоставлено, мы добавляем поле ошибки для поля «Имя» с пользовательским сообщением об ошибке. Во-вторых, мы проверяем, находится ли введенное значение для поля «Возраст» между 28 и 65 или нет, если это условие не выполняется, мы добавляем ошибку над проверенным полем.

Конфигурационные файлы

Наконец, давайте соберем все вместе, используя конфигурационный файл struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>

   </package>
</struts>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Ввод пользователя по электронной почте

Теперь не вводите необходимую информацию, просто нажмите кнопку « Отправить» . Вы увидите следующий результат —

ошибка

Введите необходимую информацию, но введите неправильное поле From, допустим, что имя называется «test», а возраст — 30, и, наконец, нажмите кнопку « Отправить» . Вы увидите следующий результат —

успех

Как работает эта проверка?

Когда пользователь нажимает кнопку отправки, Struts 2 автоматически выполняет метод validate, и если какой-либо из операторов if, перечисленных внутри метода, имеет значение true, Struts 2 вызывает свой метод addFieldError. Если были добавлены какие-либо ошибки, Struts 2 не будет продолжать вызывать метод execute. Скорее, среда Struts 2 будет возвращать входные данные в результате вызова действия.

Следовательно, когда проверка завершается неудачно и Struts 2 возвращает ввод , среда Struts 2 снова отображает файл index.jsp. Поскольку мы использовали теги формы Struts 2, Struts 2 автоматически добавит сообщения об ошибках непосредственно над полем формы.

Это сообщения об ошибках, которые мы указали в вызове метода addFieldError. Метод addFieldError принимает два аргумента. Первое, это имя поля формы, к которому относится ошибка, а второе, это сообщение об ошибке, отображаемое над этим полем формы.

addFieldError("name","The name is required");

Для обработки возвращаемого значения ввода нам нужно добавить следующий результат в наш узел действия в struts.xml .

<result name = "input">/index.jsp</result>

Проверка на основе XML

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

XML-файл должен иметь имя «[action-class]» — validation.xml . Итак, в нашем случае мы создаем файл Employee-validation.xml со следующим содержимым:

<!DOCTYPE validators PUBLIC 
   "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
   "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
   <field name = "name">
      <field-validator type = "required">
         <message>
            The name is required.
         </message>
      </field-validator>
   </field>

   <field name = "age">
     <field-validator type = "int">
         <param name = "min">29</param>
         <param name = "max">64</param>
         <message>
            Age must be in between 28 and 65
         </message>
      </field-validator>
   </field>
</validators>

Выше XML-файл в идеале будет храниться в вашем CLASSPATH вместе с файлом классов. Позвольте нам иметь наш класс действия Employee следующим образом без метода validate ()

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
       return SUCCESS;
   }
   
   public String getName() {
       return name;
   }
   
   public void setName(String name) {
       this.name = name;
   }
   
   public int getAge() {
       return age;
   }
   
   public void setAge(int age) {
       this.age = age;
   }
}

Остальная часть настройки останется такой же, как и в предыдущем примере, теперь, если вы запустите приложение, оно даст тот же результат, что мы получили в предыдущем примере.

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

Есть много других валидаторов, которые поставляются по умолчанию со Struts. Общие валидаторы включают валидатор даты, валидатор Regex и валидатор длины строки. Проверьте следующую ссылку для получения более подробной информации Struts — валидаторы на основе XML .

Struts2 — Локализация, интернационализация (i18n)

Интернационализация (i18n) — это процесс планирования и внедрения продуктов и услуг, чтобы их можно было легко адаптировать к конкретным местным языкам и культурам, процесс, называемый локализацией. Процесс интернационализации называется переводом или возможностью локализации.

Интернационализация сокращена i18n, потому что слово начинается с буквы «i» и заканчивается «n» , а между первым i и последним n есть 18 символов.

Struts2 обеспечивает локализацию, т. Е. Поддержку интернационализации (i18n) через пакеты ресурсов, перехватчики и библиотеки тегов в следующих местах:

  • Теги пользовательского интерфейса

  • Сообщения и ошибки.

  • В рамках действий классов.

Теги пользовательского интерфейса

Сообщения и ошибки.

В рамках действий классов.

Ресурсы

Struts2 использует пакеты ресурсов для предоставления пользователям веб-приложения нескольких вариантов языка и локали. Вам не нужно беспокоиться о написании страниц на разных языках. Все, что вам нужно сделать, это создать пакет ресурсов для каждого языка, который вы хотите. Пакеты ресурсов будут содержать заголовки, сообщения и другой текст на языке вашего пользователя. Пакеты ресурсов — это файл, который содержит пары ключ / значение для языка приложения по умолчанию.

Самый простой формат именования для файла ресурсов —

bundlename_language_country.properties

Здесь, bundlename может быть ActionClass, Interface, SuperClass, Model, Package, Глобальными свойствами ресурса. Следующая часть language_country представляет языковой стандарт страны, например, испанский (Испания) языковой стандарт представлен es_ES, а английский (США) языковой стандарт представлен en_US и т. Д., Где вы можете пропустить часть страны, которая является необязательной.

Когда вы ссылаетесь на элемент сообщения по его ключу, платформа Struts ищет соответствующий пакет сообщений в следующем порядке:

  • ActionClass.properties
  • Interface.properties
  • SuperClass.properties
  • model.properties
  • package.properties
  • struts.properties
  • global.properties

Чтобы разработать приложение на нескольких языках, вы должны поддерживать несколько файлов свойств, соответствующих этим языкам / языковым настройкам, и определять все содержимое в терминах пар ключ / значение.

Например, если вы собираетесь разрабатывать приложение для английского (по умолчанию), испанского и французского языков для США, вам потребуется создать три файла свойств. Здесь я буду использовать только файл global.properties , вы также можете использовать разные файлы свойств для разделения сообщений различного типа.

  • global.properties — по умолчанию будет применяться английский (США)

  • global_fr.properties — это будет использоваться для локали франш .

  • global_es.properties — это будет использоваться для испанской локали.

global.properties — по умолчанию будет применяться английский (США)

global_fr.properties — это будет использоваться для локали франш .

global_es.properties — это будет использоваться для испанской локали.

Доступ к сообщениям

Существует несколько способов доступа к ресурсам сообщений, включая getText, текстовый тег, ключевой атрибут тегов пользовательского интерфейса и тег i18n. Давайте посмотрим на них вкратце —

Чтобы отобразить текст i18n , используйте вызов getText в теге свойства или любой другой тег, например теги пользовательского интерфейса, следующим образом:

<s:property value = "getText('some.key')" />

Текстовый тег извлекает сообщение из пакета ресурсов по умолчанию, т.е. struts.properties

<s:text name = "some.key" />

Тег i18n помещает произвольный пакет ресурсов в стек значений. Другие теги в области тега i18n могут отображать сообщения из этого пакета ресурсов.

<s:i18n name = "some.package.bundle">
   <s:text name = "some.key" />
</s:i18n>

Ключевой атрибут большинства тегов пользовательского интерфейса можно использовать для создания сообщения из пакета ресурсов —

<s:textfield key = "some.key" name = "textfieldName"/>

Пример локализации

Давайте нацелимся на создание index.jsp из предыдущей главы на нескольких языках. Этот же файл будет записан следующим образом —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form with Multilingual Support</title>
   </head>

   <body>
      <h1><s:text name = "global.heading"/></h1>

      <s:url id = "indexEN" namespace="/" action = "locale" >
         <s:param name = "request_locale" >en</s:param>
      </s:url>
      
      <s:url id = "indexES" namespace="/" action = "locale" >
         <s:param name = "request_locale" >es</s:param>
      </s:url>
      
      <s:url id = "indexFR" namespace="/" action = "locale" >
         <s:param name = "request_locale" >fr</s:param>
      </s:url>

      <s:a href="%{indexEN}" >English</s:a>
      <s:a href="%{indexES}" >Spanish</s:a>
      <s:a href="%{indexFR}" >France</s:a>

      <s:form action = "empinfo" method = "post" namespace = "/">
         <s:textfield name = "name" key = "global.name" size = "20" />
         <s:textfield name = "age" key = "global.age" size = "20" />
         <s:submit name = "submit" key = "global.submit" />
      </s:form>

   </body>
</html>

Мы создадим файл success.jsp, который будет вызываться в случае, если определенное действие вернет SUCCESS .

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      <s:property value = "getText('global.success')" />
   </body>
</html>

Здесь нам нужно создать следующие два действия. (a) Первое действие a, чтобы позаботиться о Locale и отобразить тот же файл index.jsp на другом языке (b) Другое действие — позаботиться о отправке самой формы. Оба действия вернут УСПЕХ, но мы предпримем разные действия, основанные на возвращаемых значениях, потому что наша цель различна для обоих действий

Действие, чтобы заботиться о Locale

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Locale extends ActionSupport {
   public String execute() {
       return SUCCESS;
   }
}

Действие для отправки формы

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public int getAge() {
      return age;
   }
   
   public void setAge(int age) {
      this.age = age;
   }
}

Теперь давайте создадим следующие три файла global.properties и поместим их в CLASSPATH:

global.properties

global.name = Name
global.age = Age
global.submit = Submit
global.heading = Select Locale
global.success = Successfully authenticated

global_fr.properties

global.name = Nom d'utilisateur 
global.age = l'âge
global.submit = Soumettre des
global.heading = Sé lectionnez Local
global.success = Authentifi	é  avec succès

global_es.properties

global.name = Nombre de usuario
global.age = Edad
global.submit = Presentar
global.heading = seleccionar la configuracion regional
global.success = Autenticado correctamente

Мы создадим наш struts.xml двумя действиями следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.custom.i18n.resources" value = "global" />
   <package name = "helloworld" extends = "struts-default" namespace="/">
      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>
      
      <action name = "locale" 
         class = "com.tutorialspoint.struts2.Locale"
         method = "execute">
         <result name = "success">/index.jsp</result>
      </action>
   </package>

</struts>

Ниже приводится содержание файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Английский выход

Теперь выберите любой из языков, скажем, мы выбираем испанский , он будет отображать следующий результат —

Испанский выход

Вы можете попробовать и с французским языком. Наконец, давайте попробуем нажать кнопку « Отправить» , когда мы в испанской локали, появится следующий экран —

Испанский успех

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

Struts 2 — Преобразование типов

Все в HTTP-запросе рассматривается протоколом как строка . Это включает в себя числа, логические, целые числа, даты, десятичные дроби и все остальное. Однако в классе Struts вы можете иметь свойства любых типов данных.

Как Struts автоматически связывает свойства для вас?

Struts использует различные преобразователи типов под крышками для выполнения тяжелых работ.

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

Если вы используете какой-либо из перечисленных ниже преобразователей, вам не о чем беспокоиться —

  • Целое число, число с плавающей запятой, двойное число, десятичное число
  • Дата и дата и время
  • Массивы и Коллекции
  • Перечисления
  • логический
  • BigDecimal

Иногда, когда вы используете свой собственный тип данных, необходимо добавить свои собственные конвертеры, чтобы Struts знал, как конвертировать эти значения перед отображением. Рассмотрим следующий класс POJO Environment.java .

package com.tutorialspoint.struts2;

public class Environment {
   private String name;
   
   public  Environment(String name) {
      this.name = name;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
}

Это очень простой класс с атрибутом name , поэтому в этом классе нет ничего особенного. Давайте создадим еще один класс, который содержит информацию о системе — SystemDetails.java .

Для целей этого упражнения я жестко закодировал среду «Разработка», а операционную систему — «Windows XP SP3».

В проекте реального времени вы получите эту информацию из конфигурации системы.

Давайте иметь следующий класс действий —

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

public class SystemDetails extends ActionSupport {
   private Environment environment = new Environment("Development");
   private String operatingSystem = "Windows XP SP3";

   public String execute() {
      return SUCCESS;
   }
   
   public Environment getEnvironment() {
      return environment;
   }
   
   public void setEnvironment(Environment environment) {
      this.environment = environment;
   }
   
   public String getOperatingSystem() {
      return operatingSystem;
   }
   
   public void setOperatingSystem(String operatingSystem) {
      this.operatingSystem = operatingSystem;
   }
}

Далее, давайте создадим простой файл JSP System.jsp для отображения информации о среде и операционной системе.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>System Details</title>
   </head>
   
   <body>
      Environment: <s:property value = "environment"/><br/>
      Operating System:<s:property value = "operatingSystem"/>
   </body>
</html>

Давайте свяжем вместе system.jsp и класс SystemDetails.java, используя struts.xml .

Класс SystemDetails имеет простой метод execute (), который возвращает строку « SUCCESS ».

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      
      <action name = "system" 
            class = "com.tutorialspoint.struts2.SystemDetails" 
            method = "execute">
         <result name = "success">/System.jsp</result>
      </action>
   </package>
</struts>
  • Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War».

  • Затем разверните эту WAR в каталоге веб-приложений Tomcat.

  • Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / system.action . Это создаст следующий экран —

Щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War».

Затем разверните эту WAR в каталоге веб-приложений Tomcat.

Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / system.action . Это создаст следующий экран —

Системная информация

Что не так с приведенным выше выводом? Struts знает, как отобразить и преобразовать строку «Windows XP SP3» и другие встроенные типы данных, но он не знает, что делать со свойством типа Environment . Он просто вызывается методом toString () в классе

Чтобы решить эту проблему, давайте теперь создадим и зарегистрируем простой TypeConverter для класса Environment.

Создайте класс с именем EnvironmentConverter.java со следующим.

package com.tutorialspoint.struts2;

import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;

public class EnvironmentConverter extends StrutsTypeConverter {
   @Override
   public Object convertFromString(Map context, String[] values, Class clazz) {
      Environment env = new Environment(values[0]);
      return env;
   }

   @Override
   public String convertToString(Map context, Object value) {
      Environment env  = (Environment) value;
      return env == null ? null : env.getName();
   }	
}

EnvironmentConverter расширяет класс StrutsTypeConverter и сообщает Struts, как преобразовать Environment в String, и наоборот, переопределив два метода convertFromString () и convertToString () .

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

Если конвертер будет использоваться только в определенном действии, вам нужно будет создать файл свойств, который должен быть назван ‘[action-class]’ spoktion.properties .

В нашем случае мы создаем файл с именем SystemDetails-converstion.properties со следующей регистрационной записью —

environment = com.tutorialspoint.struts2.EnvironmentConverter

В приведенном выше примере «environment» — это имя свойства в классе SystemDetails.java, и мы говорим Struts использовать EnvironmentConverter для преобразования в это свойство и из него.

Однако мы не собираемся этого делать, вместо этого мы собираемся зарегистрировать этот конвертер глобально, чтобы его можно было использовать во всем приложении. Для этого создайте файл свойств с именем xwork-conversion.properties в папке WEBINF / classes со следующей строкой

com.tutorialspoint.struts2.Environment = \
   com.tutorialspoint.struts2.EnvironmentConverter

Это просто регистрирует конвертер глобально, так что Struts может автоматически выполнять конвертацию каждый раз, когда сталкивается с объектом типа Environment. Теперь, если вы перекомпилируете и перезапустите программу, вы получите лучший результат следующим образом:

Системная информация

Очевидно, что теперь результат будет лучше, что означает, что наш конвертер Struts работает нормально.

Таким образом, вы можете создать несколько конвертеров и зарегистрировать их для использования в соответствии с вашими требованиями.

Struts 2 — Темы и шаблоны

Перед тем, как приступить к изучению этой главы, давайте рассмотрим несколько определений, заданных https://struts.apache.org

Sr.No Срок и описание
1

ТЕГ

Небольшой фрагмент кода, выполняемый из JSP, FreeMarker или Velocity.

2

ШАБЛОН

Часть кода, обычно написанная на FreeMarker, которая может быть отображена с помощью определенных тегов (тегов HTML).

3

ТЕМЫ

Коллекция шаблонов, упакованных вместе, чтобы обеспечить общую функциональность.

ТЕГ

Небольшой фрагмент кода, выполняемый из JSP, FreeMarker или Velocity.

ШАБЛОН

Часть кода, обычно написанная на FreeMarker, которая может быть отображена с помощью определенных тегов (тегов HTML).

ТЕМЫ

Коллекция шаблонов, упакованных вместе, чтобы обеспечить общую функциональность.

Я также предложил бы пройтись по главе « Локализация Struts2», потому что мы возьмем тот же пример еще раз для выполнения нашего упражнения.

При использовании тега Struts 2, такого как <s: submit …>, <s: textfield …> и т. Д., На веб-странице среда Struts 2 генерирует HTML-код с предварительно настроенным стилем и макетом. Struts 2 поставляется с тремя встроенными темами —

Sr.No Тема и описание
1

ПРОСТАЯ тема

Минимальная тема без «наворотов». Например, тег textfield отображает тег HTML <input /> без метки, проверки, сообщения об ошибках или любого другого форматирования или функциональности.

2

Тема XHTML

Это тема по умолчанию, используемая в Struts 2, и предоставляет все основы, которые предоставляет эта простая тема, и добавляет несколько функций, таких как стандартная разметка таблицы из двух столбцов для HTML, метки для каждого из HTML, проверка и отчеты об ошибках и т. Д.

3

CSS_XHTML тема

Эта тема предоставляет все основы, которые предоставляет простая тема, и добавляет несколько функций, таких как стандартный двухколонный макет на основе CSS, с использованием <div> для тегов HTML Struts, надписей для каждого из тегов HTML Struts, размещенных в соответствии с таблицей стилей CSS. ,

ПРОСТАЯ тема

Минимальная тема без «наворотов». Например, тег textfield отображает тег HTML <input /> без метки, проверки, сообщения об ошибках или любого другого форматирования или функциональности.

Тема XHTML

Это тема по умолчанию, используемая в Struts 2, и предоставляет все основы, которые предоставляет эта простая тема, и добавляет несколько функций, таких как стандартная разметка таблицы из двух столбцов для HTML, метки для каждого из HTML, проверка и отчеты об ошибках и т. Д.

CSS_XHTML тема

Эта тема предоставляет все основы, которые предоставляет простая тема, и добавляет несколько функций, таких как стандартный двухколонный макет на основе CSS, с использованием <div> для тегов HTML Struts, надписей для каждого из тегов HTML Struts, размещенных в соответствии с таблицей стилей CSS. ,

Как упоминалось выше, если вы не укажете тему, Struts 2 по умолчанию будет использовать тему xhtml. Например, этот тег выбора Struts 2 —

<s:textfield name = "name" label = "Name" />

генерирует следующую разметку HTML —

<tr>

   <td class="tdLabel">
      <label for = "empinfo_name" class="label">Name:</label>
   </td>
   <td>
      <input type = "text" name = "name" value = "" id = "empinfo_name"/>
   </td>

</tr>

Здесь empinfo — это имя действия, определенное в файле struts.xml.

Выбор Темы

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

  • Атрибут темы по определенному тегу

  • Атрибут темы в теге формы тега

  • Атрибут области страницы с именем «тема»

  • Атрибут области запроса с именем «тема»

  • Атрибут области сеанса с именем «тема»

  • Атрибут области приложения с именем «тема»

  • Свойство struts.ui.theme в struts.properties (по умолчанию — xhtml)

Атрибут темы по определенному тегу

Атрибут темы в теге формы тега

Атрибут области страницы с именем «тема»

Атрибут области запроса с именем «тема»

Атрибут области сеанса с именем «тема»

Атрибут области приложения с именем «тема»

Свойство struts.ui.theme в struts.properties (по умолчанию — xhtml)

Ниже приведен синтаксис для их указания на уровне тегов, если вы хотите использовать разные темы для разных тегов.

<s:textfield name = "name" label = "Name" theme="xhtml"/>

Поскольку использовать темы для каждого тега не очень практично, мы просто можем указать правило в файле struts.properties, используя следующие теги:

# Standard UI theme
struts.ui.theme = xhtml
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix = ftl

Ниже приведен результат, который мы выбрали из главы по локализации, где мы использовали тему по умолчанию с параметром struts.ui.theme = xhtml в файле struts-default.properties, который по умолчанию поставляется в файле struts2-core.xy.z.jar.

Английский выход

Как работает тема?

Для данной темы каждый тег Struts имеет связанный шаблон, такой как s: textfield → text.ftl и s: password → password.ftl и т. Д.

Эти файлы шаблонов упакованы в файл struts2-core.xy.z.jar. Эти файлы шаблонов сохраняют предопределенную разметку HTML для каждого тега.

Таким образом, среда Struts 2 генерирует окончательный код HTML-разметки, используя теги Sturts и связанные шаблоны.

Struts 2 tags + Associated template file = Final HTML markup code.

Шаблоны по умолчанию написаны во FreeMarker и имеют расширение .ftl .

Вы также можете создавать свои шаблоны, используя скорость или JSP, и соответственно устанавливать конфигурацию в struts.properties, используя struts.ui.templateSuffix и struts.ui.templateDir .

Создание новых тем

Самый простой способ создать новую тему — скопировать любую из существующих файлов темы / шаблона и внести необходимые изменения.

Давайте начнем с создания папки с именем template в WebContent / WEBINF / classes и подпапки с названием нашей новой темы. Например, WebContent / WEB-INF / classes / template / mytheme .

Отсюда вы можете начать создавать шаблоны с нуля, или вы также можете скопировать шаблоны из дистрибутива Struts2, где вы можете изменить их при необходимости в будущем.

Мы собираемся изменить существующий шаблон по умолчанию xhtml для целей обучения. Теперь давайте скопируем содержимое из struts2-core-xyzjar / template / xhtml в наш каталог тем и изменим только файл WebContent / WEBINF / classes / template / mytheme / control .ftl. Когда мы откроем control.ftl, который будет иметь следующие строки —

<table class="${parameters.cssClass?default('wwFormTable')?html}"<#rt/>
<#if parameters.cssStyle??> style="${parameters.cssStyle?html}"<#rt/>
</#if>
>

Давайте изменим вышеуказанный файл control.ftl, чтобы иметь следующий контент —

<table style = "border:1px solid black;">

Если вы проверите form.ftl, то обнаружите, что в этом файле используется control.ftl , но form.ftl ссылается на этот файл из темы xhtml. Итак, давайте изменим это следующим образом —

<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
<#include "/${parameters.templateDir}/simple/form-common.ftl" />
<#if (parameters.validate?default(false))>
   onreset = "${parameters.onreset?default('clearErrorMessages(this);\
   clearErrorLabels(this);')}"
   
<#else>
   <#if parameters.onreset??>
      onreset="${parameters.onreset?html}"
   </#if>
</#if>
#include "/${parameters.templateDir}/mytheme/control.ftl" />

Я предполагаю, что у вас не было бы большого понимания языка шаблонов FreeMarker , но вы можете получить хорошее представление о том, что нужно сделать, посмотрев на файлы .ftl.

Однако давайте сохраним указанные выше изменения и вернемся к нашему примеру локализации и создайте файл WebContent / WEB-INF / classes / struts.properties со следующим содержимым

# Customized them
struts.ui.theme = mytheme
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the template type to ftl.
struts.ui.templateSuffix = ftl

Теперь после этого изменения щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 . Это создаст следующий экран —

Тема и Шаблон

Вы можете видеть рамку вокруг компонента формы, которая является результатом изменения, которое мы сделали в нашей теме после копирования его из темы xhtml. Если вы приложите мало усилий для изучения FreeMarker, то вы сможете создавать и изменять свои темы очень легко.

Я надеюсь, что теперь у вас есть общее представление о темах и шаблонах Sturts 2 , не так ли?

Struts 2 — Обработка исключений

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

Struts упрощает обработку исключений за счет использования перехватчика «исключений». Перехватчик «исключений» включен как часть стека по умолчанию, поэтому вам не нужно ничего делать для его настройки. Он доступен из коробки и готов к использованию.

Давайте посмотрим на простой пример Hello World с некоторыми изменениями в файле HelloWorldAction.java. Здесь мы сознательно ввели исключение NullPointer в наш код действия HelloWorldAction .

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute(){
      String x = null;
      x = x.substring(0);
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Давайте сохраним содержимое HelloWorld.jsp следующим образом:

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Ниже приводится содержание index.jsp

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Ваш struts.xml должен выглядеть так:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
     
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Привет Мир Ввод

Введите значение «Struts2» и отправьте страницу. Вы должны увидеть следующую страницу —

Выход исключения

Как показано в приведенном выше примере, перехватчик исключений по умолчанию отлично справляется с обработкой исключений.

Давайте теперь создадим отдельную страницу ошибок для нашего исключения. Создайте файл с именем Error.jsp со следующим содержимым —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title></title>
   </head>
   
   <body>
      This is my custom error page
   </body>
</html>

Теперь давайте настроим Struts для использования этой страницы с ошибкой в ​​случае исключения. Давайте изменим struts.xml следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
   
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>

Как показано в примере выше, теперь мы настроили Struts для использования выделенного Error.jsp для исключения NullPointerException. Если вы перезапустите программу сейчас, вы увидите следующий вывод:

Hello World Output

В дополнение к этому, инфраструктура Struts2 поставляется с перехватчиком «регистрации» для регистрации исключений. Позволяя регистратору регистрировать необработанные исключения, мы можем легко посмотреть трассировку стека и выяснить, что пошло не так

Глобальные сопоставления исключений

Мы видели, как мы можем обрабатывать конкретные действия исключений. Мы можем установить глобальное исключение, которое будет применяться ко всем действиям. Например, чтобы перехватить те же исключения NullPointerException, мы могли бы добавить тег <global-exception-mappings …> внутри тега <package …>, а его тег <result …> должен быть добавлен внутри тега <action .. .> тег в файле struts.xml следующим образом —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <global-exception-mappings>
         <exception-mapping exception = "java.lang.NullPointerException"
         result = "error" />
      </global-exception-mappings>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/Error.jsp</result>
      </action>

   </package>
</struts>

Struts 2 — Аннотации

Как упоминалось ранее, Struts предоставляет две формы конфигурации. Традиционным способом является использование файла struts.xml для всех конфигураций. Мы уже видели так много примеров в этом уроке. Другой способ настройки Struts — использование функции аннотаций Java 5. Используя аннотации стоек, мы можем достичь нулевой конфигурации .

Чтобы начать использовать аннотации в своем проекте, убедитесь, что в папку WebContent / WEB-INF / lib включены следующие файлы jar —

  • struts2 конвенционные-плагин-xyzjar
  • ASM-xyjar
  • ANTLR-xyzjar
  • Обще-FileUpload-xyzjar
  • Обще-ю-xyzjar
  • Обще-Ланг-xyjar
  • Обще-каротаж xyzjar
  • Обще-каротаж апи-xyjar
  • FreeMarker-xyzjar
  • javassist-.xy.z.GA
  • OGNL-xyzjar
  • struts2-ядро-xyzjar
  • xwork-core.xyzjar

Теперь давайте посмотрим, как можно покончить с конфигурацией, доступной в файле struts.xml, и заменить ее аннотациями.

Чтобы объяснить концепцию аннотации в Struts2, мы должны были бы пересмотреть наш пример проверки, описанный в главе Struts2 Validations .

Здесь мы возьмем пример сотрудника, чье имя и возраст будут записаны с помощью простой страницы, и мы поставим две проверки, чтобы убедиться, что ÜSER всегда вводит имя, а возраст должен быть между 28 и 65.

Давайте начнем с главной страницы JSP примера.

Создать главную страницу

Давайте напишем файл JSP главной страницы index.jsp , который используется для сбора информации о сотрудниках, упомянутой выше.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form</title>
   </head>

   <body>
      
      <s:form action = "empinfo" method = "post">
         <s:textfield name = "name" label = "Name" size = "20" />
         <s:textfield name = "age" label = "Age" size = "20" />
         <s:submit name = "submit" label = "Submit" align="center" />
      </s:form>

   </body>
</html>

Index.jsp использует тег Struts, который мы еще не рассмотрели, но мы изучим их в главах, связанных с тегами. Но пока предположим, что тег s: textfield печатает поле ввода, а s: submit печатает кнопку отправки. Мы использовали свойство label для каждого тега, которое создает ярлык для каждого тега.

Создать представления

Мы будем использовать файл JSP success.jsp, который будет вызываться в случае, если определенное действие возвращает SUCCESS .

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      Employee Information is captured successfully.
   </body>
</html>

Создать действие

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

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.validator.annotations.*;

@Results({
   @Result(name = "success", Location = "/success.jsp"),
   @Result(name = "input", Location = "/index.jsp")
})
public class Employee extends ActionSupport {
   private String name;
   private int age;

   @Action(value = "/empinfo")
   
   public String execute() {
      return SUCCESS;
   }

   @RequiredFieldValidator( message = "The name is required" )
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }

   @IntRangeFieldValidator(message = "Age must be in between 28 and 65", min = "29", max = "65")
   
   public int getAge() {
      return age;
   }
   
   public void setAge(int age) {
      this.age = age;
   }
}

Мы использовали несколько аннотаций в этом примере. Позвольте мне пройти их один за другим —

  • Во-первых, мы включили аннотацию результатов . Аннотация результатов представляет собой набор результатов.

  • Под аннотацией результатов у нас есть две аннотации результата. У аннотаций результата есть имя, которое соответствует результату метода execute. Они также содержат местоположение относительно того, какое представление должно обслуживаться в соответствии с возвращаемым значением execute ().

  • Следующая аннотация — это аннотация действия . Это используется для украшения метода execute (). Метод Action также принимает значение, представляющее собой URL-адрес, по которому вызывается действие.

  • Наконец, я использовал две аннотации проверки . Я настроил обязательный валидатор поля в поле имени и валидатор целочисленного диапазона в поле возраста . Я также указал пользовательское сообщение для проверок.

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

Под аннотацией результатов у нас есть две аннотации результата. У аннотаций результата есть имя, которое соответствует результату метода execute. Они также содержат местоположение относительно того, какое представление должно обслуживаться в соответствии с возвращаемым значением execute ().

Следующая аннотация — это аннотация действия . Это используется для украшения метода execute (). Метод Action также принимает значение, представляющее собой URL-адрес, по которому вызывается действие.

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

Конфигурационные файлы

Нам действительно не нужен файл конфигурации struts.xml , поэтому давайте удалим этот файл и проверим содержимое файла web.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
      
      <init-param>
         <param-name>struts.devMode</param-name>
         <param-value>true</param-value>
      </init-param>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран —

Ввод пользователя по электронной почте

Теперь не вводите необходимую информацию, просто нажмите кнопку « Отправить» . Вы увидите следующий результат —

ошибка

Введите необходимую информацию, но введите неправильное поле From, допустим, что имя называется «test», а возраст — 30, и, наконец, нажмите кнопку « Отправить» . Вы увидите следующий результат —

успех

Struts 2 Типы аннотаций

Приложения Struts 2 могут использовать аннотации Java 5 в качестве альтернативы конфигурации свойств XML и Java. Вы можете проверить список наиболее важных аннотаций, связанных с различными категориями —

Struts 2 Аннотации Типы .

Struts 2 — управляющие теги

Теги Struts 2 имеют набор тегов, который позволяет легко контролировать ход выполнения страницы.

Ниже приведен список важных тегов управления Struts 2 —

Теги If и Else

Эти теги выполняют основные условия потока на каждом языке.

Тег ‘If’ используется сам по себе или с тегом ‘Else If’ и / или одиночным / множественным тегом ‘Else’, как показано ниже —

<s:if test = "%{false}">
   <div>Will Not Be Executed</div>
</s:if>

<s:elseif test = "%{true}">
   <div>Will Be Executed</div>
</s:elseif>

<s:else>
   <div>Will Not Be Executed</div>
</s:else>

Проверьте подробный пример

Теги Итератора

Этот итератор будет перебирать значение. Итерируемое значение может быть либо файлом itherjava.util.Collection, либо файлом java.util.Iterator. Выполняя итерацию по итератору, вы можете использовать тег Sort для сортировки результата или тег SubSet для получения подмножества списка или массива.

В следующем примере извлекается значение метода getDays () текущего объекта в стеке значений и используется для его повторения.

Тег <s: property /> выводит текущее значение итератора.

<s:iterator value = "days">
   <p>day is: <s:property/></p>
</s:iterator>

Проверьте подробный пример

Тег слияния

Эти теги слияния принимают два или более списков в качестве параметров и объединяют их все вместе, как показано ниже —

<s:merge var = "myMergedIterator">
   <s:param value = "%{myList1}" />
   <s:param value = "%{myList2}" />
   <s:param value = "%{myList3}" />
</s:merge>

<s:iterator value = "%{#myMergedIterator}">
   <s:property />
</s:iterator>

Проверьте подробный пример

Тег добавления

Эти теги добавления принимают два или более списков в качестве параметров и добавляют их все вместе, как показано ниже —

<s:append var = "myAppendIterator">
   <s:param value = "%{myList1}" />
   <s:param value = "%{myList2}" />
   <s:param value = "%{myList3}" />
</s:append>

<s:iterator value = "%{#myAppendIterator}">
   <s:property />
</s:iterator>

Проверьте подробный пример

Тег генератора

Эти теги генератора генерируют итератор на основе предоставленного атрибута val. Следующий тег генератора генерирует итератор и распечатывает его, используя тег итератора.

<s:generator val = "%{'aaa,bbb,ccc,ddd,eee'}">
   <s:iterator>
      <s:property /><br/>
   </s:iterator>
</s:generator>

Проверьте подробный пример

Struts 2 — Теги данных

Теги данных Struts 2 в основном используются для манипулирования данными, отображаемыми на странице. Ниже перечислены важные теги данных: <Начать здесь>

Тег Действия

Этот тег позволяет разработчикам вызывать действия непосредственно со страницы JSP, указав имя действия и необязательное пространство имен. Содержимое тела тега используется для отображения результатов действия. Любой обработчик результатов, определенный для этого действия в struts.xml, будет игнорироваться, если не указан параметр executeResult.

<div>Tag to execute the action</div>
<br />
<s:action name = "actionTagAction" executeresult = "true" />
<br />
<div>To invokes special method  in action class</div>
<br />
<s:action name = "actionTagAction!specialMethod" executeresult = "true" />

Проверьте подробный пример

Включить тег

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

<-- First Syntax -->
<s:include value = "myJsp.jsp" />

<-- Second Syntax -->
<s:include value = "myJsp.jsp">
   <s:param name = "param1" value = "value2" />
   <s:param name = "param2" value = "value2" />
</s:include>

<-- Third Syntax -->
<s:include value = "myJsp.jsp">
   <s:param name = "param1">value1</s:param>
   <s:param name = "param2">value2</s:param>
</s:include>

Проверьте подробный пример

Бобовый тег

Этот тег bean создает экземпляр класса, который соответствует спецификации JavaBeans. Этот тег имеет тело, которое может содержать несколько элементов Param для установки любых методов мутатора в этом классе. Если для переменной BeanTag установлен атрибут var, он поместит созданный экземпляр компонента в контекст стека.

<s:bean name = "org.apache.struts2.util.Counter" var = "counter">
   <s:param name = "first" value = "20"/>
   <s:param name = "last" value = "25" />
</s:bean>

Проверьте подробный пример

Тег даты

Эти теги даты позволят вам быстро и легко отформатировать дату. Вы можете указать пользовательский формат (например, «дд / мм / гггг чч: мм»), вы можете генерировать легко читаемые нотации (например, «через 2 часа, 14 минут»), или вы можете просто вернуться к предварительно определенному формату с помощью ключ ‘struts.date.format’ в вашем файле свойств.

<s:date name = "person.birthday" format = "dd/MM/yyyy" />
<s:date name = "person.birthday" format = "%{getText('some.i18n.key')}" />
<s:date name = "person.birthday" nice="true" />
<s:date name = "person.birthday" />

Проверьте подробный пример

Тег Param

Эти параметры тега могут использоваться для параметризации других тегов. Этот тег имеет следующие два параметра.

  • name (String) — имя параметра

  • значение (объект) — значение параметра

name (String) — имя параметра

значение (объект) — значение параметра

<pre>
   <ui:component>
      <ui:param name = "key"     value = "[0]"/>
      <ui:param name = "value"   value = "[1]"/>
      <ui:param name = "context" value = "[2]"/>
   </ui:component>
</pre>

Проверьте подробный пример

Тег недвижимости

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

<s:push value = "myBean">
   <!-- Example 1: -->
   <s:property value = "myBeanProperty" />

   <!-- Example 2: -->TextUtils
   <s:property value = "myBeanProperty" default = "a default value" />
</s:push>

Проверьте подробный пример

Пуш Тэг

Эти push- теги используются для размещения значений в стеке для упрощенного использования.

<s:push value = "user">
   <s:propery value = "firstName" />
   <s:propery value = "lastName" />
</s:push>

Проверьте подробный пример

Набор тегов

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

<s:set name = "myenv" value = "environment.name"/>
<s:property value = "myenv"/>

Проверьте подробный пример

Текстовый тег

Эти текстовые теги используются для визуализации текстового сообщения I18n.

<!-- First Example -->
<s:i18n name = "struts.action.test.i18n.Shop">
   <s:text name = "main.title"/>
</s:i18n>

<!-- Second Example -->
<s:text name = "main.title" />

<!-- Third Examlpe -->
<s:text name = "i18n.label.greetings">
   <s:param >Mr Smith</s:param>
</s:text>

Проверьте подробный пример

Тег URL

Эти URL- теги используются для создания URL.

<-- Example 1 -->
<s:url value = "editGadget.action">
   <s:param name = "id" value = "%{selected}" />
</s:url>

<-- Example 2 -->
<s:url action = "editGadget">
   <s:param name = "id" value = "%{selected}" />
</s:url>

<-- Example 3-->
<s:url includeParams="get">
   <s:param name = "id" value = "%{'22'}" />
</s:url>

Проверьте подробный пример

Struts 2 — Форма Метки

Список тегов формы является подмножеством тегов пользовательского интерфейса Struts. Эти теги помогают отображать пользовательский интерфейс, необходимый для веб-приложений Struts, и их можно разделить на три категории. В этой главе вы познакомитесь со всеми тремя типами тегов пользовательского интерфейса.

Простые теги пользовательского интерфейса

Мы уже использовали эти теги в наших примерах, мы их почистим в этой главе. Давайте посмотрим простую страницу просмотра email.jsp с несколькими простыми тегами пользовательского интерфейса —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <s:head/>
      <title>Hello World</title>
   </head>
   
   <body>
      <s:div>Email Form</s:div>
      <s:text name = "Please fill in the form below:" />
      
      <s:form action = "hello" method = "post" enctype = "multipart/form-data">
         <s:hidden name = "secret" value = "abracadabra"/>
         <s:textfield key = "email.from" name = "from" />
         <s:password key = "email.password" name = "password" />
         <s:textfield key = "email.to" name = "to" />
         <s:textfield key = "email.subject" name = "subject" />
         <s:textarea key = "email.body" name = "email.body" />
         <s:label for = "attachment" value = "Attachment"/>
         <s:file name = "attachment" accept = "text/html,text/plain" />
         <s:token />
         <s:submit key = "submit" />
      </s:form>
      
   </body>
</html>

Если вам известен HTML, то все используемые теги являются очень распространенными тегами HTML с дополнительным префиксом s: вместе с каждым тегом и различными атрибутами. Когда мы выполняем вышеуказанную программу, мы получаем следующий пользовательский интерфейс при условии, что вы настроили правильное сопоставление для всех используемых ключей.

Struts Простые теги пользовательского интерфейса

Как показано, s: head генерирует элементы JavaScript и таблицы стилей, необходимые для приложения Struts2.

Далее у нас есть элементы s: div и s: text. S: div используется для визуализации HTML-элемента Div. Это полезно для людей, которые не любят смешивать теги HTML и Struts. Для этих людей у ​​них есть выбор использовать s: div для визуализации div.

S: текст, как показано, используется для отображения текста на экране.

Далее у нас есть семейный тег s: form. Тег s: form имеет атрибут action, который определяет, куда отправлять форму. Поскольку у нас есть элемент загрузки файла в форме, мы должны установить enctype в multipart. В противном случае мы можем оставить это поле пустым.

В конце тега формы у нас есть тег s: submit. Это используется для отправки формы. Когда форма отправлена, все значения формы передаются в действие, указанное в теге s: form.

Внутри формы s: у нас есть скрытый атрибут с именем secret. Это делает скрытый элемент в HTML. В нашем случае «секретный» элемент имеет значение «абракадабра». Этот элемент не виден конечному пользователю и используется для переноса состояния из одного представления в другое.

Далее у нас есть теги s: label, s: textfield, s: password и s: textarea. Они используются для отображения метки, поля ввода, пароля и текстовой области соответственно. Мы видели это в действии в примере «Struts — Sending Email».

Здесь важно отметить использование атрибута «ключ». Атрибут «ключ» используется для получения метки для этих элементов управления из файла свойств. Мы уже рассмотрели эту функцию в главе «Интернационализация Struts2».

Затем у нас есть тег s: file, который отображает компонент загрузки входного файла. Этот компонент позволяет пользователю загружать файлы. В этом примере мы использовали параметр «accept» тега s: file, чтобы указать, какие типы файлов могут быть загружены.

Наконец, у нас есть тег s: token. Тег токена генерирует уникальный токен, который используется, чтобы узнать, была ли форма отправлена ​​дважды

Когда форма отображается, скрытая переменная помещается в качестве значения токена. Скажем, например, что токен — это «ABC». Когда эта форма отправляется, Struts Fitler проверяет токен на соответствие токену, сохраненному в сеансе. Если он совпадает, он удаляет токен из сеанса. Теперь, если форма случайно отправлена ​​повторно (путем обновления или нажатия кнопки «Назад» в браузере), форма будет повторно отправлена ​​с «ABC» в качестве токена. В этом случае фильтр снова проверяет токен на токен, сохраненный в сеансе. Но поскольку токен «ABC» был удален из сеанса, он не будет совпадать, и фильтр Struts отклонит запрос.

Теги пользовательского интерфейса группы

Теги пользовательского интерфейса группы используются для создания переключателя и флажка. Давайте посмотрим простую страницу просмотра HelloWorld.jsp с флажками и тегами переключателей —

<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>

<html>
   <head>
      <title>Hello World</title>
      <s:head />
   </head>
   
   <body>
      <s:form action = "hello.action">
         <s:radio label = "Gender" name = "gender" list="{'male','female'}" />
         <s:checkboxlist label = "Hobbies" name = "hobbies"
         list = "{'sports','tv','shopping'}" />
      </s:form>
      
   </body>
</html>

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

Теги пользовательского интерфейса группы Struts

Давайте посмотрим на пример сейчас. В первом примере мы создаем простой переключатель с меткой «Пол». Атрибут name является обязательным для тега переключателя, поэтому мы указываем имя «пол». Затем мы предоставляем список для пола. Список заполняется значениями «мужской» и «женский». Поэтому в выводе мы получаем переключатель с двумя значениями.

Во втором примере мы создаем список флажков. Это собрать хобби пользователя. Пользователь может иметь более одного хобби, и поэтому мы используем флажок вместо радиокнопки. Флажок заполнен списками «Спорт», «Телевизор» и «Покупки». Это представляет хобби в виде списка флажков.

Выберите теги пользовательского интерфейса

Давайте рассмотрим различные варианты тега выбора, предлагаемого Struts. Давайте посмотрим простую страницу просмотра HelloWorld.jsp с выбранными тегами —

<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>

<html>
   <head>
      <title>Hello World</title>
      <s:head />
   </head>
   
   <body>
      <s:form action = "login.action">
         <s:select name = "username" label = "Username"
            list = "{'Mike','John','Smith'}" />

         <s:select label = "Company Office" name = "mySelection"
            value = "%{'America'}" list="%{#{'America':'America'}}">
            <s:optgroup label = "Asia" 
               list = "%{#{'India':'India','China':'China'}}" />
            <s:optgroup label = "Europe"
               list="%{#{'UK':'UK','Sweden':'Sweden','Italy':'Italy'}}" />
         </s:select>

         <s:combobox label = "My Sign" name = "mySign"
            list = "#{'aries':'aries','capricorn':'capricorn'}" headerkey = "-1" 
            headervalue = "--- Please Select ---" emptyOption = "true" value = "capricorn" />
         <s:doubleselect label = "Occupation" name = "occupation"
            list = "{'Technical','Other'}" doublename = "occupations2"
            doubleList="top == 'Technical' ? 
            {'I.T', 'Hardware'} : {'Accounting', 'H.R'}" />
      </s:form>
   </body>
</html>

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

Struts выбирает теги пользовательского интерфейса

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

  • Сначала тег выбора отображает окно выбора HTML. В первом примере мы создаем простое поле выбора с именем «username» и меткой «username». Поле выбора будет заполнено списком, который содержит имена Майка, Джона и Смита.

  • Во втором примере наша компания имеет головные офисы в Америке. У этого также есть глобальные офисы в Азии и Европе. Мы хотим отобразить офисы в окне выбора, но мы хотим сгруппировать глобальные офисы по названию континента. Здесь пригодится optgroup. Мы используем тег s: optgroup для создания новой группы. Мы даем группе ярлык и отдельный список.

  • В третьем примере используется комбинированный список. Поле со списком представляет собой комбинацию поля ввода и поля выбора. Пользователь может выбрать значение из поля выбора, и в этом случае поле ввода автоматически заполняется значением, выбранным пользователем. Если пользователь вводит значение напрямую, никакие значения из поля выбора не будут выбраны.

  • В нашем примере у нас есть выпадающий список со знаками солнца. Поле выбора содержит только четыре записи, позволяющие пользователю ввести свой солнечный знак, если его нет в списке. Мы также добавляем заголовок в поле выбора. Headerentry это тот, который отображается в верхней части окна выбора. В нашем случае мы хотим отобразить «Пожалуйста, выберите». Если пользователь ничего не выбирает, мы принимаем -1 в качестве значения. В некоторых случаях мы не хотим, чтобы пользователь выбирал пустое значение. В этих условиях можно было бы установить для свойства emptyOption значение false. Наконец, в нашем примере мы поставляем «козерог» в качестве значения по умолчанию для выпадающего списка.

  • В четвертом примере у нас есть двойной выбор. Двойной выбор используется, когда вы хотите отобразить два поля выбора. Значение, выбранное в первом окне выбора, определяет, что будет отображаться во втором окне выбора. В нашем примере первое поле выбора отображает «Технические» и «Другие». Если пользователь выберет «Технический», во втором поле выбора мы отобразим «ИТ и оборудование». В противном случае мы будем отображать Бухгалтерский учет и HR. Это возможно, используя атрибуты «list» и «doubleList», как показано в примере.

Сначала тег выбора отображает окно выбора HTML. В первом примере мы создаем простое поле выбора с именем «username» и меткой «username». Поле выбора будет заполнено списком, который содержит имена Майка, Джона и Смита.

Во втором примере наша компания имеет головные офисы в Америке. У этого также есть глобальные офисы в Азии и Европе. Мы хотим отобразить офисы в окне выбора, но мы хотим сгруппировать глобальные офисы по названию континента. Здесь пригодится optgroup. Мы используем тег s: optgroup для создания новой группы. Мы даем группе ярлык и отдельный список.

В третьем примере используется комбинированный список. Поле со списком представляет собой комбинацию поля ввода и поля выбора. Пользователь может выбрать значение из поля выбора, и в этом случае поле ввода автоматически заполняется значением, выбранным пользователем. Если пользователь вводит значение напрямую, никакие значения из поля выбора не будут выбраны.

В нашем примере у нас есть выпадающий список со знаками солнца. Поле выбора содержит только четыре записи, позволяющие пользователю ввести свой солнечный знак, если его нет в списке. Мы также добавляем заголовок в поле выбора. Headerentry это тот, который отображается в верхней части окна выбора. В нашем случае мы хотим отобразить «Пожалуйста, выберите». Если пользователь ничего не выбирает, мы принимаем -1 в качестве значения. В некоторых случаях мы не хотим, чтобы пользователь выбирал пустое значение. В этих условиях можно было бы установить для свойства emptyOption значение false. Наконец, в нашем примере мы поставляем «козерог» в качестве значения по умолчанию для выпадающего списка.

В четвертом примере у нас есть двойной выбор. Двойной выбор используется, когда вы хотите отобразить два поля выбора. Значение, выбранное в первом окне выбора, определяет, что будет отображаться во втором окне выбора. В нашем примере первое поле выбора отображает «Технические» и «Другие». Если пользователь выберет «Технический», во втором поле выбора мы отобразим «ИТ и оборудование». В противном случае мы будем отображать Бухгалтерский учет и HR. Это возможно, используя атрибуты «list» и «doubleList», как показано в примере.

В приведенном выше примере мы провели сравнение, чтобы увидеть, равно ли верхнее поле выбора «Техническое». Если это так, то мы показываем ИТ и оборудование.

Нам также нужно дать имя для верхнего ящика («name = ‘Occupations’) и нижнего ящика (doubleName = ‘профессия2’)

Struts 2 — теги Ajax

Struts использует каркас DOJO для реализации тега AJAX. Прежде всего, чтобы продолжить этот пример, вам нужно добавить struts2-dojo-plugin-2.2.3.jar в ваш путь к классам.

Вы можете получить этот файл из папки lib вашей загрузки struts2 (C: \ struts-2.2.3all \ struts-2.2.3 \ lib \ struts2-dojo-plugin-2.2.3.jar)

Для этой цели давайте изменим HelloWorld.jsp следующим образом:

<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<%@ taglib prefix = "sx" uri = "/struts-dojo-tags"%>

<html>
   <head>
      <title>Hello World</title>
      <s:head />
      <sx:head />
   </head>
   
   <body>
      <s:form>
         <sx:autocompleter label = "Favourite Colour"
            list = "{'red','green','blue'}" />
         <br />
         <sx:datetimepicker name = "deliverydate" label = "Delivery Date"
            displayformat = "dd/MM/yyyy" />
         <br />
         <s:url id = "url" value = "/hello.action" />
         <sx:div href="%{#url}" delay="2000">
            Initial Content
         </sx:div>
         <br/>
         <sx:tabbedpanel id = "tabContainer">
            <sx:div label = "Tab 1">Tab 1</sx:div>
            <sx:div label = "Tab 2">Tab 2</sx:div>
         </sx:tabbedpanel>
      </s:form>
   </body>
</html>

Когда мы запустим приведенный выше пример, мы получим следующий вывод:

Struts Ajax теги

Давайте теперь рассмотрим этот пример по одному шагу за раз.

Первое, на что стоит обратить внимание, это добавление новой библиотеки тегов с префиксом sx. Это (struts-dojo-tags) — библиотека тегов, специально созданная для интеграции ajax.

Затем внутри HTML-заголовка мы вызываем sx: head. Это инициализирует каркас dojo и делает его готовым ко всем вызовам AJAX на странице. Этот шаг важен — ваши вызовы ajax не будут работать без инициализации sx: head.

Сначала у нас есть тег автозаполнения. Тег автозаполнения выглядит почти как поле выбора. Он заполняется значениями красного, зеленого и синего. Но разница между окном выбора и этим заключается в том, что он автоматически завершается. То есть, если вы начнете вводить gr, он заполнит его «зеленым». Кроме этого этот тег очень похож на тег s: select, который мы рассмотрели ранее.

Далее у нас есть выбор даты и времени. Этот тег создает поле ввода с кнопкой рядом с ним. При нажатии кнопки отображается всплывающее окно выбора даты и времени. Когда пользователь выбирает дату, она вводится во входной текст в формате, указанном в атрибуте тега. В нашем примере мы указали dd / MM / yyyy в качестве формата даты.

Затем мы создаем URL-тег для файла system.action, который мы создали в предыдущих упражнениях. Это не должно быть system.action — это может быть любой файл действий, который вы создали ранее. Затем у нас есть div с гиперссылкой на URL и задержкой на 2 секунды. Что произойдет, когда вы запустите это, «Начальное содержимое» будет отображаться в течение 2 секунд, затем содержимое div будет заменено содержимым из выполнения hello.action .

Наконец, у нас есть простая панель вкладок с двумя вкладками. Вкладки делятся на две части с метками Tab 1 и Tab2.

Стоит отметить, что интеграция тегов AJAX в Struts все еще находится в стадии разработки, и зрелость этой интеграции постепенно увеличивается с каждым выпуском.

Struts 2 & Spring Integration

Spring — это популярный веб-фреймворк, обеспечивающий простую интеграцию с множеством общих веб-задач Итак, вопрос в том, зачем нам Spring, когда у нас есть Struts2? Что ж, Spring — это больше, чем MVC-фреймворк — он предлагает множество других полезностей, которые недоступны в Struts.

Например: внедрение зависимости, которое может быть полезно для любой платформы. В этой главе мы рассмотрим простой пример, чтобы увидеть, как интегрировать Spring и Struts2 вместе.

Прежде всего, вам нужно добавить следующие файлы в путь сборки проекта из установки Spring. Вы можете скачать и установить последнюю версию Spring Framework по адресу https://www.springsource.org/download

  • org.springframework.asm-xyzM (а) .jar
  • org.springframework.beans-xyzM (а) .jar
  • org.springframework.context-xyzM (а) .jar
  • org.springframework.core-xyzM (а) .jar
  • org.springframework.expression-xyzM (а) .jar
  • org.springframework.web-xyzM (а) .jar
  • org.springframework.web.servlet-xyzM (а) .jar

Наконец, добавьте struts2-spring-plugin-xyzjar в ваш WEB-INF / lib из вашего каталога Struts lib. Если вы используете Eclipse, то вы можете столкнуться с исключением java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener .

Чтобы решить эту проблему, вам нужно перейти на вкладку « Маркер » и щелкнуть правой кнопкой мыши по зависимостям классов по очереди и выполнить быстрое исправление, чтобы опубликовать / экспортировать все зависимости. Наконец, убедитесь, что на вкладке маркера нет конфликта зависимостей.

Интеграция Struts и Sprint

Теперь давайте настроим web.xml для интеграции Struts-Spring следующим образом:

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
	
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Здесь важно отметить прослушиватель, который мы настроили. ContextLoaderListener требуется для загрузки файла контекста пружины. Конфигурационный файл Spring называется applicationContext.xml, и его нужно размещать на том же уровне, что и файл web.xml.

Давайте создадим простой класс действий с именем User.java с двумя свойствами — firstName и lastName.

package com.tutorialspoint.struts2;

public class User {
   private String firstName;
   private String lastName;

   public String execute() {
      return "success";
   }

   public String getFirstName() {
      return firstName;
   }

   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }

   public String getLastName() {
      return lastName;
   }

   public void setLastName(String lastName) {
      this.lastName = lastName;
   }
}

Теперь давайте создадим весенний конфигурационный файл applicationContext.xml и создадим экземпляр класса User.java . Как упоминалось ранее, этот файл должен находиться в папке WEB-INF —

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <bean id = "userClass" class = "com.tutorialspoint.struts2.User">
      <property name = "firstName" value = "Michael" />
      <property name = "lastName" value = "Jackson" />
   </bean>
</beans>

Как видно выше, мы настроили пользовательский компонент и ввели значения Майкла и Джексона в компонент. Мы также дали этому бину имя «userClass», чтобы мы могли использовать его в другом месте. Теперь давайте создадим User.jsp в папке WebContent —

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2 - Spring integration</h1>

      <s:form>
         <s:textfield name = "firstName" label = "First Name"/><br/>
         <s:textfield name = "lastName" label = "Last Name"/><br/>
      </s:form>
      
   </body>
</html>

Файл User.jsp довольно прост. Он служит только одной цели — отображать значения имени и фамилии объекта пользователя. Наконец, давайте соединим все сущности, используя файл struts.xml .

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "user" class="userClass" 
         method = "execute">
         <result name = "success">/User.jsp</result>
      </action>
   </package>
</struts>

Важно отметить, что мы используем идентификатор userClass для ссылки на класс. Это означает, что мы используем spring для внедрения зависимости для класса User.

Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / User.jsp . Это создаст следующий экран —

Struts и Spring Integration

Теперь мы увидели, как объединить две отличные основы. На этом мы завершаем главу интеграции Struts — Spring.

Struts 2 & Tiles Integration

В этой главе давайте пройдемся по шагам, связанным с интеграцией платформы Tiles со Struts2. Apache Tiles — это шаблонная структура, созданная для упрощения разработки пользовательских интерфейсов веб-приложений.

Прежде всего, нам нужно скачать файлы jar с веб-сайта Apache Tiles . Вам необходимо добавить следующие jar-файлы в путь к классам проекта.

  • плитка-апи-xyzjar
  • плитка-Compat-xyzjar
  • плитка-ядро-xyzjar
  • плитка-xyzjar-JSP
  • плитка-сервлет-xyzjar

В дополнение к вышесказанному, мы должны скопировать следующие файлы jar из загрузки struts2 в ваш WEB-INF / lib .

  • Викисклада BeanUtils-xyzjar
  • Обще-варочного-xyjar
  • Struts2-плитка-плагин-xyzjar

Теперь давайте настроим файл web.xml для интеграции Struts-Tiles, как показано ниже. Здесь следует отметить два важных момента. Во-первых, нам нужно сообщить плиткам , где найти файл конфигурации плиток tile.xml . В нашем случае это будет папка / WEB-INF . Далее нам нужно инициализировать слушатель Tiles, который поставляется с загрузкой Struts2.

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   id = "WebApp_ID" version = "2.5">
   <display-name>Struts2Example15</display-name>
	
   <context-param>
      <param-name>
         org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
      </param-name>
      
      <param-value>
         /WEB-INF/tiles.xml
      </param-value>
   </context-param>

   <listener>
      <listener-class>
         org.apache.struts2.tiles.StrutsTilesListener
      </listener-class>
   </listener>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>

Теперь давайте создадим файл tile.xml в папке / WEB-INF со следующим содержимым:

<?xml version = "1.0" Encoding = "UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC
   "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
   "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

   <definition name = "baseLayout" template="/baseLayout.jsp">
      <put-attribute name = "title"  value = "Template"/>
      <put-attribute name = "banner" value = "/banner.jsp"/>
      <put-attribute name = "menu"   value = "/menu.jsp"/>
      <put-attribute name = "body"   value = "/body.jsp"/>
      <put-attribute name = "footer"   value = "/footer.jsp"/>
   </definition>

   <definition name = "tiger" extends = "baseLayout">
      <put-attribute name = "title"  value = "Tiger"/>
      <put-attribute name = "body"   value = "/tiger.jsp"/>      
   </definition>

   <definition name = "lion" extends = "baseLayout">
      <put-attribute name = "title"  value = "Lion"/>
      <put-attribute name = "body"   value = "/lion.jsp"/>      
   </definition>
  
</tiles-definitions>

Далее мы определяем базовый макет скелета в baseLayout.jsp . Он имеет пять областей многократного использования. А именно заголовок, баннер, меню, тело и нижний колонтитул . Мы предоставляем значения по умолчанию для baseLayout, а затем создаем две настройки, которые расширяются от макета по умолчанию. Макет тигра аналогичен базовому макету, за исключением того, что он использует tiger.jsp в качестве основного текста и текст «Тигр» в качестве заголовка. Аналогично, макет Lion похож на базовый макет, за исключением того, что он использует lion.jsp в качестве основного текста и текст «Lion» в качестве заголовка.

Давайте посмотрим на отдельные файлы JSP. Ниже приводится содержимое файла baseLayout.jsp

<%@ taglib uri = "http://tiles.apache.org/tags-tiles" prefix = "tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset = UTF-8">
      <title>
         <tiles:insertAttribute name = "title" ignore="true" />
      </title>
   </head>

   <body>
      <tiles:insertAttribute name = "banner" /><br/>
      <hr/>
      <tiles:insertAttribute name = "menu" /><br/>
      <hr/>
      <tiles:insertAttribute name = "body" /><br/>
      <hr/>
      <tiles:insertAttribute name = "footer" /><br/>
   </body>
</html>

Здесь мы просто собрали базовую HTML-страницу, которая имеет атрибуты плиток. Мы вставляем атрибуты плиток в те места, где они нам нужны. Далее, давайте создадим файл banner.jsp со следующим содержанием —

<img src="http://www.tutorialspoint.com/images/tp-logo.gif"/>

Файл menu.jsp будет содержать следующие строки, которые являются ссылками — на действия распорок TigerMenu.action и LionMenu.action.

<%@taglib uri = "/struts-tags" prefix = "s"%>

<a href = "<s:url action = "tigerMenu"/>" Tiger</a><br>
<a href = "<s:url action = "lionMenu"/>" Lion</a><br>

Файл lion.jsp будет иметь следующее содержимое:

<img src="http://upload.wikimedia.org/wikipedia/commons/d/d2/Lion.jpg"/>
The lion

Файл tiger.jsp будет иметь следующее содержимое:

<img src="http://www.freewebs.com/tigerofdarts/tiger.jpg"/>
The tiger

Далее, давайте создадим файл класса действий MenuAction.java, который содержит следующее:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class MenuAction extends ActionSupport {
   public String tiger() { return "tiger"; }
   public String lion() { return "lion"; }
}

Это довольно простой класс. Мы объявили два метода tiger () и lion (), которые возвращают тигра и льва в качестве результатов соответственно. Давайте соберем все это вместе в файле struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <package name = "default" extends = "struts-default">
      <result-types>
         <result-type name = "tiles" 
         class="org.apache.struts2.views.tiles.TilesResult" />
      </result-types>

      <action name = "*Menu" method = "{1}" 
         class = "com.tutorialspoint.struts2.MenuAction">
         <result name = "tiger" type = "tiles">tiger</result>
         <result name = "lion" type = "tiles">lion</result>
      </action>

   </package>
</struts>

Давайте проверим, что мы сделали в вышеуказанном файле. Прежде всего, мы объявили новый тип результата, названный «плитки», так как теперь мы используем плитки вместо простого jsp для технологии представления. Struts2 поддерживает тип результата Tiles View, поэтому мы создаем тип результата «tile» для класса «org.apache.struts2.view.tiles.TilesResult».

Далее, мы хотим сказать, если запрос относится к /tigerMenu.action, перенаправить пользователя на страницу плиток тигра, а если запрос к /lionMenu.action, перенаправить пользователя на страницу плиток льва.

Мы достигаем этого, используя немного регулярных выражений. В нашем определении действия мы говорим, что все, что соответствует шаблону «* Меню», будет обработано этим действием. Соответствующий метод будет вызван в классе MenuAction. То есть tigerMenu.action будет вызывать tiger (), а lionMenu.action будет вызывать lion (). Затем нам нужно отобразить результат результата на соответствующие страницы листов.

Теперь щелкните правой кнопкой мыши на имени проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / tigerMenu.jsp . Это создаст следующий экран —

Интеграция Struts и Tiles

Точно так же, если вы перейдете на страницу lionMenu.action, вы увидите страницу льва, которая использует тот же макет плиток.

Struts 2 и Hibernate Integration

Hibernate — это высокопроизводительная служба объектной / реляционной персистентности и запросов, которая лицензируется по открытой общедоступной лицензии GNU Lesser (LGPL) с открытым исходным кодом и бесплатна для загрузки. В этой главе. мы собираемся узнать, как добиться интеграции Struts 2 с Hibernate. Если вы не знакомы с Hibernate, то вы можете проверить наш учебник Hibernate .

Настройка базы данных

Для этого урока я собираюсь использовать базу данных MySQL «struts2_tutorial». Я подключаюсь к этой базе данных на своем компьютере, используя имя пользователя «root» и без пароля. Прежде всего, вам нужно запустить следующий скрипт. Этот скрипт создает новую таблицу с именем student и создает несколько записей в этой таблице —

CREATE TABLE IF NOT EXISTS `student` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `first_name` varchar(40) NOT NULL,
   `last_name` varchar(40) NOT NULL,
   `marks` int(11) NOT NULL,
   PRIMARY KEY (`id`)
);

--
-- Dumping data for table `student`
--

INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
   VALUES(1, 'George', 'Kane', 20);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
   VALUES(2, 'Melissa', 'Michael', 91);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
   VALUES(3, 'Jessica', 'Drake', 21);

Конфигурация гибернации

Теперь давайте создадим файл hibernate.cfg.xml, который является файлом конфигурации hibernate.

<?xml version = '1.0' encoding = 'utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
      <property name = "hibernate.connection.driver_class">c
         om.mysql.jdbc.Driver
      </property>
      
      <property name = "hibernate.connection.url">
         jdbc:mysql://www.tutorialspoint.com/struts_tutorial
      </property>
      
      <property name = "hibernate.connection.username">root</property>
      
      <property name = "hibernate.connection.password"></property>
      
      <property name = "hibernate.connection.pool_size">10</property>
      
      <property name = "show_sql">true</property>
      
      <property name = "dialect">
         org.hibernate.dialect.MySQLDialect
      </property>
      
      <property name = "hibernate.hbm2ddl.auto">update</property>
      
      <mapping class = "com.tutorialspoint.hibernate.Student" />
   </session-factory>
</hibernate-configuration> 

Давайте пройдемся по файлу конфигурации hibernate. Сначала мы объявили, что используем драйвер MySQL. Затем мы объявили URL-адрес jdbc для подключения к базе данных. Затем мы объявили имя пользователя, пароль и размер пула соединения. Мы также указали, что хотели бы видеть SQL в файле журнала, включив «show_sql» в true. Пожалуйста, ознакомьтесь с руководством по гибернации, чтобы понять, что означают эти свойства.

Наконец, мы устанавливаем класс отображения на com.tutorialspoint.hibernate.Student, который мы создадим в этой главе.

Настройка Envrionment

Далее вам нужно много банок для этого проекта. Приложенный снимок экрана полного списка необходимых файлов JAR —

Струсы и баночки для спячки

Большинство файлов JAR можно получить как часть вашего дистрибутива Struts. Если у вас установлен сервер приложений, такой как glassfish, websphere или jboss, вы можете получить большинство оставшихся jar-файлов из папки lib сервера приложений. Если нет, вы можете скачать файлы по отдельности —

Файлы банок HibernateHibernate.org

Struts Hibernate плагин — Struts Hibernate плагин

JTA файлы — JTA файлы

Dom4j файлы — Dom4j

файлы log4jlog4j

Остальные файлы вы сможете получить из своего дистрибутива Struts2.

Спящие классы

Теперь давайте создадим необходимые классы Java для интеграции в спящий режим. Ниже приводится содержание Student.java

package com.tutorialspoint.hibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")
public class Student {
	
   @Id
   @GeneratedValue
   private int id;
   @Column(name = "last_name")
   private String lastName;
   @Column(name = "first_name")
   private String firstName;
   private int marks;
   
   public int getId() {
    return id;
   }
   
   public void setId(int id) {
    this.id = id;
   }
   
   public String getLastName() {
      return lastName;
   }
   
   public void setLastName(String lastName) {
      this.lastName = lastName;
   }
   
   public String getFirstName() {
      return firstName;
   }
   
   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }
   
   public int getMarks() {
      return marks;
   }
   
   public void setMarks(int marks) {
      this.marks = marks;
   }
}

Это класс POJO, который представляет таблицу ученика согласно спецификации Hibernate. У него есть свойства id, firstName и lastName, которые соответствуют именам столбцов таблицы ученика. Теперь давайте создадим файл StudentDAO.java следующим образом:

package com.tutorialspoint.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.googlecode.s2hibernate.struts2.plugin.\
   annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.\
   annotations.TransactionTarget;

public class StudentDAO {
	
   @SessionTarget
   Session session;

   @TransactionTarget
   Transaction transaction;

   @SuppressWarnings("unchecked")
   public List<Student> getStudents() {
      List<Student> students = new ArrayList<Student>();
      
      try {
         students = session.createQuery("from Student").list();
      } catch(Exception e) {
         e.printStackTrace();
      }
      return students;
   }

   public void addStudent(Student student) {
      session.save(student);
   }
}

Класс StudentDAO — это уровень доступа к данным для класса Student. У этого есть методы, чтобы перечислить всех студентов и затем сохранить новую студенческую запись.

Класс действий

Следующий файл AddStudentAction.java определяет наш класс действий. У нас есть два метода действий — execute () и listStudents (). Метод execute () используется для добавления новой записи студента. Для этого мы используем метод save ().

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

package com.tutorialspoint.struts2;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.hibernate.StudentDAO;

public class AddStudentAction extends ActionSupport implements ModelDriven<Student> {

   Student student  = new Student();
   List<Student> students = new ArrayList<Student>();
   StudentDAO dao = new StudentDAO();
   @Override
  
  public Student getModel() {
      return student;
   }

   public String execute() {
      dao.addStudent(student);
      return "success";
   }

   public String listStudents() {
      students = dao.getStudents();
      return "success";
   }

   public Student getStudent() {
      return student;
   }

   public void setStudent(Student student) {
      this.student = student;
   }

   public List<Student> getStudents() {
      return students;
   }

   public void setStudents(List<Student> students) {
      this.students = students;
   }
	
}

Вы заметите, что мы реализуем интерфейс ModelDriven. Это используется, когда ваш класс действий имеет дело с конкретным классом модели (например, Student), а не с отдельными свойствами (такими как firstName, lastName). Интерфейс ModelAware требует от вас реализации метода для возврата модели. В нашем случае мы возвращаем объект «студент».

Создать просмотр файлов

Теперь давайте создадим файл представления student.jsp со следующим содержимым:

<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>

<html>
   <head>
      <title>Hello World</title>
      <s:head />
   </head>
   
   <body>
      <s:form action = "addStudent">
         <s:textfield name = "firstName" label = "First Name"/>
         <s:textfield name = "lastName" label = "Last Name"/>
         <s:textfield name = "marks" label = "Marks"/>
         <s:submit/>
         <hr/>
         
         <table>
            <tr>
               <td>First Name</td>
               <td>Last Name</td>
               <td>Marks</td>
            </tr>
            
            <s:iterator value = "students">	
               <tr>
                  <td><s:property value = "firstName"/></td>
                  <td><s:property value = "lastName"/></td>
                  <td><s:property value = "marks"/></td>
                 </tr>
            </s:iterator>	
         </table>
      </s:form>
   </body>
</html>

Student.jsp довольно прост. В верхнем разделе у нас есть форма, которая отправляется в «addStudent.action». Он принимает имя, фамилию и отметки. Поскольку действие addStudent привязано к ModelAware «AddSudentAction», автоматически создается компонент ученика со значениями для firstName, lastName и отметок, которые автоматически заполняются.

В нижней части мы просматриваем список студентов (см. AddStudentAction.java). Мы перебираем список и отображаем значения для имени, фамилии и отметок в таблице.

Конфигурация Struts

Давайте соединим все это с помощью struts.xml

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <package name = "myhibernate" extends = "hibernate-default">

      <action name = "addStudent" method = "execute"
         class = "com.tutorialspoint.struts2.AddStudentAction">
         <result name = "success" type = "redirect">
            listStudents
         </result>
      </action>

      <action name = "listStudents" method = "listStudents"
         class = "com.tutorialspoint.struts2.AddStudentAction">
         <result name = "success">/students.jsp</result>
      </action>

   </package>
</struts>

Здесь важно отметить, что наш пакет «myhibernate» расширяет пакет по умолчанию struts2, называемый «hibernate-default». Затем мы объявляем два действия — addStudent и listStudents. addStudent вызывает execute () для класса AddStudentAction, а затем при успешном выполнении вызывает метод действия listStudents.

Метод действия listStudent вызывает метод listStudents () класса AddStudentAction и использует student.jsp в качестве представления.

Теперь щелкните правой кнопкой мыши имя проекта и выберите « Экспорт»> «Файл WAR», чтобы создать файл «War». Затем разверните эту WAR в каталоге веб-приложений Tomcat. Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / student.jsp . Это создаст следующий экран —

Struts и Hibernate Результат

В верхнем разделе мы получаем форму для ввода значений для новой записи студента, а в нижнем разделе перечислены студенты в базе данных. Идите вперед и добавьте новую запись студента и нажмите отправить. Экран будет обновляться и отображать обновленный список при каждом нажатии кнопки «Отправить».