1. Meningkatkan masalah
Di Struts2, jika antarmuka ModelDriven <Model> diimplementasikan, parameter yang diteruskan dapat disuntikkan ke dalam model, dan model dapat digunakan dalam tindakan, tetapi apa yang harus saya lakukan jika ada dua model yang perlu digunakan dalam tindakan yang sama? Misalnya, di bagian sebelumnya, kami menyelesaikan fungsi pembayaran online, tetapi pembayaran belum berakhir. Kita perlu menerima umpan balik informasi dari pihak ketiga. Misalnya, setelah pembayaran yang berhasil, kita perlu mengirim email dan pesan teks ke pembayar. Jadi kita juga perlu mendapatkan parameter yang ditularkan dari pihak ketiga dalam pembayaran. Karena parameter yang ditularkan dari pihak ketiga berbeda dari yang dilewati oleh kami, kami harus menulis model (backdata) untuk menerima parameter tersebut. Jadi masalahnya adalah, Payaction kami telah ditulis sebagai berikut: Payaction kelas publik memperluas basa <sendData>, yaitu, antarmuka ModelDriven <SendData> telah diimplementasikan dalam basa. Jadi bagaimana kita menerima model lain dalam suatu tindakan dan harus menanganinya secara berbeda?
Ada solusi (sebenarnya, itu tidak dapat disebut solusi ... karena tidak diselesaikan sama sekali ...) yaitu menulis model dan kemudian membiarkan SendData dan backdata mewarisi itu, tetapi masalahnya adalah bahwa kedua model ini tidak ada hubungannya sama sekali, mengapa Anda perlu mewarisi model yang sama? Jadi solusi ini sebenarnya lolos dari masalah di atas.
Masalah ini diselesaikan dengan baik di SpringMVC (SpringMVC belum benar -benar mulai belajar. Jika Anda mengatakan sesuatu yang salah, harap perbaiki!) Karena setiap metode di SpringMVC sesuai dengan model, daripada setiap tindakan sesuai dengan model, yang nyaman. Saya hanya bisa menulis dua metode dalam tindakan yang sama, dan metode yang berbeda menangani model yang berbeda.
2. Solusi untuk masalah
Struts2 juga memberikan solusi untuk masalah ini:
Struts2 menyimpan banyak peta di ActionContext, seperti permintaan, sesi, aplikasi, dll. Disebutkan sebelumnya. Ada juga parameterMap, yang menyimpan semua parameter permintaan dari permintaan. Selama tindakan kami mengimplementasikan antarmuka ParameterAware, kami bisa mendapatkan parameterMap ini. Ini sama dengan ModelDriven. Jika kami mengimplementasikan antarmuka ModelDriven <Model>, maka kami bisa mendapatkan model dalam tindakan, yaitu, tentukan model dan terapkan metode yang ditetapkan.
Oke, sekarang masalahnya mudah dipecahkan. Parameter pembayaran dan parameter yang dikembalikan berbeda. Dengan kata lain, parameter yang memasukkan Payasition dua kali berbeda, yaitu data yang diinstal dalam parameterMap dua kali berbeda. Selama kami memilih parameter dalam tindakan (parameter dapat dibedakan dari dua permintaan permintaan yang berbeda) sebagai penilaian, kami akan tahu model mana yang harus digunakan untuk menerima parameter (sendData atau backdata). Mari kita tulis ulang kode dalam Payaction:
@Controller ("PayAction")@scope ("prototipe") Payaction kelas publik memperluas basa <POMPERTIF> mengimplementasikan ParameterAware {// Perhatikan bahwa SendData tidak dapat ditulis dalam basa yang diwarisi di atas. Anda perlu menulis objek. Nanti, kami akan menentukan mana yang akan digunakan // menentukan peta untuk menerima permintaan peta pribadi <string, string []> parameter; @Override public void setParameters (peta <string, string []> parameter) {this.parameters = parameter; } / *Dalam artikel Struts-Default.xml, Interceptor ServletConfig dieksekusi sebelum ModelDriven, jadi ketika kita menyuntikkan model, parameter permintaan sudah tersedia, jadi kita dapat menggunakan parameter dalam metode getModel () {) {) {) paying yang digunakan oleh Parameter * /@Override Objek publik GetModel () {) {) tidak mengembalikan // dengan cara ini kita dapat menggunakan parameter ini untuk menentukan apakah dibayar atau dikembalikan jika (parameter.get ("pd_frpid")! = null) {model = sendData baru (); } else {model = new BackData (); } model return; } // Metode untuk mengirim data ke YIBAO Public String gobank () {// Model Terkirim yang Terkait: Model SendData SendData SendData = (SendData); // Logika pengiriman data telah diimplementasikan di bagian sebelumnya ...} // Metode menerima data public void backbank () {// Model yang Diterima: Model BackData BackData = (backdata) yang sesuai; // Logika penanganan data yang dikembalikan ... itu akan diimplementasikan nanti, // Titik pengetahuan Struts2 pertama menangani beberapa permintaan model}}3. Aliran pemrosesan struts2
Mari kita analisis proses eksekusi Struts2, yang akan lebih kondusif untuk memahami prinsip -prinsip di atas. Aliran pemrosesan struts:
1) Setelah mendapatkan permintaan, pertama -tama buat proxy tindakan, dan kemudian buat tindakan saat membuat proxy;
2) mengeksekusi 18 interseptor, dan kemudian memanggil metode tindakan setelah pencegat dieksekusi dengan sukses;
3) Setelah metode tindakan dieksekusi, 18 pencegat dipanggil. Jadi menurut proses ini, kita tahu: pertama -tama buat tindakan> dan kemudian jalankan pencegat (pertama -tama jalankan servletconfig, kemudian jalankan ModelDriven, karena pencegat servletconfig dilengkapi di depan ModelDriven). Jadi dalam kode di atas, kita dapat menggunakan data dalam parameterMap dalam metode getModel () untuk membuat penilaian.
Gunakan diagram waktu sederhana berikut untuk secara intuitif mewakili aliran pemrosesan di atas:
Ini menunjukkan aliran pemrosesan intuisi Struts2, sehingga mudah untuk memahami banyak permintaan model pemrosesan di atas. Pada titik ini, bagian dari metode Struts2 untuk menangani beberapa permintaan model telah dianalisis. Berikut ini adalah logika kecil dalam proyek ini.
4. Tingkatkan metode menerima data
Logika di balik ini adalah implementasi logika, yaitu memproses data yang dikembalikan. Logika di sini terutama meliputi: memperbarui status pesanan (dibayar, dikirim, dll.), Mengirim email, mengirim pesan teks, dll. Kami pertama -tama akan menyelesaikan status pesanan pembaruan, mengirim email dan mengirim pesan teks ke subjek, dan kami akan menulisnya nanti.
Pertama tingkatkan metode backbank ():
public void backbank () {backdata backdata = (backdata) model; System.out.println (model); boolean isok = payservice.checkbackData (backdata); if (isok) {// 1. Perbarui status pesanan, parameter ditransmisikan sesuai dengan situasi dalam database, yang digunakan untuk menguji forderservice.updatestatusById (integer.valueof (201605006), 2); // 2. Kirim email sesuai dengan alamat email pengguna // 3. Kirim Sistem Pesan Teks Ponsel.out.println ("---- Sukses !! -----"); } else {system.out.println ("---- false !!! -----"); }}Kemudian kami menyelesaikan metode checkbackdata (backdata) di payservice (logika pada dasarnya sama seperti pada bagian 21):
@Service("payService")public class PayServiceImpl implements PayService { //Omit irrelevant code/*************************************** above is the method to send the request*******************************************************/ // Complete the append private String joinBackDataParam(BackData backdata) {// Tambahkan string untuk mempersiapkan verifikasi enkripsi 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 (); } // Enkripsi data yang dikembalikan dan bandingkan dengan ciphertext yang dikirim. Jika OK, itu berarti data belum dirusak. public boolean checkbackData (backdata backData) {string gognParam = this.joinbackDataParam (backData); // Dapatkan string ciphertext Anda sendiri md5 = digestutil.hmacsign (joinparam.tostring (), key); // Perbandingan ciphertext dengan ciphertext yang dikirim lebih dari pengembalian md5.equals (backdata.gethmac ()); }}Akhirnya, kami menyelesaikan metode UpdateStatusById di Forderservice:
//ForderService interface public interface ForderService extends BaseService<Forder> { //Omit other unrelated codes... //Update the order status according to the order number public void updateStatusById(int id, int sid);}//ForderServiceImpl implementation class @Service("forderService")public class ForderServiceImpl extends BaseServiceImpl<Forder> Implement ForderService {// hilangkan kode lain yang tidak terkait @Override public void updateStatusById (int id, int sid) {string hql = "update forder f set f.status.id =: sid di mana f.id =: id"; getSession (). Createqueery (HQL) .setInteger ("Sid", Sid) .setInteger ("id", id) .executeUpdate (); }}Ini akan memungkinkan status pesanan diperbarui setelah pelanggan membayar.
Tautan asli: http://blog.csdn.net/eson_15/article/details/51465067
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.