1。問題の上昇
struts2では、モデル駆動型<model>インターフェイスが実装されている場合、渡されたパラメーターをモデルに注入でき、モデルをアクションで使用できますが、同じアクションで使用する必要がある2つのモデルがある場合はどうすればよいですか?たとえば、前のセクションでは、オンライン支払い機能を完了しましたが、支払いはまだ終了していません。第三者から情報フィードバックを受け取る必要があります。たとえば、支払いが成功した後、電子メールとテキストメッセージを支払人に送信する必要があります。そのため、支払いの第三者から渡されたパラメーターを取得する必要があります。サードパーティから渡されたパラメーターは、当社が渡されたパラメーターとは異なるため、これらのパラメーターを受信するにはモデル(バックダタ)を作成する必要があります。したがって、問題は、私たちの支払いが次のように書かれていることです。パブリッククラスの支払いは、ベースアクション<senddata>、つまり、モデル駆動型<senddata>インターフェイスがベースアクションに実装されています。では、アクションで別のモデルをどのように受け取り、それらを異なる方法で処理する必要があるのでしょうか?
解決策があります(実際には、解決策と呼ばれることはできません...それはまったく解決されていないからです...)それはモデルを書き、SendDataとバックダタにそれを継承させることですが、問題はこれらの2つのモデルがそれとはまったく関係がないことです。なぜ同じモデルを継承する必要があるのですか?したがって、このソリューションは実際に上記の問題を逃れています。
この問題はSpringMVCでうまく解決されます(SpringMVCは実際には学習を開始していません。何か間違っていると言ったら、修正してください!)SpringMVCの各方法は、各アクションがモデルに対応するのではなく、モデルに対応するためです。同じアクションで2つの方法を書くことができ、さまざまな方法で異なるモデルを扱います。
2。問題の解決策
Struts2は、この問題の解決策も提供します。
Struts2は、リクエスト、セッション、アプリケーションなど、ActionContextに多くのマップを保存します。また、リクエストのすべての要求パラメーターを保存するparametermapもあります。アクションがパラメータウェアインターフェイスを実装する限り、このparametermapを取得できます。これはモデル駆動型と同じです。 ModelDriven <model>インターフェイスを実装すると、アクションでモデルを取得すること、つまりモデルを定義してSETメソッドを実装できます。
さて、問題は簡単に解決できます。支払いパラメーターと返されたパラメーターは異なります。つまり、Payacitionに2回入力するパラメーターは異なります。つまり、Parametermapに2回インストールされているデータは異なります。判断として、アクション内のパラメーター(パラメーターを2つの異なるリクエスト要求と区別できます)を選択する限り、パラメーター(SendDataまたはBackdata)を受信するために使用するモデルを使用するかがわかります。 Payactionでコードを書き直しましょう。
@Controller( "Payaction")@scope( "Prototype")Public class Payactionは、BaseeAction <Object>を実装します{//上記の継承されたBaseActionでSendDataを書き込むことはできないことに注意してください。オブジェクトを書く必要があります。後で、どの使用を使用するかを決定します//マップを定義してリクエストプライベートマップ<String、String []>パラメーターを受信します。 @Override public void setParameters(map <string、string []> parameters){this.parameters = parameters; } / *struts-default.xmlの記事では、Modeldivenの前にServletconfigインターセプターが実行されるため、モデルを挿入すると、リクエストパラメーターが既に使用可能であるため、パラメーター()のパラメーターを使用してパラメーターで使用できます。 //このようにしても、この方法でこのパラメーターを使用して、支払または返されるかどうかを判断できます(parameters.get( "pd_frpid")!= null){model = new SendData(); } else {model = new backdata(); } return Model; } // yibaoにデータを送信する方法public string gobank(){//対応する送信モデル:senddata senddata senddata =(senddata)モデル。 //データの送信ロジックは前のセクションに実装されています...} //返されたデータを受信する方法public void backbank(){//対応する受信モデル:backdata backdata backdata =(backdata)モデル。 //返されたデータを処理するロジック...それは後で実装されます、// struts2の知識ポイントは複数のモデル要求}}}}}}3。Struts2処理フロー
Struts2の実行プロセスを分析しましょう。これは、上記の原則を理解するためにより助長されます。ストラット処理フロー:
1)リクエストを取得した後、最初にアクションのプロキシを作成し、次にプロキシを作成するときにアクションを作成します。
2)18個のインターセプターを実行し、インターセプターが正常に実行された後、アクションメソッドを呼び出します。
3)アクションメソッドが実行された後、18個のインターセプターが呼び出されます。したがって、このプロセスによれば、アクション>を作成し、インターセプターを実行します(最初のServletConfigを実行してから、ModelDivenの前にServletConfigインターセプターが装備されているため、Modeldivenを実行します)。したがって、上記のコードでは、getModel()メソッドのparametermapのデータを使用して、判断を下すことができます。
次の簡単なタイミング図を使用して、上記の処理フローを直感的に表します。
これは、Struts2の直観の処理フローを示しているため、上記の処理複数のモデル要求を理解するのは簡単です。この時点で、複数のモデル要求を処理するStruts2の方法の部分が分析されました。以下は、このプロジェクトの小さなロジックです。
4。データを受信する方法を改善します
この背後にあるロジックは、ロジックの実装、つまり返されたデータを処理することです。ここでのロジックには、主に次のものが含まれます。注文ステータス(有料、出荷など)の更新、電子メールの送信、テキストメッセージの送信など。最初に更新注文ステータスを完成させ、電子メールを送信し、テキストメッセージを主題に送信します。
最初にバックバンク()メソッドを改善します:
public void backbank(){backdata backdata =(backdata)モデル; System.out.println(モデル); boolean isok = payservice.checkbackdata(backdata); if(isok){// 1。順序ステータスを更新すると、パラメーターはデータベースの状況に従って送信され、forderservice.updatestatusbyid(integer.valueof(201605006)、2)をテストするために使用されます。 // 2。ユーザーのメールアドレスに従ってメールを送信します// 3。携帯電話のテキストメッセージsystem.out.println( "----成功!! -----"); } else {system.out.println( "---- false !!! -----"); }}次に、PayServiceでCheckbackData(BackData)メソッドを完了します(ロジックは基本的にセクション21と同じです)。
@Service( "Payservice")Public Class PayserviceImpl Infermes 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()); infobuffer.toString()を返します。 } //返されたデータを暗号化し、それを送信した暗号文と比較します。 OKであれば、データが改ざんされていないことを意味します。 public boolean checkbackdata(backdata backdata){string joinparam = this.joinbackdataparam(backdata); //独自のciphertext文字列md5 = digestutil.hmacsign(joinparam.tostring()、key)を取得します。 // ciphertextとciphertextとreturn md5.equals(backdata.gethmac()); }}最後に、forderserviceでupdatestatusbyidメソッドを完了します。
// forderserviceインターフェイスパブリックインターフェイスforderservice拡張baseService <forder> {//他の無関係なコードを省略します... //注文番号に従って注文ステータスを更新しますpublic upuld updatestatusbyid(int id、int sid);} // forderserviceimpl実装@service( "forderservice forderservice forderservice forderservice forderser forderserviceを実装{//他の無関係なコード@Override public boid uptatestatusbyid(int id、int sid){string hql = "update forder f set f.status.id =:sid where f.id =:id"; getsession()。create query(hql).setinteger( "sid"、sid).setinteger( "id"、id).executeupdate(); }}これにより、顧客が支払った後に注文ステータスを更新できます。
オリジナルリンク:http://blog.csdn.net/eson_15/article/details/51465067
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。