1. Pendahuluan Interceptor
Fungsi pencegat mirip dengan filter dalam file web.xml. Ini dapat mencegat permintaan pengguna dan mengontrol halaman dengan mencegat permintaan pengguna. Interceptor dikonfigurasi di Struts-Core-2.2.3.jar. Interceptor asli dikonfigurasi di Struts-Default.xml, yang menyegel metode penggunaan dasar pencegat.
Fungsi interseptor Struts2 mirip dengan filter servlet. Sebelum tindakan mengeksekusi metode Execute, Struts2 akan terlebih dahulu menjalankan interseptor yang dirujuk dalam struts.xml. Jika ada beberapa pencegat, itu akan dieksekusi dalam urutan naik turun. Setelah menjalankan metode pencegat semua pencegat, metode tindakan eksekusi akan dieksekusi.
Struts2 Interceptor harus mengimplementasikan antarmuka ini dari com.opensymphoy.xwork2.interceptor.Interceptor. Tiga metode berikut perlu diimplementasikan dalam pencegat yang ditentukan:
void hancurkan (); void init (); String Intercept (Doa ActionInvocation) melempar pengecualian;
Pencegat khusus perlu mengganti tiga metode di atas. Selain itu, file konfigurasi interseptor Struts.xml dari Struts2 mewarisi file asli struts-default.xml file, sehingga semua informasi konfigurasi di struts-default.xml akan dimiliki secara otomatis dalam <packer> yang sesuai. Kode spesifiknya adalah sebagai berikut:
<nama paket = "demo" extends = "struts-default"> ... </pack>
2. Tambahkan pencegat
Untuk menggunakan pencegat, Anda harus dikonfigurasi. Struts2 menggunakan metode pemetaan, jadi jika Anda ingin menggunakan fungsi tertentu, Anda harus dikonfigurasi dalam file konfigurasi, dan pencegat tidak terkecuali. Oleh karena itu, elemen pencegat yang sesuai harus ditambahkan dalam paket, dan interseptor harus dikaitkan dengan file kelas yang sesuai, sehingga pencegat yang sesuai akan dieksekusi sebelum tindakan dieksekusi. Metode penggunaan spesifik adalah sebagai berikut.
(1) Tambahkan file konfigurasi struts.xml dan tambahkan pencegat ke file
<package name="testLogin" namespace="/" extends="struts-default"> <!-- Interceptor--> <interceptor name="myInterceptor"></interceptor> </interceptor> <action name="demo"> <result name="error" type="redirect">/error.jsp</result> <result name="success">/success.jsp</result> <result name = "checkError">/checkSession.jsp </rence> <interceptor-ref name = "myInterceptor"> </sterceptor-ref> <interceptor-ref name = "defaultStack"> </sterceptor-ref> </ action> </package>
Dalam paket di atas, seorang pencegat bernama Myinterceptor ditambahkan, dan kelas Java terdaftar untuk pencegat, yang dinamai Myinterceptor dan diblokir dalam paket Com.Interceptor. Selain itu, tindakan yang sesuai telah ditambahkan ke paket. Sebelum menjalankan tindakan, Myinterceptor Interceptor akan dieksekusi terlebih dahulu.
(2) Tulis kelas pencegat terdaftar MyInterceptor. Kelas ini harus mengimplementasikan antarmuka com.opensymphoy.xwork2.interceptor.interceptor dan mengganti metode yang sesuai
paket com.interceptor; impor java.util.map; impor com.entity.user; impor com.opensymphony.xwork2.actioncontext; impor com.opensymphony.xwork2.actioninvocation; impor com.opensymphony.xwork2.interceptor.interceptor; kelas publik MyInterceptor mengimplementasikan Interceptor {Pengguna Pribadi; pengguna publik getUser () {return user; } public void setUser (pengguna pengguna) {this.user = user; } @Override public void destrash () {// TODO Metode yang dihasilkan secara otomatis System.out.println ("---- Destroy () ----"); } @Override public void init () {// TODO METODE AUTO-EKSIREATED Stub System.out.println ("------ init () -------"); } @Override Public String Intercept (ActionInVocation Invocation) melempar Exception {// TODO Metode yang dihasilkan secara otomatis System.out.println ("-----------"); Peta <String, Object> session = Invocation.getInvocationContext (). GetSession (); if (session.get ("username")! = null) {System.out.println ("Login berhasil!"); //session.put ("nama pengguna", user.getusername ()); return Invocation.invoke (); } else {System.out.println ("Login Gagal!"); mengembalikan "CheckError"; }}}(3) Setelah dua langkah pertama, pencegat telah dikonfigurasi. Bagian terakhir adalah menggunakan pencegat. Tambahkan tag yang sesuai ke halaman tampilan, dan tentukan aksi bernama demo yang dibuat di atas untuk tag. Kemudian jalankan halaman untuk mencetak konten pencegat yang sesuai di konsol.
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/org/ht4/t." <html> <head> <meta http-equiv = "konten-tipe" content = "text/html; charset = utf-8"> <itement> Sisipkan judul di sini </itement> </head> <body> <form Action = "Demo"> Username: <Input Tipe = "Teks" Nama = "UserName"> <br> <br> kata sandi: <input "Tipe =" TEXT "Nama =" Username "> <br> Kata sandi: <br> Kata Sandi:" Input "Tipe =" TEXT "Nama =" Username "> <br> Kata Sandi; type = "kirim" name = "OK" value = "kirim"> </form> </body> </html>
Konten cetak:
Menganalisis hasil output. Pada tahap kompilasi program, file konfigurasi struts.xml pertama -tama akan membaca file konfigurasi struts.xml, dan dalam tindakan file konfigurasi, cari apakah pencegat telah ditambahkan. Jika pencegat ditambahkan, temukan apakah Interceptor atau Interceptor Stack didefinisikan dalam <Enterceptors> sesuai dengan nama pencegat. Jika ditemukan bahwa pencegat didefinisikan, temukan kelas terdaftar yang sesuai berdasarkan interseptor, dan akhirnya temukan kelas terdaftar dalam paket dan jalankan metode init () yang sesuai. Proses umum tahap berjalan program mirip dengan tahap kompilasi. Setelah pengguna mengirimkan permintaan di latar depan, ia akan mencari tindakan yang sesuai di Struts.xml. Jika ditemukan, pencegat akan ditemukan. Jika tidak ditemukan, kesalahan yang sesuai akan dilemparkan. Akhirnya, metode intersep dari kelas pendaftaran interseptor dieksekusi.
3. Stack Interceptor
Pencegat juga memiliki konsep tumpukan. Mereka mendefinisikan pencegat yang digunakan ke negara bersama untuk mencapai manajemen terpadu, sehingga pencegat dapat dibagikan dalam paket, sangat memfasilitasi penggunaan pencegat. Pencegat berulang sering digunakan dalam suatu paket. Jika Anda menambahkan referensi interseptor ke tindakan setiap saat, itu akan sangat merepotkan. Kemudian tumpukan interseptor dihasilkan untuk menyelesaikan masalah ini. Konfigurasi spesifiknya adalah sebagai berikut:
<nama paket = "testlogin" namespace = "/" extends = "struts-default"> <!-interceptor-> <interceptor name = "myinterceptor"> </sterceptor> <!-Tentukan rantai pencegat publik. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaulttstack1"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="demo"> <result name="error" type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result> <result name = "checkError">/checkSession.jsp </hasilnya> <interceptor-ref name = "defaultStack1"> </sterceptor-ref> </action> </package>
Dalam contoh tersebut, Interceptor-Stack digunakan untuk mendefinisikan tumpukan interseptor bernama DefaultTStack1. Interceptor yang akan dieksekusi ditambahkan ke tumpukan, interseptor dienkapsulasi, dan tumpukan interseptor dipanggil langsung dalam aksi, mewujudkan berbagi tumpukan interceptor.
4. Stack Interceptor Default
Selain itu, tumpukan interceptor default dapat didefinisikan, yaitu, jika tidak ada interseptor yang didefinisikan dalam suatu tindakan, itu akan melaksanakan pencegat publik secara default. Ini milik level yang sama dengan tag Interceptors dan didefinisikan menggunakan default-interceptor-ref.
<nama paket = "testlogin" namespace = "/" extends = "struts-default"> <!-interceptor-> <interceptor name = "myinterceptor"> </sterceptor> <!-Tentukan rantai pencegat publik. Dalam tag tindakan, hanya rantai interseptor yang perlu direferensikan-> <interceptor-stack name = "defaultinter"> <interceptor-ref name = "myinterceptor"> </sterceptor-ref> <Default-Interceptor-Ref Name = "DefaultInter"> </default-intercepor-ref> <action name = "demo"> <name hasil = "error" type = "redirect">/error.jsp </hasilnya> <name = "success">/success.jsp </result> <hasil name = "checkError">/checksesesion.jsp </hasil </hasil </name = "checkError"> checksession.jsp </hasil </hasil </name = "checkError"> checkSesesion.jsp
Tumpukan interceptor default yang ditentukan hanya menjalankan stack interceptor default khusus jika tindakan tidak menentukan interseptor. Jika interseptor didefinisikan ulang dalam aksi, itu akan mengganti tumpukan interceptor default khusus.
5. Tidak Ada Eksekusi Interceptor
Ada situasi lain di mana suatu paket mendefinisikan pencegat default, tetapi tidak ada interseptor yang harus dieksekusi dalam tindakan tertentu yang ditulis. Kemudian, Anda dapat menambahkan interseptor bernama DefaultStack ke tindakan yang sesuai. Ini adalah pencegat default sistem dan tidak akan ada operasi.
<nama paket = "testlogin" namespace = "/" extends = "struts-default"> <!-interceptor-> <interceptor name = "myinterceptor"> </sterceptor> <!-Tentukan rantai pencegat publik. Dalam tag tindakan, hanya rantai interseptor yang perlu direferensikan-> <interceptor-stack name = "defaultinter"> <interceptor-ref name = "myinterceptor"> </sterceptor-ref> <Default-Interceptor-Ref Name = "DefaultInter"> </default-intercepor-ref> <action name = "demo"> <name hasil = "error" type = "redirect">/error.jsp </hasilnya> <name = "success"> success.jsp </result> <name hasil = "checkError"> checksession. dieksekusi-> <interceptor-ref name = "DefaultStack"> </sterceptor-ref> </chere> </packer>
6. Metode intersep
6.1 Penggunaan
Interceptor di atas hanya mengimplementasikan tindakan pencegat interseptor. Bahkan, interseptor memiliki fungsi yang sangat kuat dan juga dapat mencegat metode tindakan yang sesuai. Perbedaan antara tindakan pencegatan adalah bahwa jika Anda ingin mencegat metode, Anda harus mewarisi class methodFilterInterceptor. Kelas ini tertutup di xwork-core.jar, yang sekali lagi membuktikan bahwa webwork adalah inti dari Struts2. Selain itu, juga perlu untuk menambahkan atribut yang sesuai ke file konfigurasi untuk menentukan metode intersepsi dan metode non-intersepsi. Metode konfigurasi spesifik adalah sebagai berikut:
<nama paket = "testlogin" namespace = "/" extends = "struts-default"> <!-interceptor-> <interceptor name = "myinterceptor"> </sterceptor> <!-Tentukan rantai pencegat publik. In the action tag, only the interceptor chain needs to be referenced --> <interceptor-stack name="defaultinter"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="demo"> <result name="error" type="redirect">/error.jsp</result> <result name="success">/success.jsp</result> <result name="checkError">/checkSession.jsp</result> <result name="checkError">/checkSession.jsp</result> <!-- Configure the intercepting method in the defaultStack, add the intercepted method name in the parameter includeMethods, and add the name that does not need Untuk dicegat di excelemethods-> <interceptor-ref name = "defaultStack"> <param name = "includeemethods"> Tambahkan nama metode yang akan dicegat </param> <!-Metode intersepsi-> <param name = "ExcludeMethods"> Tambahkan nama metode yang tidak memerlukan intersepsi </param> </paramy <!
Kode di kelas yang mewarisi metode interseptor yang sesuai dari kelas MethodFilterInterceptor:
paket com.interceptor; impor java.util.map; impor com.opensymphony.xwork2.actioncontext; impor com.opensymphony.xwork2.actioninvocation; impor com.opensymphony.xwork2.interceptor.methodfilterinterceptor; Public Class Inter Extends MethodFilterInterceptor {@Override Public String Dointercept (ActionInVocation Invocation) melempar Exception {System.out.println ("-Intercept ()-"); // Dapatkan peta sesi yang sesuai <String, Object> session = Invocation.getInvocationContext (). GetSession (); Peta request = (peta) actionContext.getContext (). Get ("request"); String username = (string) request.get ("user.username"); if (session.get ("username")! = null) {string result = Invocation.invoke (); System.out.println ("-end ()-"); hasil pengembalian; }}}} 6.2 Demo
Mari kita lihat contoh metode intersepsi dan analisis hasilnya. Contoh berikut menunjukkan hasil output dari metode intersep. Dalam contoh, kelas loginAction dibuat secara terpisah untuk menambahkan metode yang akan dieksekusi dengan tindakan; Kelas Inter diganti dalam metode interceptor, dan menghasilkan apakah akan mencegat metode tertentu di konsol; File login.jsp ditambahkan untuk menunjukkan eksekusi tiga metode masing -masing.
(1) Definisi Metode Interceptor di Struts.xml mendefinisikan interseptor bernama Inter dalam paket, dan menentukan parameter dalam pencegat. IncludeMethods digunakan untuk mencegat metode1. Metode2 dalam ExcudeMethods berarti bahwa metode Method2 tidak dicegat. Konfigurasi spesifiknya adalah sebagai berikut:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.action.extension" value=","></constant> <package name="login" extends="struts-default"> <interceptor name="inter"> <param name="includeMethods">Method1</param> <!-- Intercept Method1 method --> <param name="excludeMethods">Method2</param> </interceptor> <interceptor-stack name="myInterceptor"> <interceptor-ref name="inter"></interceptor-ref> <interceptor-ref name = "DefaultStack"> </sterceptor-ref> </sterceptor-stack> </sterceptor-stack> </sterceptors> <action name = "LoginAction"> <name hasil = "SUCCESS"> SUCCESS.jsp </result> <result name = "error"> corder "corder </result> <hasil name =" error "> </questice =" corder "corder" corder "corder" name = "corder" corder = "corder" cancin "corder"> </hasil name = "questice =" questicon = <interceptor-ref name = "inter"> </sterceptor-ref> <interceptor-ref name = "defaultStack"> </sterceptor-ref> </chere> </packer> </struts>
(2) Kelas LoginAction, Konfigurasikan tindakan di login.jsp, dan tambahkan tiga metode Method1-Method3 ke kelas ini, masing-masing, Method1 dicegat, Method2 dan Method3 tidak dicegat, dan akhirnya kami memeriksa hasil output.
paket com.action; impor com.opensymphony.xwork2.actionsupport; Loginaksi kelas publik memperluas ActionSupport {@Override Public String Execute () melempar Exception {if (this.userName.equals ("admin") && this.password.equals ("admin")) {return "Success"; } lain if (this.userName.equals ("batal") && this.password.equals ("cancel")) {return "cancel"; } else {return "error"; }} public void method1 () {System.out.println ("Metode Eksekusi: Method1"); } public void method2 () {System.out.println ("Metode Eksekusi: Method2"); } public void method3 () {System.out.println ("Metode Eksekusi: Method3"); } nama pengguna string pribadi; kata sandi string pribadi; string publik getUserName () {return this.username; } public void setusername (string username) {this.username = username; } public String getPassword () {return this.password; } public void setPassword (kata sandi string) {this.password = kata sandi; }}(3) kelas antar, mewarisi kelas MethodFilterTerceptor, dan digunakan untuk menerapkan metode pencegat. Tulis ulang metode DoIntercept dan tambahkan informasi yang sesuai untuk mencegat metode ini.
paket com.interceptor; impor java.util.date; impor java.util.map; impor com.action.loginaction; impor com.opensymphony.xwork2.actioncontext; impor com.opensymphony.xwork2.actioninvocation; impor com.opensymphony.xwork2.interceptor.methodfilterinterceptor; Public Class Inter Extends MethodFilterInterceptor {@Override Protected String Dointercept (ActionInVocation Invocation) melempar Exception {// TODO Metode yang dihasilkan otomatis Stub System.out.println ("Interceptor Intercepts sebelum Eksekusi Tindakan"+Tanggal Baru ()); String result = invocation.invoke (); // Jalankan Metode Tindakan System.out.println ("Interceptor Intercepts After Action Execution"+new Date ()); hasil pengembalian; }}(4) Login.jsp, tambahkan tiga tombol pada halaman JSP, masing -masing menunjukkan tiga metode, dan menilai intersepsi pencegat metode tersebut. Tindakan yang diposting kembali oleh tiga tombol setelah mengklik ditambahkan secara dinamis dalam JavaScript. Ini mencapai metode pelaksanaan tindakan yang berbeda dalam suatu bentuk. Tentu saja, ada metode lain, yang akan dibahas dalam artikel berikutnya.
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/org/ht4/t." <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <Title> Sisipkan judul di sini </iteme> <type skrip = "text/javascript"> // Metode 1, definisikan sebuah instance dari fungsi metode metode yang dicegat 1 () {var form = Dokumen = Dokumen. Form.action = "LoginAction! Method1"; form.submit (); } // Metode 2, tambahkan metode yang tidak mencegat untuk tombol 2 metode fungsi2 () {var form = document.forms [0]; Form.action = "LoginAction! Method2"; form.submit (); } // Metode 3, tambahkan metode yang tidak mencegat untuk tombol 3 metode fungsi3 () {var form = document.forms [0]; Form.action = "LoginAction! Method3"; form.submit (); } </script> </head> <body> <form> Username: <input type="text" name="username"><br> Password: <input type="text" name="password"><br> <input type="submit" name="ok" value="button1" onclick="method1()"> <input type="submit" name="ok1" value="button2" OnClick = "method2 ()"> <input type = "kirim" name = "ok2" value = "button3" ontClick = "Method3 ()"> </form> </body> </html> Tampilan halaman setelah menjalankan selesai:
(5) Menganalisis hasil berjalan, klik tombol 1, 2, dan 3 masing -masing, dan output hasil di konsol. Tombol 1 adalah metode terikat1. Metode ini mencegat di struts.xml. Jika hasilnya benar, hasil yang dicegat akan ditampilkan. Tombol 2 dan 3 yang sesuai hanya mengeluarkan hasil yang berjalan karena tidak dicegat. Kemudian lihat diagram hasil di bawah ini:
Diagram hasil adalah hasil analisis kami. Tombol 1 dicegat, dan metode dointercept di kelas Inter dieksekusi. Tombol 2 dan 3 yang sesuai dari keduanya tidak dicegat. Dengan kata lain, Method1 ditempatkan di daftar putih metode pencegat, dan metode harus dicegat saat dieksekusi; Method2 ditempatkan di daftar hitam pencegat, dan tidak perlu mencegat metode; Method3 tidak melakukan apapun.
7. Kesimpulan
Isi pencegat dirangkum di sini. Interceptor menyediakan fungsi yang sangat kuat, memungkinkan pengembang untuk mengontrol hasil output saat runtime, meningkatkan fleksibilitas pemrograman. Selain itu, jangan mencoba mengingat hal -hal teoretis apa pun. Anda harus menganalisisnya secara rasional, lebih banyak berlatih, dan membuat beberapa contoh untuk memiliki pemahaman yang lebih dalam tentang hasil analisis.
PS: Deskripsi fungsional pencegat yang disediakan oleh Struts2 (XWork)
Pencegat | nama | menjelaskan |
Alias Interceptor | alias | Parameter permintaan dikonversi ke file nama yang berbeda antara permintaan yang berbeda, dan konten permintaan tetap tidak berubah |
CHAINTE CHARE | rantai | Biarkan sifat -sifat dari tindakan sebelumnya diakses oleh tindakan berikutnya, dan sekarang digunakan bersama dengan hasil jenis rantai (<result type = "chain">). |
CHECKBOX Interceptor | kotak centang | Menambahkan kotak centang kode pemrosesan otomatis, mengatur konten Uncheckbox ke false, sedangkan HTML tidak mengirimkan Uncheckbox secara default. |
Cookies Interceptor | Cookie | Gunakan nama dan nilai yang dikonfigurasi untuk merujuk ke cookie |
Interceptor kesalahan konversi | Konversionerror | Menambahkan kesalahan dari ActionContext ke bidang properti Action. |
Buat sesi Interceptor | ciptaan | Secara otomatis membuat httpsession untuk digunakan untuk layanan interceptor yang membutuhkan httpsession. |
Debugging Interceptor | debugging | Berikan halaman debugging yang berbeda untuk menunjukkan status data internal. |
Mengeksekusi dan menunggu interseptor | execandwait | Jalankan tindakan di latar belakang saat membawa pengguna ke halaman tunggu menengah. |
Pencegat Pengecualian | Pengecualian | Posisikan pengecualian ke layar |
File Unggah Interceptor | Fileupload | Berikan fungsi Upload File |
I18n Interceptor | i18n | Catat tempat yang dipilih oleh pengguna |
Logger Interceptor | logger | Nama aksi keluaran |
Pesan Toko Interceptor | toko | Menyimpan atau mengakses pesan, kesalahan, kesalahan bidang, dll. Yang muncul di kelas tindakan yang menerapkan antarmuka ValidationAware. |
Model yang didorong pencegat | model yang digerakkan | Jika kelas mengimplementasikan ModelDriven, tempatkan hasil yang diperoleh dengan getModel di tumpukan nilai. |
Model yang dilingkup didorong | Didorong model-scoped-model | Jika suatu tindakan mengimplementasikan scopedmodeldriven, interseptor akan mengambil model dari ruang lingkup yang sesuai dan memanggil metode setModel aksi dan memasukkannya ke dalam aksi. |
Parameter Interceptor | params | Atur parameter dalam permintaan ke tindakan. |
Siapkan interseptor | persiapkan persiapan | Jika Acton mengimplementasikan yang dapat dipersiapkan, Interceptor memanggil metode persiapan kelas tindakan. |
Lingkup Interceptor | cakupan | Cara mudah untuk menyimpan status tindakan ke dalam sesi dan aplikasi. |
Pencegat Konfigurasi Servlet | servletconfig | Memberikan metode untuk mengakses httpservletRequest dan httpservletResponse, mengakses dalam bentuk peta. |
Parameter Statis Interceptor | Staticparams | Atur konten di <param> di <Action> ke dalam tindakan yang sesuai dari file struts.xml. |
Peran Interceptor | peran | Menentukan apakah pengguna memiliki peran yang ditentukan JAAS, jika tidak, ia tidak akan dieksekusi. |
Pencegat Timer | timer | Waktu eksekusi tindakan output |
Token Interceptor | token | Hindari klik dua kali melalui token |
Token Sesi Interceptor | Tokensesi | Namun, seperti Token Interceptor, saat mengklik dua kali, data yang diminta disimpan dalam sesi tersebut |
Interceptor validasi | Validasi | Verifikasi data yang dikirimkan menggunakan konten yang ditentukan dalam file action-validation.xml. |
Pencegat alur kerja | alur kerja | Metode validasi call action, dan begitu ada kesalahan, itu akan dipindahkan ke layar input. |
Parameter Filter Interceptor | N/a | Hapus parameter yang tidak perlu dari daftar parameter |
Profiling Interceptor | Profil | Aktifkan profil melalui parameter |