Статьи

Struts2 Интервью Вопросы и ответы

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

  1. Что такое Struts2?
  2. Каковы различия между Struts1 и Struts2 или чем Struts2 лучше, чем Struts1?
  3. Каковы основные компоненты Struts2?
  4. Что такое перехватчик в Struts2?
  5. Какой шаблон проектирования реализован перехватчиками Struts2?
  6. Каковы различные способы создания классов действий в Struts2?
  7. Являются ли действия и перехватчики Struts2 потокобезопасными?
  8. Какой класс является Front Controller в Struts2?
  9. Каковы преимущества перехватчиков в Struts2?
  10. Что такое ValueStack и OGNL?
  11. Назовите несколько полезных аннотаций, представленных в Struts2?
  12. Укажите некоторые важные константы Struts2, которые вы использовали?
  13. Каково использование пространства имен в отображении действий в Struts2?
  14. Какой перехватчик отвечает за сопоставление параметров запроса со свойствами Java Bean класса действий?
  15. Какой перехватчик отвечает за поддержку i18n?
  16. Какая разница в использовании интерфейса Action и класса ActionSupport для наших классов действий, какой из них вы бы предпочли?
  17. Как мы можем получить Servlet API Request, Response, HttpSession и т. Д. Объекты в классах действий?
  18. Какая польза от перехватчика execAndWait?
  19. Как использовать токен-перехватчик в Struts2?
  20. Как мы можем интегрировать log4j в приложение Struts2?
  21. Чем отличаются тэги Struts2? Как мы можем их использовать?
  22. Что такое конвертер пользовательских типов в Struts2?
  23. Как мы можем написать наш собственный перехватчик и отобразить его для действия?
  24. Каков жизненный цикл перехватчика?
  25. Что такое стек перехватчиков?
  26. Что такое пакет Struts-default и каковы его преимущества?
  27. Какой суффикс по умолчанию для URI действия Struts2 и как мы можем его изменить?
  28. Каково расположение страниц результатов по умолчанию и как мы можем его изменить?
  29. Как мы можем загрузить файлы в приложении Struts2?
  30. Какие передовые практики следует соблюдать при разработке приложения Struts2?

    1. Что такое Struts2?

      Apache Struts2 — это платформа с открытым исходным кодом для создания веб-приложений на Java. Struts2 основан на платформе OpenSymphony WebWork . Он значительно улучшен по сравнению со Struts1, что делает его более гибким, простым в использовании и расширении. Основными компонентами Struts2 являются страницы действий, перехватчиков и результатов.

      Struts2 предоставляет множество способов создания классов Action и их настройки с помощью struts.xml или аннотаций. Мы можем создать свои собственные перехватчики для общих задач. Struts2 поставляется с большим количеством тегов и использует язык выражений OGNL. Мы можем создавать собственные конвертеры типов для отображения страниц результатов. Страницы результатов могут быть шаблонами JSP и FreeMarker.

    2. Каковы различия между Struts1 и Struts2 или чем Struts2 лучше, чем Struts1?

      Struts2 разработан, чтобы преодолеть недостатки Struts1 и сделать его более гибким, расширяемым. Некоторые из заметных отличий:

      Составные части Struts1 Struts2
      Классы действий Классы действий Struts1 вынуждены расширять абстрактный класс, что делает его недоступным для расширения. Классы действий Struts2 гибкие, и мы можем создавать их, реализуя интерфейс Action, расширяя класс ActionSupport или просто используя метод execute ().
      Поток безопасности Классы действий Struts1 являются одноэлементными и не ориентированы на многопотоковое исполнение, что обеспечивает дополнительную осторожность на стороне разработчика во избежание любых побочных эффектов из-за многопоточности Классы действий Struts2 создаются для каждого запроса, поэтому многопоточность отсутствует, что делает их потокобезопасными.
      Servlet API муфта API-интерфейсы Struts1 тесно связаны с API-интерфейсом сервлета, а объекты Request и Response передаются в класс действий execute (). Struts2 API слабо связан с Servlet API и автоматически сопоставляет данные bean-компонента формы со свойствами java-компонента класса действий, которые мы в основном используем. Однако, если нам нужна ссылка на классы Servlet API, для этого есть * Aware интерфейсы.
      тестирование Классы действий Struts1 сложно протестировать из-за соединения API сервлетов. Классы Struts2 Action похожи на обычные классы Java, и мы можем легко их протестировать, создав их экземпляры и установив их свойства.
      Отображение параметров запроса Struts1 требует от нас создания классов ActionForm для хранения параметров запроса, и нам необходимо настроить его в файле конфигурации Struts. Сопоставление параметров запроса Struts2 выполняется на лету, и все, что нам нужно, это иметь свойства Java-бина в классах действий или реализовать интерфейс ModelDriven для предоставления имени класса Java-бина, который будет использоваться для отображения.
      Поддержка тегов Struts1 использует теги JSTL и поэтому ограничен. Struts2 использует OGNL и предоставляет различные виды пользовательского интерфейса, элементов управления и тегов данных. Это более универсальный и простой в использовании.
      Проверка Struts1 поддерживает проверку с помощью ручного метода validate () Struts2 поддерживает как ручную проверку, так и интеграцию с платформой проверки.
      Рендеринг просмотров Struts1 использует стандартную технологию JSP для предоставления значений bean-компонентов на страницы JSP для представлений. Struts2 использует ValueStack для хранения параметров и атрибутов запроса, и мы можем использовать теги OGNL и Struts2 для доступа к ним.
      Поддержка модулей Модули Struts1 сложны в дизайне и выглядят как отдельные проекты Struts2 предоставляет конфигурацию «пространства имен» для пакетов, чтобы легко создавать модули.
    3. Каковы основные компоненты Struts2?

      Основные компоненты Struts2:

      1. Классы действий
      2. Перехватчики
      3. Страницы результатов, JSP шаблонов FreeMarker
      4. Библиотеки ValueStack, OGNL и Tag

    4. Что такое перехватчик в Struts2?

      Перехватчики являются основой Struts2 Framework. Перехватчики Struts2 отвечают за большую часть обработки, выполняемой платформой, например, передачу параметров запроса классам действий, предоставление запроса API-интерфейса сервлета, ответа, сеанса для классов Action, проверки, поддержки i18n и т. Д.

      ActionInvocation отвечает за инкапсуляцию классов и перехватчиков Action и запускает их по порядку. Наиболее важный метод для использования в ActionInvocation — это метод invoke (), который отслеживает цепочку перехватчиков и вызывает следующий перехватчик или действие. Это один из лучших примеров шаблона цепочки ответственности в средах Java EE.

    5. Какой шаблон проектирования реализован перехватчиками Struts2?

      Перехватчики Struts2 основаны на шаблоне проектирования перехватывающих фильтров. Вызов перехватчиков в стеке перехватчиков очень похож на шаблон проектирования «Цепочка ответственности».

    6. Каковы различные способы создания классов действий в Struts2?

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

      1. Путем реализации интерфейса действий
      2. Использование Struts2 @Action аннотация
      3. Расширяя класс ActionSupport
      4. Любой нормальный класс Java с методом execute (), возвращающим String, может быть настроен как класс Action.
    7. Являются ли действия и перехватчики Struts2 потокобезопасными?

      Классы Struts2 Action являются поточно-ориентированными, потому что объект создается для каждого запроса на его обработку.

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

    8. Какой класс является Front Controller в Struts2?

      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter является классом Front Controller в Struts2, и каждая обработка запроса начинается с этого класса. Более ранние версии Struts2 используют org.apache.struts2.dispatcher.FilterDispatcher качестве класса Front Controller.

    9. Каковы преимущества перехватчиков в Struts2?

      Некоторые из преимуществ перехватчиков:

      • Перехватчик играет решающую роль в достижении высокого уровня разделения интересов.
      • Перехватчики Struts2 настраиваемы, мы можем настроить их для любых действий.
      • Мы можем создавать собственные настраиваемые перехватчики для выполнения некоторых распространенных задач, таких как ведение журнала параметров запросов, аутентификация и т. Д. Это помогает нам решать общие задачи в одном месте, обеспечивая низкие затраты на обслуживание.
      • Мы можем создать стек перехватчиков для использования с различными действиями.
    10. Что такое ValueStack и OGNL?

      ValueStack — это область хранения, в которой данные приложения хранятся в Struts2 для обработки клиентских запросов. Данные хранятся в объектах ActionContext которые используют ThreadLocal, чтобы иметь значения, специфичные для конкретного потока запроса.

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

    11. Назовите несколько полезных аннотаций, представленных в Struts2?

      Вот некоторые важные аннотации, представленные в Struts2:

      1. @Action для создания класса действий
      2. @Actions для настройки одного класса для нескольких действий
      3. @Namespace и @Namespaces для создания различных модулей
      4. @Result для страниц результатов
      5. @ResultPath для настройки расположения страниц результатов
    12. Укажите некоторые важные константы Struts2, которые вы использовали?

      Вот некоторые из констант Struts2, которые я использовал:

      1. struts.devMode для запуска нашего приложения в режиме разработки. Этот режим перезагружает файлы свойств и предоставляет дополнительную возможность ведения журнала и отладки. Это очень полезно при разработке нашего приложения, но мы должны отключить его при переносе нашего кода в производство.
      2. struts.convention.result.path для настройки расположения страниц результатов. По умолчанию Struts2 ищет страницы результатов в {WEBAPP-ROOT} / {Пространство имен} /, и мы можем изменить местоположение с помощью этой константы.
      3. struts.custom.i18n.resources для определения глобального набора ресурсов для поддержки i18n.
      4. Struts.action.extension для настройки суффикса URL-адреса для приложения Struts2. Суффикс по умолчанию — .action, но иногда мы можем захотеть изменить его на .do или что-то еще.

      Мы можем настроить указанные выше константы в файле struts.xml, как показано ниже.

      1
      2
      3
      4
      <constant name="struts.devMode" value="true"></constant>
      <constant name="struts.action.extension" value="action,do"></constant>
      <constant name="struts.custom.i18n.resources" value="global"></constant>
      <constant name="struts.convention.result.path" value="/"></constant>
    13. Каково использование пространства имен в отображении действий в Struts2?

      Конфигурация пространства имен Struts2 позволяет нам легко создавать модули. Мы можем использовать пространство имен для разделения наших классов действий на основе их функциональности, например, администратора, пользователя, клиента и т. Д.

    14. Какой перехватчик отвечает за сопоставление параметров запроса со свойствами Java Bean класса действий?

      com.opensymphony.xwork2.interceptor.ParametersInterceptor отвечает за сопоставление параметров запроса со свойствами Java-бина класса Action. Этот перехватчик сконфигурирован в пакете struts-default с именем «params». Этот перехватчик является частью стека перехватчиков basicStack и defaultStack.

    15. Какой перехватчик отвечает за поддержку i18n?

      com.opensymphony.xwork2.interceptor.I18nInterceptor отвечает за поддержку i18n в приложениях Struts2. Этот перехватчик сконфигурирован в пакете struts-default с именем «i18n» и является частью i18nStack и defaultStack.

    16. Какая разница в использовании интерфейса Action и класса ActionSupport для наших классов действий, какой из них вы бы предпочли?

      Мы можем реализовать интерфейс Action для создания наших классов действий. Этот интерфейс имеет единственный метод execute (), который нам нужно реализовать. Единственным преимуществом использования этого интерфейса является то, что он содержит некоторые константы, которые мы можем использовать для страниц результатов. Это константы SUCCESS, ERROR, NONE, INPUT и LOGIN.

      Класс ActionSupport является реализацией интерфейса Action по умолчанию, а также реализует интерфейсы, связанные с проверкой и поддержкой i18n. Класс ActionSupport реализует интерфейсы Action, Validateable, ValidationAware, TextProvider и LocaleProvider. Мы можем переопределить метод validate () класса ActionSupport, чтобы включить регистрацию на уровне поля в наши классы действий.

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

    17. Как мы можем получить Servlet API Request, Response, HttpSession и т. Д. Объекты в классах действий?

      Классы действий Struts2 не предоставляют прямой доступ к таким компонентам API сервлетов, как запрос, ответ и сессия. Однако иногда нам нужен такой доступ в классах действий, таких как проверка HTTP-метода или установка куки в ответ.

      Вот почему Struts2 API предоставляет набор * Aware-интерфейсов, которые мы можем реализовать для доступа к этим объектам. Struts2 API использует внедрение зависимостей для внедрения компонентов API сервлета в классы действий. Некоторые из важных интерфейсов Aware — это SessionAware, ApplicationAware, ServletRequestAware и ServletResponseAware.

      Вы можете прочитать больше о них в руководстве Как получить сеанс API сервлета в руководстве Struts2 Action Classes .

    18. Какая польза от перехватчика execAndWait?

      Struts2 предоставляет execAndWait-перехватчик для длительных классов действий. Мы можем использовать этот перехватчик, чтобы вернуть клиенту промежуточную страницу ответа, и как только обработка будет завершена, окончательный ответ будет возвращен клиенту. Этот перехватчик определен в пакете ExecuteAndWaitInterceptor -default, а реализация присутствует в классе ExecuteAndWaitInterceptor .

      Посмотрите пример перехватчика Struts2 execAndWait, чтобы узнать больше об этом перехватчике и о том, как его использовать.

    19. Как использовать токен-перехватчик в Struts2?

      Одной из основных проблем с веб-приложениями является двойная форма отправки. Если не позаботиться о двойном представлении формы, это может привести к взиманию двойной суммы с клиента или обновлению значений базы данных дважды Мы можем использовать токен-перехватчик для решения проблемы двойной отправки формы. Этот перехватчик определен в пакете struts-default, но он не является частью какого-либо стека перехватчиков, поэтому нам нужно включить его вручную в наши классы действий.

      Подробнее читайте на примере перехватчика токенов Struts2 .

    20. Как мы можем интегрировать log4j в приложение Struts2?

      Struts2 обеспечивает простую интеграцию log4j API для целей регистрации, все, что нам нужно, это файл конфигурации log4j в каталоге WEB-INF / classes.

      Вы можете проверить пример проекта в Struts2 Log4j интеграции .

    21. Чем отличаются тэги Struts2? Как мы можем их использовать?

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

      Мы можем использовать эти теги, добавляя их на страницы JSP с помощью директивы taglib.

      1
      <%@ taglib uri="/struts-tags" prefix="s" %>

      Некоторые из важных тегов данных — это свойства, set, push, bean, action, include, i18n и текстовый тег. Узнайте больше на тегах данных Struts2 .

      Управляющие теги используются для манипулирования и навигации по данным из коллекции. Вот некоторые из важных тегов Control: if-elseif-else, итератор, добавление, слияние, сортировка, подмножество и генератор тегов. Узнайте больше на контрольных тегах Struts2 .

      Теги пользовательского интерфейса Struts2 используются для создания языка разметки HTML, привязки данных формы HTML к свойствам классов действий, преобразования типов, проверки и поддержки i18n. Некоторые из важных тегов пользовательского интерфейса: форма, текстовое поле, пароль, текстовое поле, флажок, выберите, радио и отправить тег. Подробнее о них читайте в тегах пользовательского интерфейса Struts2 .

    22. Что такое конвертер пользовательских типов в Struts2?

      Struts2 поддерживает язык выражений OGNL и выполняет две важные задачи в Struts 2 — передача данных и преобразование типов.

      OGNL гибок, и мы можем легко расширить его, чтобы создать наш собственный класс конвертера. Создание и настройка пользовательского класса преобразователя типов очень проста, первым шагом является исправление формата ввода для пользовательского класса. Второй шаг — реализовать класс конвертера. Классы конвертера типов должны реализовывать интерфейс com.opensymphony.xwork2.conversion.TypeConverter. Поскольку в веб-приложении мы всегда получаем запрос в форме String и отправляем ответ в виде String, API-интерфейс Struts 2 обеспечивает реализацию интерфейса TypeConverter по умолчанию, StrutsTypeConverter. StrutsTypeConverter содержит два абстрактных метода — convertFromString для преобразования String в Object и convertToString для преобразования Object в String.

      Подробнее о реализации читайте в учебнике примеров Struts2 OGNL .

    23. Как мы можем написать наш собственный перехватчик и отобразить его для действия?

      Мы можем реализовать интерфейс com.opensymphony.xwork2.interceptor.Interceptor для создания нашего собственного перехватчика. Когда класс перехватчика будет готов, нам нужно определить его в пакете struts.xml, где мы хотим его использовать. Мы также можем создать стек перехватчиков с помощью наших пользовательских перехватчиков и перехватчиков defaultStack. После этого мы можем настроить его для классов действий, где мы хотим использовать наш перехватчик.

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

    24. Каков жизненный цикл перехватчика?

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

      intercept () — это метод, вызываемый каждый раз, когда клиентский запрос поступает через перехватчик.

    25. Что такое стек перехватчиков?

      Стек перехватчиков помогает нам сгруппировать несколько перехватчиков в пакет для дальнейшего использования. Пакет struts-default создает некоторые из наиболее часто используемых стеков-перехватчиков — basicStack и defaultStack. Мы можем создать наш собственный стек перехватчиков в начале пакета и затем настроить наши классы действий для его использования.

    26. Что такое пакет Struts-default и каковы его преимущества?

      Struts-default — это абстрактный пакет, который определяет все перехватчики Struts2 и часто используемый стек перехватчиков. Рекомендуется расширить этот пакет при настройке нашего пакета приложения, чтобы избежать повторной настройки перехватчиков. Это помогает разработчикам избавиться от тривиальной задачи настройки перехватчика и страниц результатов в нашем приложении.

    27. Какой суффикс по умолчанию для URI действия Struts2 и как мы можем его изменить?

      Суффикс URI по умолчанию для действия Struts2 — .action, в Struts1 суффикс по умолчанию — .do. Мы можем изменить этот суффикс, определив значение константы struts.action.extension в нашем файле конфигурации Struts2 следующим образом:

      1
      <constant name="struts.action.extension" value="action,do"></constant>
    28. Каково расположение страниц результатов по умолчанию и как мы можем его изменить?

      По умолчанию Struts2 ищет страницы результатов в каталоге {WEBAPP-ROOT} / {Namespace} /, но иногда мы хотим сохранить страницы результатов в другом месте, мы можем предоставить значение константы struts.convention.result.path в файле конфигурации Struts2, чтобы изменить расположение страниц результатов.

      Другой способ — использовать аннотацию @ResultPath в классах действий, чтобы обеспечить расположение страниц результатов.

    29. Как мы можем загрузить файлы в приложении Struts2?

      Загрузка файла является одной из распространенных задач в веб-приложении. Вот почему Struts2 предоставляет встроенную поддержку для загрузки файлов через FileUploadInterceptor. Этот перехватчик настроен в пакете struts-default и предоставляет параметры для установки максимального размера файла и типов файлов, которые могут быть загружены на сервер.

      Узнайте больше о перехватчике FileUpload на примере загрузки файла Struts2 .

    30. Какие передовые практики следует соблюдать при разработке приложения Struts2?

      Некоторые из лучших практик при разработке приложения Struts2:

      1. Всегда пытайтесь расширить пакет struts-default при создании вашего пакета, чтобы избежать избыточности кода при настройке перехватчиков.
      2. Для общих задач в приложении, таких как регистрация параметров запроса, попробуйте использовать перехватчики.
      3. Всегда храните классы свойств свойств Java-компонента в отдельном компоненте для повторного использования кода и реализации интерфейса ModelDriven.
      4. Если у вас есть пользовательский перехватчик, который вы будете использовать в нескольких действиях, создайте для него стек перехватчиков, а затем используйте его.
      5. Попробуйте разделить ваше приложение на разные модули с конфигурацией пространства имен на основе функциональных областей.
      6. Попробуйте использовать теги Struts2 на страницах результатов для уточнения кода, при необходимости создайте свои собственные преобразователи типов.
      7. Используйте режим разработки для более быстрой разработки, однако убедитесь, что производственный код не работает в режиме разработки.
      8. Используйте поддержку Struts2 i18n для пакетов ресурсов и для поддержки локализации.
      9. Struts2 предоставляет множество мест, где вы можете иметь пакеты ресурсов, но старайтесь оставить один глобальный пакет ресурсов и один для класса действий, чтобы избежать путаницы.
      10. Пакет struts-default настраивает все перехватчики и создает различные стеки перехватчиков. Попробуйте использовать только то, что нужно, например, если у вас нет требований к локализации, вы можете избежать перехватчика i18n.

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