Эта статья в основном реализует функцию переадресации запросов Struts. Другие функции будут медленно составлены.
Недавно я выучил содержание Javassist, и я увидел статью.
Вот простая структура Struts2, и в то же время вы добавляете немного своего собственного понимания.
Эта статья в основном реализует функцию переадресации запросов Struts. Другие функции будут медленно составлены.
Прежде всего, в рамках Struts2 реализация и прыжок запросов в основном настроены struts.xml. <ceply> метка указывает определение запроса, которое содержит имя «Имя» запроса; <Результат «Метка определяет тип« Имя »результата, включая« успех »,« none »,« login »,« input »,« error »; ② Тип« Тип », включая« диспетчер (по умолчанию) » '', 'Chain', 'redirect', 'redirectaction', 'Stream'; После настройки struts.xml форма в интерфейсе может найти соответствующий тег действия через значение атрибута имени, определяемое свойством действия, чтобы найти соответствующие методы класса и выполнение. Затем сопоставьте строку String String, возвращаемую методом выполнения, чтобы соответствовать имени в теге результата, и выполните следующую операцию запроса в соответствии с определенным типом типа.
Что ж, после понимания того, как Struts2 соединяет интерфейс, запрашивающий ту же функцию программы, мы можем реализовать эту часть функции через наш собственный код.
Итак, как мы можем начать?
Мы будем разделены на две части с простыми функциями ①action part ②result part
часть действия
① Нам нужно найти соответствующие методы класса и выполнение в соответствии с запросом интерфейса
Результат части
① Нам нужно вернуть тип строки «успеха», «нет», «логин», «вход» и «ошибка»
② Необходимо указать разные типы адреса запроса для различных типов возврата
③ Типы, которые необходимо определить, в том числе «диспетчер (по умолчанию)», «цепь», «перенаправление», «redirectaction», «поток»
В этой статье типы возврата только реализуют два типа «успеха» и «логин», и в настоящее время реализованы тип запроса по умолчанию. Идеальная функция будет пополнена позже.
Затем давайте посмотрим, как достичь вышеуказанной функции через код.
Во -первых, два пользовательских аннотации действий и запрашиваемого запроса о соответствующем методе и методе строки, возвращаемых двумя пользовательскими аннотациями действий
/ ** * Примечание () по умолчанию {};} /*** Вернуться к объекту аннотации: Имя эквивалентно имени результата в конфигурации стойки, включая «успех», «нет», «ошибка», «Ввод». Вход в систему; () по умолчанию "index.jsp";}
Затем мы определяем класс ActionContext для сохранения контента, необходимого для запроса
/*** Реализовать симуляционные стойки, которые прыгают к контенту, необходимому для выполнения соответствующего метода в соответствии с файлом конфигурации*@author linling **/public class actioncontext {/*** эквивалент url -pattern в web.xml, только* /частная строка URL; Например: «Успех»; Приятный объект Действие; / *** Тип параметра метода* / * / Private String [] ActionParamSname;
AnalysePackage - это метод, необходимый для сборки ActionContext
/** * Провернул файл класса в пакете Scan_package, который использует метод действия ActionAnnotation для анализа, собрал его в объект ActionContext и поместите его в urlmap * @param Real_path scan_package * @thro ws classnotfoundexcept @Throws allogalAccessException * @Throws notFoundException */ public static void analysePackage (string real_path, string scan_package sudexception, instantificationexception, allodalaccessexception, notFoundExcept ] files = file.listfiles (); Classstype = class.forname (filename); . Getannotation (actionAnnotation.class); Метод ошибка аннигации! " + Method +", actionName: " + url +", result.length: " + results.lengts.lengt h);} actioncontext.seturl (url); actiontextext.setmethod (method.getName ()) ; is null ");} map.put (result.name (), value);} actioncontext.setresults (map); act yoncontext.setClasstype (classtype); actionContext. setAction (classtype.newinstance ()); Method.getParameterTypes ());
GetParams - это массив параметров запроса, основанный на содержании запроса в запросе httpservlectrequest.
/** * На основе типа параметра парастипа и имени параметра ActinParamSname для анализа запроса запроса на создание объекта параметра [] * @param запрос * @paramstype * @param actionparamsname * @retourn * @Throws instantiationExcept бросает allosalArgumentException * @ @ @ @ @ @ Throws intientationAntArgetException * @Throws nosuchmedHodexception * @Throws SecurityException */ public Static Object [] QUEST, Class <?> [] Paramstype, String [] ActionParamSname) Things InstantiationExcept INVOCAT Iontargexception, nosuchmethodexception, SecurityExcept {Object [Object] Object = New Object [paramstype.length]; Parampe Style [i])) {Objects [i] = paramsutils.getParam (запрос, paramstype [i], actionparamsname [i]);} else {class <?> Classtype = paramstype [i]; ClassStype.getDetDeclardFields (); ) {{String key = iterator.next (); Длина! String = map.get (key) [0]; } Возвращать объекты;}
Хорошо, дальше. Мы можем реализовать метод действия
Общедоступный вход в класс {@ActionNotation (actionName = "login.action", results = {@ResultAnitation (name = recordType.success, value = "i ndex.jsp"),@resultAnanotation (name = reculatype.login, value = "login .. JSP ")}) Общественный результат (ActionName = "LoginForuse.Action", Results = {@Resannotation (name = recordyTpe.success, value = "indexp") Otary (name = refultype.login, value = "login.jsp")})}) (Int №, loginpojo loginpojo) {if ("hello" .equals (loginpojo.getUsername ()) && "world" .equojo.getpa sword ())) {return outdettype.success;} return outpertype.login;}}
Далее, что нам нужно сделать, это позволить программе пройти все методы в рабочем каталоге при запуске, и использовать метод ActionAnnotation, чтобы узнать и собрать ее в ActionContext. Таким образом, когда запрос прибывает, мы можем найти соответствующий ActionContext в соответствии с адресом запроса и вызвать метод с помощью механизма отражения.
Мы установили два сервлета. Один используется для выполнения программ инициализации. Один использовался для фильтрации всех запросов действий
<Servlet> <vervlet> strutsinitservlet </servlet-name> <verlet-class> com.bayern.struts.servletsinitservlet </servlet-class> <par am-name> scan_package </param-name> <param-value> com .Bayern.struts.one </param-value> </init-param> <load-on-startup> 10 </load-startup >> <servlet-name> dispatcherservlet </servlet-name> <servlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet mapping </servlet-mapping> <servlet-name> dispatcherservlet </servlet-name> <url-pattern>*. Сервлетовое картирование>
DispatcherServlet реализует фильтрацию используемого запроса действия и позволяет ему выполнить соответствующий метод действия и сделать следующий прыжок
Ublic void dopost (httpservletrequest, httpservletresponse ответ). (ActionContext.getParamStype (), ActionContext.getActionParamSname ()); .GetAction (), Params);
Что ж, теперь мы реализовали самую простую функцию пересылки Strut2 Framework. Функция очень грубая, и многие случаи еще не рассматривали ее.
Выше всего содержимое этой статьи.