1. Проблема поднятия
В Struts2, если реализован интерфейс ModelDiven <dolain>, в модель можно вводить передачи параметры, а модель можно использовать в действии, но что мне делать, если есть две модели, которые необходимо использовать в одном и том же действии? Например, в предыдущем разделе мы завершили функцию онлайн -оплаты, но платеж еще не закончился. Нам нужно получить отзыв информации от третьих лиц. Например, после успешного платежа нам нужно отправлять электронные письма и текстовые сообщения плательщику. Таким образом, нам также необходимо получить параметры, передаваемые от третьей стороны в оплате. Поскольку параметры, прошедшие от третьей стороны, отличаются от того, что мы проходили, мы должны написать модель (BackData), чтобы получить эти параметры. Таким образом, проблема в том, что наше выплата написано следующим образом: Public Class Payaction Extens Baseaction <SendData>, то есть интерфейс модели <sendData> был реализован в базеатровании. Итак, как мы получаем другую модель в действии и должны справиться с ними по -другому?
Существует решение (на самом деле, его нельзя назвать решением ... потому что оно не было решено вообще ...), которое состоит в том, чтобы написать модель и позволить SendData и Backdata наследовать ее, но проблема в том, что эти две модели не имеют ничего общего с ней. Зачем нам нужно наследовать ту же модель? Таким образом, это решение фактически избегает вышеуказанной проблемы.
Эта проблема хорошо решается в SpringMVC (SpringMVC действительно не начал учиться. Если вы говорите что -то не так, пожалуйста, исправьте это!), Поскольку каждый метод в SpringMVC соответствует модели, а не каждое действие соответствует модели, что является удобным. Я могу просто написать два метода в одном и том же действии, и разные методы имеют дело с разными моделями.
2. Решение проблемы
Struts2 также предоставляет решение этой проблемы:
Struts2 сохраняет много карт в ActionContext, таких как запрос, сеанс, приложение и т. Д., Упомянутые ранее. Существует также параметрический характер, который хранит все параметры запроса запроса. Пока наше действие реализует интерфейс параметров, мы можем получить эту параметрию. Это то же самое, что и модели. Если мы реализуем интерфейс ModelDriven <DOMEL>, то мы можем получить модель в действии, то есть определить модель и реализовать метод SET.
Хорошо, теперь проблема легко решить. Параметры оплаты и возвращенные параметры различны. То есть, параметры, которые дважды вводят оплату, отличаются, то есть данные, установленные в параметрической параме, дважды разные. Пока мы выбираем параметр в действии (параметр можно отличить от двух разных запросов) в качестве решения, мы будем знать, какую модель следует использовать для получения параметров (SendData или BackData). Давайте переписаем код в Payaction:
@Controller ("Payaction")@scope ("Прототип") Общедоступный класс Payaction расширяет базойкцию <объект> реализует параметры {// Обратите внимание, что SendData не может быть записана в базойкции, унаследованной выше. Вам нужно написать объект. Позже мы определим, какой из них использовать // определить карту для получения запроса частной карты <string, string []> параметров; @Override public void setParameters (map <string, string []> параметры) {this.parameters = parameters; } / *В статье struts-default.xml, перехватчика ServletConfig выполняется до модели, поэтому, когда мы вводим модель, параметр запроса уже доступен, поэтому мы можем использовать параметры в методе getModel (), чтобы определить, какой запрос используется Parameters * /@Override public getModel () { / /Там есть платежный Codeter Parameter (PLATERED (PlateD_PRID, но { /{ /Там есть платежный CODEDERED (PLATEREDED (PLAITED, но PAMEDATER (PAMED_PRID. не возвращается // Таким образом, мы можем использовать этот параметр, чтобы определить, выплачивается ли он или возвращается if (parameters.get ("pd_frpid")! = null) {model = new senddata (); } else {model = new BackData (); } return Model; } // Метод отправки данных в публичную строку yibao gobank () {// Соответствующая модель отправки: senddata senddata senddata = (senddata) модель; // Логика отправки данных была реализована в предыдущем разделе ...} // Метод получения возвращаемых данных public void Backbank () {// Соответствующая модель полученной модели: BackData BackData BackData = (BackData); // Логика обработки возвращаемых данных ... они будут реализованы позже, // точка знания Struts2 Первая обрабатывает несколько запросов модели}}}}}3. Поток обработки struts2
Давайте проанализируем процесс выполнения Struts2, который будет более благоприятным для понимания вышеуказанных принципов. Поток обработки стойки:
1) После получения запроса сначала создайте прокси действия, а затем создайте действие при создании прокси;
2) выполнить 18 перехватчиков, а затем вызовать метод действия после успешного выполнения перехвата;
3) После выполнения метода действия вызовут 18 перехватчиков. Таким образом, в соответствии с этим процессом, мы знаем: создать действие>, а затем выполнить перехватчик (сначала выполнить ServletConfig, затем выполнить моделидризирован, потому что перехватчик ServletConfig оснащен перед моделью). Таким образом, в приведенном выше коде мы можем использовать данные в параметрическом методе в методе getModel () для вынесения суждений.
Используйте следующую простую схему синхронизации, чтобы интуитивно представлять вышеуказанный поток обработки:
Это показывает поток обработки интуиции Struts2, поэтому легко понять вышеуказанные запросы на несколько моделей обработки. На этом этапе была проанализирована часть метода Struts2 для обработки нескольких запросов модели. Ниже приведена небольшая логика в этом проекте.
4. Улучшение метода получения данных
Логикой, лежащая в основе этого, является реализация логики, то есть обработка возвращаемых данных. Логика здесь в основном включает в себя: обновление статуса заказа (оплачиваемое, отправлено и т. Д.), Отправка электронных писем, отправка текстовых сообщений и т. Д. Сначала мы заполним статус заказа обновления, отправляем электронные письма и отправим текстовые сообщения в предмет, и мы напишем его позже.
Сначала улучшить метод Backbank ():
public void Backbank () {BackData BackData = (BackData) модель; System.out.println (модель); логический isok = payservice.checkbackdata (backdata); if (isok) {// 1. Обновите статус заказа, параметры передаются в соответствии с ситуацией в базе данных, используемых для тестирования Forderservice.updateStatusbyid (Integer.valueof (201605006), 2); // 2. Отправьте электронное письмо в соответствии с адресом электронной почты пользователя // 3. Отправить систему текстовых сообщений мобильного телефона.out.println ("---- Успех !! -----"); } else {System.out.println ("---- false !!! -----"); }}Затем мы завершаем метод контрольной защиты (BackData) в PayService (логика в основном такая же, как в разделе 21):
@Service ("PayService") открытый класс PayServiceImpl реализует PayService {// опустить нерелевантный код/*********************************** BackData) {// Приложение строки для подготовки к проверке шифрования stringBuffer InfoBuffer = new StringBuffer (); Infobuffer.append (backdata.getp1_merid ()); Infobuffer.append (backdata.getr0_cmd ()); Infobuffer.append (backdata.getr1_code ()); Infobuffer.append (backdata.getr2_trxid ()); Infobuffer.append (backdata.getr3_amt ()); Infobuffer.append (backdata.getr4_cur ()); Infobuffer.append (backdata.getr5_pid ()); Infobuffer.append (backdata.getr6_order ()); Infobuffer.append (backdata.getr7_uid ()); Infobuffer.append (backdata.getr8_mp ()); Infobuffer.append (backdata.getr9_btype ()); return infobuffer.toString (); } // Зашифруйте возвращаемые данные и сравните их с отправленным зашифрованным текстом. Если нормально, это означает, что данные не были подделаны. public boolean checkbackdata (backdata Backdata) {string joinparam = this.joinbackdataparam (backdata); // Получите собственную строку Ciphertext md5 = digestutil.hmacsign (joinparam.tostring (), key); // Сравнение зашифрованного текста с зашифрованным текстом, отправленным по возвращению md5.equals (backdata.gethmac ()); }}Наконец, мы завершаем метод UpdateStatusbyid в Forderservice:
// интерфейс ForderService Интерфейс общедоступный интерфейс ForderService Extens BaseService <forder> {// Опубликайте другие не связанные коды ... // Обновление статуса заказа в соответствии с номером заказа реализует ForderService {// Опустить другие не связанные с ними коды @Override public void updateStatusByid (int id, int sid) {string hql = "Обновление Forder f Set f.status.id =: sid, где f.id =: id"; getSession (). CreateQuery (hql) .setInteger ("sid", sid) .setInteger ("id", id) .executeUpdate (); }}Это позволит обновлять статус заказа после оплаты клиента.
Оригинальная ссылка: http://blog.csdn.net/eson_15/article/details/51465067
Вышеуказанное - все содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.