Artikel ini terutama mengimplementasikan fungsi penerusan permintaan Struts. Fungsi lain perlahan -lahan akan membentuk.
Baru -baru ini, saya mempelajari konten Javassist, dan saya melihat sebuah artikel.
Berikut adalah kerangka kerja Struts2 sederhana, dan pada saat yang sama, Anda menambahkan beberapa pemahaman Anda sendiri.
Artikel ini terutama mengimplementasikan fungsi penerusan permintaan Struts. Fungsi lain perlahan -lahan akan membentuk.
Pertama -tama, dalam kerangka struts2, implementasi dan lompatan permintaan terutama dikonfigurasi oleh struts.xml. Label <Action> menunjukkan definisi permintaan, yang berisi nama "nama" dari permintaan; Label <result "mendefinisikan tipe" nama "hasil, termasuk 'sukses', 'tidak ada', 'login', 'input', 'kesalahan'; ② tipe" tipe ", termasuk 'dispatcher (default)' '', 'Chain', 'Redirect', 'Redirectaction', 'Stream'; Setelah mengkonfigurasi struts.xml, formulir di antarmuka dapat menemukan tag tindakan yang sesuai melalui nilai atribut nama yang ditentukan oleh properti tindakan, sehingga dapat menemukan kelas yang sesuai dan metode eksekusi. Kemudian cocokkan string string yang dikembalikan dengan metode eksekusi untuk mencocokkan nama di tag hasil, dan lakukan operasi permintaan berikutnya sesuai dengan tipe tipe yang ditentukan.
Nah, setelah memahami bagaimana Struts2 menghubungkan antarmuka yang meminta fungsi program yang sama, kami dapat mengimplementasikan bagian fungsi ini melalui kode kami sendiri.
Jadi bagaimana kita memulai?
Kami akan dibagi menjadi dua bagian dengan fungsi sederhana ①Action Part ②Besult bagian
bagian aksi
① Kita perlu menemukan kelas yang sesuai dan metode eksekusi sesuai dengan permintaan antarmuka
bagian hasil
① Kita perlu mengembalikan string tipe 'kesuksesan', 'tidak ada', 'login', 'input', dan 'kesalahan'
② Berbagai jenis alamat permintaan perlu ditentukan untuk berbagai jenis pengembalian
③ Jenis yang perlu didefinisikan, termasuk 'Dispatcher (default)', 'Chain', 'Redirect', 'Redirectaction', 'Stream'
Dalam artikel ini, jenis hasil pengembalian hanya mewujudkan dua jenis 'keberhasilan' dan 'login', dan untuk saat ini, mereka tidak mempertimbangkan jenis permintaan. Fungsi yang sempurna akan diisi ulang nanti.
Kemudian, mari kita lihat bagaimana mencapai fungsi di atas melalui kode.
Pertama, dua anotasi khusus dari ActionAnnotation dan RACKAnnotation meminta metode dan metode yang sesuai dari string yang dikembalikan oleh dua anotasi khusus dari tindakan
/ ** * Catatan: ActionName setara dengan URL -Pattern * @author linling * */ @retention (retentionPolicy.runtime) @targetype.method blic @interface ActionNotation {string actionName () default ""; () default {};} /*** Kembali ke objek anotasi: Nama setara dengan nama hasil dalam konfigurasi struts, termasuk 'Sukses', 'None', 'Error', 'Input.' Login '; () default "index.jsp";}
Kemudian kami mendefinisikan kelas ActionContext untuk menyimpan konten yang diperlukan untuk permintaan
/*** Menerapkan lompatan struts simulasi ke konten yang diperlukan untuk menjalankan metode yang sesuai sesuai dengan file konfigurasi*@author linling **/class public ActionContext {/*** setara dengan url -pattern di web.xml, the hanya* /private string url; /*** Metode ActionAnnotation, yaitu metode untuk dieksekusi dalam metode string Action* /Private; Misalnya: 'Sukses'; Tindakan Objek Pribadi; * / Private String [] ActionParamSname;
Analysepackage adalah metode yang diperlukan untuk merakit ActionContext
/** * Melintasi file kelas di bawah paket SCAN_Package, yang menggunakan metode ActionAnnotation untuk menganalisisnya, merakitnya menjadi objek ActionContext dan memasukkannya ke dalam urlmap * @param real_path scan_package * @thro ws classnotfoundException * @THROWSEXCEPTION * @thro ws classnotfoundException * @ThrowsException * @thro ws classnotfoundException * @Throws IllegalAccessException * @throws notfoundException */ public static void analysePackage (String real_path, string scan_package foundException, instantifikasi exception, ilegalAccessException, notfoundException {file = new file (real_path); if (File.isdircception {File = new file (real_path); if (File.isdirk ] ILES = File.ListFiles (); Classstype = class.forname (nama file); .GetAnnotation (ActionAnnotation.class); Metode Annitation Error! " + Metode +", ActionName: " + URL +", hasilnya. ; adalah null ");} map.put (result.name (), value);} actionContext.setResults (peta); ACT ioncontext.setClasStype (classtype); actionContext. setAction (classtype.newinstance ()); actionContext.setParamStype (classtype.newinstance ()); actionContex Method.getParametertypes ());
GetParams adalah array parameter permintaan berdasarkan konten permintaan dalam permintaan httpservletrequest.
/** * Berdasarkan parameter tipe parastype dan nama parameter actInparamsname untuk menganalisis permintaan permintaan untuk membangun objek parameter [] * @param permintaan * @paramStype * @param actionParamSname * @retourn * @throws InstantiationException * @Throws IllegalAccessEnception * @ @ @ throws Illegalargumentexception * @ @ @ @ @ @ @ Throws InvolutionAntargetexception * @throws NosuchmedHodexception * @throws SecurityException */ Public Static Object [] Quest Request, Class <?> [] ParamStype, String [] ActionParamsName) Throws InstantiationException, IlLegalaCcessException, IlLegalagumentedException, Invocat IonTargexception, NosuchMethodeException, SecurityException {objek [objek] objek = objek baru [ParamStype.length]; Parampe Style [i])) {objek [i] = paramsutils.getParam (permintaan, paramstye [i], actionParamSname [i]);} else {class <?> Classtype = paramstype [i]; classStye.getDetDeclardFields (); untuk (bidang bidang: bidang) {peta <string, string []> peta = request.getParametermap (); ) {{String key = iterator.next (); Panjang! = 2) {Lanjutkan;} if (! ActionParamSname [i] .Equals (strs [0])) {lanjutan;} if (! Field.getName (). Nilai String = Map.get (Key) [0]; } Mengembalikan objek;}
Oke, selanjutnya. Kami dapat mengimplementasikan metode tindakan
Loginaksi kelas publik {@ActionNotation (actionName = "login.action", result = {@resultanitation (name = resultType.success, value = "i ndex.jsp"),@resultannotation (name = resultType.login, value = "Login"),@ Jsp ")}) Publik Hasil Login (Nama String, Kata Sandi String) {if (" Hello ".Equals (Name) &&" World ". (ActionName = "LoginForUse.action", result = {@RESInotation (name = hasilnya (Nomor int, loginpojo LOGINPOJO) {if ("hello".
Selanjutnya, yang perlu kita lakukan adalah memungkinkan program untuk melintasi semua metode dalam direktori kerja saat memulai, dan menggunakan metode ActionAnnotation untuk mengetahuinya dan merakitnya menjadi ActionContext. Dengan cara ini, ketika permintaan tiba, kita dapat menemukan ActionContext yang sesuai sesuai dengan alamat permintaan, dan memanggil metode dengan mekanisme refleksi.
Kami mengatur dua servlet. Satu digunakan untuk melakukan program inisialisasi. Satu digunakan untuk memfilter semua permintaan tindakan
<servlet> <servlet> strutsinitservlet </servlet-name> <servlet-class> com.bayern.struts.servletsinitservlet </servlet-class> <ar am-name> scan_package </param-name> <param-value> com .Bayern.struts.one </param-value> </init-param> <Boad-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> <ratl-pola>*. Pemetaan servlet>
DispatcherServlet mengimplementasikan pemfilteran permintaan tindakan yang digunakan, dan memungkinkannya untuk menjalankan metode tindakan yang sesuai, dan membuat lompatan berikutnya
Ublic void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar layanan).; (Request, ActionContext.GetParamStype (), ActionContext.GetAcparamSname ()); .Getaction (), params);
Nah, sekarang kami telah mengimplementasikan fungsi Penerusan Permintaan Strut2 yang paling sederhana. Fungsinya sangat kasar, dan banyak kasus belum mempertimbangkannya.
Di atas adalah semua isi artikel ini.