В Struts2 часть действия, то есть слой контроллера, принимает метод низкого вторжения. Почему ты так говоришь? Это связано с тем, что в классе действий Struts2 не нужно наследовать какой -либо базовый класс или реализовать какой -либо интерфейс, а также не связан с API сервлета. Обычно он больше похож на обычный POJO (обычно должен содержать метод выполнения без параметров) и может определять ряд методов (без методов параметров) в содержимом и может использоваться в качестве независимого действия посредством конфигурации, тем самым реализуя повторное использование кода.
Например:
Пример пакета; открытый класс userAction {private String userName; Private String Password; public String execute () бросает исключение {// ……… .. вернуть "успех"; } public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPassword () {return пароль; } public void setPassword (String password) {this.password = password; }}ДЕРЕВАНИЕ ДЕЙСТВИЯ ДЕЙСТВИЯ ДОСТУПА
Свойства в этом классе действия могут инкапсулировать параметры и результаты процесса. Система не строго различает их.
Однако для того, чтобы сделать класс, разработанный пользователем более стандартизированным, Struts2 предоставляет нам действие интерфейса, которое определяется следующим образом:
publicinterface action {publicstaticfinal rest error = "error"; publicstaticfinal string input = "input"; publicstaticfinal string none = "none"; publicstaticfinal string login = "login"; Publicstaticfinal String Success = "Успех"; public String execute () бросает исключение;}Однако, когда мы пишем действие, мы обычно не реализуем интерфейс, но наследуем действия класса реализации, включенные в интерфейс.
Код этого класса выглядит следующим образом:
Общедоступный класс Actionsupport реализует действие, валидационное, проверено, TextProvider, LocaleProvider, Serializable {............. public void setActionErrors (errorrormessages) {valistationAware.setActionErrors (errorMessages); } public Collection getActionErrors () {return valyationAware.getActionErrors (); } public void setActionMessage (Сообщения коллекции) {valistanationAware.setActionMessage (сообщения); } public Collection getActionMessage () {return valyationAware.getActionMessage (); } public Collection getErrorMessage () {return getActionErrors (); } public map geterRors () {return getFielderRors (); } // Установите ошибку поля поля формы public void setfielderrors (map errormap) {validationAware.setFielderRors (errorMAP); } public Map getFielderRors () {return valyationAware.getFielderRors (); } public locale getLocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getlocale (); } else {log.debug ("Контекст действия не инициализирован"); вернуть ноль; }} // Метод для получения международной информации общедоступной строки getText (string atextName) {return textProvider.getText (atextName); } public String getText (String atextName, String defaultValue) {return TextProvider.getText (atextName, defaultValue); } public String getText (String atextName, String defaultValue, String obj) {return TextProvider.getText (atextName, defaultValue, obj); } ......... // Методы, используемые для доступа к международным пакетам ресурсов Public ResourceBundle getTexts () {return TextProvider.getTexts (); } public resourcebundle getTexts (string abundlename) {return textprovider.gettexts (abundlename); } // Добавить сообщение об ошибке Action public void AddactionError (String anerrormessage) {valistanationAware.addactionError (anerrormessage); } // Добавить обычную информацию о действии public void AddactionMessage (string amessage) {valistanationAware.addactionMessage (amessage); } public void AddFielderRor (String FieldName, String errorMessage) {valistanationAware.addfielderror (FieldName, ErrorMessage); } public void validate () {} public Object Clone () бросает ClonenotSupportedException {return super.clone (); } .........}Как упоминалось ранее, Struts2 не напрямую связан с API сервлета, так как же он доступ к API сервлета?
Оказывается, что Struts2 предоставляет класс ActionContext, который имитирует API сервлета. Основные методы следующие:
1) Object get (ключ объекта): этот метод имитирует метод httpservletrequest.getattribute (name string).
2) MAP getApplication () возвращает объект карты, который имитирует экземпляр ServletContext.
3) Static ActionContext getContext (): получить экземпляр ActionContext системы.
4) MAP getSession (): возвращает объект карты, который имитирует экземпляр HTTPSession.
5) MAP getParameters (): Получить все параметры запроса, смоделированный httpservletrequest.getParameterMap ()
Вы можете задаться вопросом, почему эти методы всегда возвращают карту? Это в основном для простоты тестирования. Что касается того, как он преобразует объекты карты с реальными экземплярами API сервлета, мы вообще не беспокоимся об этом, потому что у Struts2 есть встроенные перехватчики, чтобы помочь нам завершить это преобразование.
Чтобы напрямую использовать API сервлета, Struts2 предоставляет нам следующие интерфейсы.
1) ServletContextAware: действие, которое реализует этот интерфейс, может напрямую получить доступ к экземпляру ServletContext.
2) ServletRequestaware: действие, которое реализует этот интерфейс, может непосредственно получить доступ к экземпляру httpservletRequest.
3) Servletresponsearead: Действие, которое реализует этот интерфейс, может напрямую получить доступ к экземпляру httpservletresponse.
Вышеуказанное в основном рассказывает о сервлетах доступа к действию. Давайте посмотрим, как действие Struts2 реализует повторное использование кода. Возьмите, к примеру, примеру. Если я позволю этому действию обрабатывать как регистрацию пользователя, так и вход (Longin), как мне переписать это действие? Переписанное пользовательское действие выглядит следующим образом:
Пример пакета; открытый класс UserAction расширяет ActionSupport {private String username; Private String Password; public String Registration () бросает исключение {// ………… .. вернуть успех; } public String login () бросает исключение {// ……… .. вернуть успех; } public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPassword () {return пароль; } public void setPassword (String password) {this.password = password; }} Конфигурация действия в struts.xml
Можно ли писать таким образом? Конечно, это не работает. Мы также должны настроить его в файле struts.xml. Есть два метода конфигурации:
1) Используйте нормальный способ указать атрибут метода для элемента действия.
<name = ”” loginaction ”class =” example.useraction ”method =” login »> <name name =” excep ”>/success.jsp </result> </action> <name =” registaction ”class =” example.userAction ”Method =” regist »> <name =” ecpess ”>/success.jsp </result> </action>
2) Используйте подстановочные знаки, чтобы указать атрибут метода для элемента действия.
<name = ”*action” class = ”example.userAction” method = ”{1}”> <name = ”ecuest”>/success.jsp </result> </action>Способ использования подстановочных знаков слишком гибкий, и ниже приведен более сложная ситуация конфигурации.
<name = ”**_*” class = ”Пример. {1} action” method = ”{2}”> ………. </action>Где заполнитель {1} соответствует предыдущему * из _, а {2} соответствует следующему *.
Конфигурация действия на основе метода аннотации:
Конфигурация действия, о котором я хочу поговорить ниже, не в SRC/Struts.xml, а предпосылкой для настройки его с использованием аннотации состоит в том, что в дополнение к основным пакетам шести JAR вам также нужны стойки-2,1.8.1/lib/struts2-convention-plugin-2.1.1.1.1/lib/struts2-convention-plugin-2.1.
Тем не менее, struts.xml по -прежнему нужны конкретные примеры
Login.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <Head> <Title> struts2l in verififical </title> <teta ht-queiv-queiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-aquiv-quevt content = "Keyword1, Keyword2, Keyword3"> <meta http-equiv = "description" content = "Это моя страница"> <!-<link rel = "stylesheet" type = "text/css" href = "styles.css">-> </head> <h3> </h3> <H. action = "$ {pagecontext.request.contextPath} /User/login.qqi" method = "post"> <table> <tr> <td> username </td> <td> <Input Type = "Text" name = "loginName"/> </td> </tr> <tr> <td> phorsh </td> <td> <td> <td> <td> <td> <td> <td> name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <input type = "propect" value = "login"/> </td> </tr> </table> </form> </body> </html> src/struts.xml
<span style = "font-size: large;"> <? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Struts Public "-// Apache Software Foundation // DTD Конфигурация Struts 2.1.7 // en" http://struts.apache.org/dtds/struts-2.1.7.7.7.7.7.7.7.7.7.7.7.7 Метод кодирования параметров запроса-> <constant name = "struts.i18n.encoding" value = "utf-8"/> <!-Укажите тип суффикса запроса, обрабатываемый Struts2. Несколько разделены запятыми-> <constant name = "struts.action.extension" value = "action, do, go, qqi"/> <!-Когда Struts.xml изменяется, независимо от того, перезагрузите. Значение по умолчанию является false (используется в производственной среде), лучше всего открыть этап разработки-> <constant name = "struts.configuration.xml.reload" value = "true"/> <!-будь то режим разработки стойки. В модели разработки будет больше информации отладки. Значение по умолчанию является false (используется в производственной среде), и лучше открыть этап разработки-> <constant name = "struts.devmode" value = "false"/> <!-Установите, кэширует ли браузер статический содержимое. Значение по умолчанию верно (используется в производственной среде), лучше всего закрыть этап разработки-> <constant name = "struts.serve.static.browsercache" value = "false" /> <!-Укажите, что пружина отвечает за создание объекта действия <constant name = "struts.objectfactory" value = "spring" />-> <! name = "struts.enable.dynamicmethodinvocation" value = "false"/> </struts> </span>
LoginAction.java
пакет com.javacrazyer.web.action; импорт org.apache.struts2.convention.annotation.action; Импорт org.apache.struts2.convention.annotation.exceptionMapping; Импорт org.apache.struts2.convention.annotation.exceptionmappings; Импорт org.apache.struts2.convention.annotation.namespace; Импорт org.apache.struts2.convention.annotation.parentpackage; импорт org.apache.struts2.convention.annotation.result; Импорт org.apache.struts2.convention.annotation.results; Import Com.OpensyMphony.xwork2.ActionsUpport; /** * Используйте аннотации для настройки действия * */@parentpackage ("struts-default") // родительский пакет @namespace ("/user") @results ({@result (name = ", location =" /msg.jsp "), @Result (name =" error ", location ="/jerror. "java.lange.runtimeexception", result = "error")}) Общедоступное логинчение класса Extends kopporport {Private Static Long Long SerialVersionUID = -2554018432709689579L; частная строка LoginName; частная строка PWD; @Action (value = "login") public String login () Throws Exception {if ("qq" .equals (loginName) && "123" .equals (pwd)) {return успех; } else {return error; }} @Action (value = "add", results = {@Result (name = "success", location = "/index.jsp")}) public String add () Throws Exception {return Success; } public String getLoginName () {return LoginName; } public void setLoginName (string loginName) {this.loginName = loginName; } public String getPwd () {return pwd; } public void setPwd (String pwd) {this.pwd = pwd; }}
Я не буду публиковать успех.jsp и error.jsp
Объяснение конфигурации аннотации
1) @parentpackage Укажите родительский пакет
2) @namespace Укажите пространство имен
3) @Results
4) @Result (name = "успех", location = "/msg.jsp") отображение результатов
5) @Action (value = "login") Указывает URL -адрес запроса для метода обработки запроса. Обратите внимание, что он не может быть добавлен в класс действий, к методу.
6) @ExceptionMappings Array of Guide Declaration of Exclearations первого уровня
7) @ExceptionMapping Map Исключение объявления
Поскольку этот метод не очень часто используется, вы можете только его понять