1. Interceptor di Struts2 (Frame Function Core)
1. Filter vs Interceptor
Fungsi filter vs interseptor adalah satu hal. Filter adalah teknologi dalam spesifikasi servlet yang dapat memfilter permintaan dan tanggapan.
Pencegatan adalah teknologi dalam kerangka kerja Struts2, menerapkan ide pemrograman AOP (berorientasi pada bagian), yang dapat dicegat dan dapat dicegat sebelum atau setelah mengakses metode tindakan tertentu.
Stack Interceptor: Bergabunglah dengan Pencegat ke dalam rantai dalam urutan tertentu. Saat mengakses metode pencegat, pencegat dalam rantai interseptor Struts2 akan dipanggil secara berurutan dalam urutan yang sebelumnya mereka tentukan.
Prinsip Eksekusi Struts2 - Analisis Yang Mendasari
2. Interceptor khusus
Struts2 mendefinisikan antarmuka interceptor Interceptor Interceptor.
Ada tiga metode abstrak di antarmuka interseptor
• Init: Metode ini akan dipanggil segera setelah pencegat dibuat, dan itu akan dipanggil hanya sekali selama kehidupan pencegat. Sumber daya yang relevan dapat diinisialisasi dalam metode ini.
• Interecept: Metode ini akan dipanggil sekali setiap kali permintaan tindakan dicegat.
• Hancurkan: Metode ini akan dipanggil sebelum interseptor dihancurkan, dan hanya akan dipanggil sekali selama siklus hidup Interceptor.
Struts pada gilirannya akan memanggil metode intersep dari setiap interseptor yang terdaftar oleh programmer untuk suatu tindakan. Setiap kali metode intersep dipanggil, Struts akan melewati instance dari antarmuka ActionInvocation.
ActionInvocation: mewakili status eksekusi dari suatu tindakan yang diberikan. Interceptor dapat memperoleh objek tindakan dan objek hasil yang terkait dengan tindakan dari objek kelas ini. Setelah menyelesaikan tugas pencegat sendiri, pencegat akan memanggil metode Invoke dari objek ActionInvocation ke langkah berikutnya dalam proses pemrosesan tindakan.
Anda juga dapat menghubungi metode addPreresultListener dari objek ActionInvocation untuk "menggantung" satu atau lebih pendengar pra -preresultlistener. Objek pendengar ini dapat melakukan sesuatu sebelum mulai menjalankan hasil tindakan setelah tindakan dieksekusi.
Langkah -langkah pencegat khusus:
A. Tulis kelas untuk mengimplementasikan antarmuka com.opensymphony.xwork2.interceptor.interceptor, atau warisan
com.opensymphony.xwork2.interceptor.AbstractInterceptor kelas. (Mode adaptor), umumnya memilih untuk mewarisi AbstractInterceptor (Interceptor akan tinggal di memori). Karena kelas AbstractInterceptor mengimplementasikan antarmuka interceptor. Ini memberikan implementasi kosong untuk init dan hancur
Tulis dua interseptor interseptordemo1, dan interseptordemo2
Paket com.itheima.interceptor; impor com.opensymphony.xwork2.actioninvocation; impor com.opensymphony.xwork2.interceptor.AbstractInterceptor; Public Class Interceptordemo1 Memperluas AbstractInterceptor {// Metode ini disebut setiap kali tindakan diakses Public String Intercept (ActionInvocation) (ActionInvocation) (Action) (Action Invication (Action Invication (Action Invication. String rtvalue = invocation.invoke (); // rilis, mengapa string kembali di sini? Karena hasil akhir mengembalikan hasil tindakan, dan hasil dari tindakan tersebut adalah string type system.out.println ("intercept demo1"); mengembalikan rtvalue; }} paket com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; impor com.opensymphony.xwork2.interceptor.AbstractInterceptor; impor com.opensymphony.xwork2.interceptor.preresultListener; Intercept (ActionInVocation Invocation) melempar Exception {// Invocation.AddpreresultListener (new preresultListener () {// // public void beForeresult (ActionInvocation Invocation, String hasil) {// System.out.println ("Sebelum hasil yang ditampilkan");/// {}); System.out.println ("Sebelum Demo2 Intercept"); String rtvalue = Invocation.Invoke (); // Release System.out.println ("Demo2 yang Dicegur"); mengembalikan rtvalue; }}B. Perlu didefinisikan dalam struts.xml, mendefinisikan interseptor, dan mendefinisikannya terlebih dahulu sebelum digunakan.
<nama paket = "p1" extends = "struts-default"> <!-Definition Interceptor: Hanya valid untuk paket saat ini-> <interceptor name = "interceProtDemo1"> </sterceptor> <sterceptor name = "interceProtDemo2"> </interceptor> </interceptor> </Interceptor>
C. Itu dapat digunakan dalam konfigurasi tindakan
<action name = "action1" Method = "Execute"> <!- Gunakan interseptor yang ditentukan. Jika tidak ada interseptor yang ditentukan, semua pencegat di tumpukan stack default digunakan secara default; Setelah setiap interseptor ditentukan, defaultnya tidak valid-> <interceptor-ref name = "interceProtDemo1"> </sterceptor-ref> <ePerceptor-ref name = "interceProtDemo2"> </sectceptor-ref> <rances> /success.jsp </result> </action>
Menerapkan Demo1Action Kelas Tindakan
Paket com.itheima.action; impor com.opensymphony.xwork2.actionsupport; Demo Public Class memperluas ActionSupport {@Override Public String Execute () melempar Exception {System.out.println ("Execute Executeed"); Sukses kembali; }}Hasil berjalan
Karena fungsi seperti unggahan file, verifikasi data, merangkum parameter permintaan untuk bertindak di Struts2 diimplementasikan oleh pencegat di status default default sistem, pencegat yang kami definisikan perlu merujuk pada staf default default sistem, sehingga aplikasi dapat menggunakan banyak fungsi yang disediakan oleh struts2 frams2.
Jika tidak ada interseptor yang ditentukan, semua pencegat di tumpukan stack default digunakan secara default; Setelah pencegat ditentukan, standarnya tidak valid. Selain menggunakan pencegat khusus, Anda juga perlu menggunakan DefaultStack. Anda bisa melakukan ini
Metode 1: (Digunakan sendiri), cukup konfigurasikan aksi khusus dan default.
Metode 2: (Ketika semua orang menggunakannya), jika Anda ingin semua tindakan di bawah paket untuk menggunakan pencegat khusus, Anda perlu menggunakan stack stack stack interceptor, mendefinisikan stack interceptor, dan kemudian dalam aksi, Anda dapat mendefinisikan interceptor sebagai interseptor default melalui name candepor-mydepor-mydepor = "mydefault"/, dan name-mydeFiult.
<interceptors> <interceptor name="interceprotDemo1"></interceptor> <interceptor name="interceprotDemo2"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="interceprotDemo1"></interceptor-ref> <Interceptor-Ref name = "interceProtDemo2"> </sterceptor-ref> </sterceptor-stack> </secteptors> <action name = "action3" method = "Login"> <Interceptor-ref name = "MyDefaultStack"> </sectceptor-ref> <rances> /succss.jsp </results "> </sectceptor>
3. Pencegat Struts2 sendiri
Kasus 1: Periksa apakah pengguna masuk
1. Tulis halaman login.jsp
<body> <Form Action = "$ {pageContext.Request.contextPath} /Login.action" Method = "Post"> <input type = "text" name = "UserName"/> <br/> <input type = "Text" name = "kata sandi"/> <br/> <input type = "kirim" bernilai "nilai" "LOGIN"/LOGIN "/>2. Tulis kelas LoginCheckInterceptor untuk verifikasi login
Paket com.itheima.interceptor; import javax.servlet.http.httpsession; impor org.apache.struts2.servletactionContext; impor com.opensymphony.xwork2.actioninvocation; Impor com.opensychony.xwork2.interceptor.abstractepor; lipatan publicceporeCeporceporing Invocation) melempar Exception {httpsession session = servletActionContext.getRequest (). getSession (); // Dapatkan objek sesi melalui servletActionContext objek objek user = session.getAttribute ("user"); if (user == null) {// tidak ada login return "login"; // kembali ke tampilan logis} return Invocation.invoke (); // rilis}}3. Tulis file konfigurasi struts.xml
<package name="p2" extends="struts-default"> <interceptors> <interceptor name="loginCheckInterceptor"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginCheckInterceptor"></interceptor-ref> </sterceptor-ref> </sterceptor-stack> </sterceptor-stack> </sectceptors> <action name = "login" Method = "Login"> <rances> /Login.jsp </rence> </cich> </packer>
4. Tulis pelanggan kelas tindakan
Paket com.itheima.action; impor org.apache.struts2.servletactionContext; import com.opensymphony.xwork2.actionsupport; customerAction kelas publik memperluas ActionSupport {public string login () {System.out.println ("Login"); ServletactionContext.getRequest (). GetSession (). SetAttribute ("user", "ppp"); Sukses kembali; }}Kasus 2: Memantau efisiensi eksekusi metode tindakan
Tulis TimerInterceptor
Paket com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; impor com.opensymphony.xwork2.interceptor.AbstractInterceptor; Kelas Publik TimerInterceptor Memperluas AbstractInterceptor {Public String Intercept (ActionInvocation Invocation) Melempar Pengecuali String rtvalue = Invocation.invoke (); System.out.println (RTValue+"Waktu Eksekusi:"+(System.NanoTime ()-Time)+"NanoSecond"); mengembalikan rtvalue; }}Tulis file konfigurasi
<package name="p2" extends="struts-default"> <interceptors> <interceptor name="loginCheckInterceptor"></interceptor> <interceptor name="timerInterceptor"></interceptor> <interceptor-stack name="mydefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name = "LoginCheckIndInceptor"> </sterceptor-ref> <Interceptor-Ref name = "LOGINCHECKInterceptor"> </sterceptor-ref> <sterceptor-ref name = "timerIntercepTor"> </interceptor-ref> </sectceptor-stack> </interceptors> <acing name = "LOGIN"/LOGINE/LOGINE/LOGINE/LOGINE/LOGINE/LOGINE/LOGINE/LOGINE/LOGINE/LOGIN </INTERCEPTOR> </interceptors>
Seperti yang dapat dilihat dari yang di atas, beberapa filter dapat dikonfigurasi dalam satu tindakan.
4. Interceptor Kustom: Dapat menentukan metode pencegatan atau metode tidak mencegat
Ini dapat menentukan metode pencegatan atau metode tanpa mencegat. Saat menulis filter, Anda dapat mengimplementasikan kelas MethodFilterTerceptor, yang memiliki dua bidang. Dengan menyuntikkan parameter, Anda dapat menentukannya tanpa mencegat. Hanya satu dari dua parameter yang dapat digunakan. Ketika ada intersepsi lebih sedikit, Anda dapat menggunakan Methods. Ketika ada lebih banyak intersep, Anda dapat menggunakan ExcludeMethods.
ExcudeMethods = collections.EmptySet (); // Kecualikan itu
includeMethods = collections.emptyset (); // termasuk itu
Kasus: Lanjutkan contoh verifikasi login.
1. Tulis filter LoginCheckInterceptor
Paket com.itheima.interceptor; import javax.servlet.http.httpsession; impor org.apache.struts2.servletAccactext; import com.opensymphony.xwork2.actioninvocation; impor com.opensymphony.xwork2.interceptor.abstracteptor; impor Com.ablayceptor.opceptorceptor.opepractorceptor.opceptorsceptor.opceptor.abractepor. com.opensymphony.xwork2.interceptor.methodfilterinterceptor; kelas publik LoginCheckInterceptor memperluas MetodeFilterInceptor {Protected String DoIntercept (ActionInVocation Invocation) melempar Exception {httpsession = servletActionContext.getRequest (). GetSESSESS (); Objek user = session.getAttribute ("user"); if (user == null) {// tidak ada login return "login"; // kembali ke tampilan logis} return Invocation.invoke (); // rilis}}2. Tulis file konfigurasi
3. Tuliskan customeraction kelas tindakan
Paket com.itheima.action; impor org.apache.struts2.servletactionContext; import com.opensymphony.xwork2.actionsupport; complenticaction kelas publik memperluas ActionSupport {public string add () {System.out.println ("call add ()" call add ()); return scust;} public string edit () {call add () "call add ()); return succect;} public string edit () {call add ()" call add ()); return success;} public string ed () {call add () "call add ()); return success;} public string edit () {call add ()" call add () ()); return success;} public string edit Return Success; 4. Tulis halaman
addcustomer.jsp
<body> Tambahkan pelanggan </body>
EditCustomer.jsp
<body> Ubah pelanggan </body>
Login.jsp
<body> <Form Action = "$ {pageContext.Request.contextPath} /Login.action" Method = "Post"> <input type = "text" name = "UserName"/> <br/> <input type = "Text" name = "kata sandi"/> <br/> <input type = "kirim" bernilai "nilai" "LOGIN"/LOGIN "/>Success.jsp
<body> oyeah </body>
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.