1. Konsep Dasar
Pendengar di Javaweb diimplementasikan melalui pola desain pengamat. Mengenai mode pengamat, saya tidak akan memberikan terlalu banyak pengantar di sini, jadi saya akan berbicara tentang apa artinya.
Mode pengamat juga disebut Mode Berlangganan Publikasikan atau Mode Pendengar. Ada dua karakter dalam mode ini: pengamat dan pengamat (biasanya juga disebut subjek). Pengamat mencatat peristiwa yang menarik dalam topik tersebut. Ketika peristiwa ini terjadi, topik akan memberi tahu pengamat melalui antarmuka panggilan balik.
Izinkan saya memberi Anda contoh dalam hidup: Berlangganan surat kabar. Setiap keluarga atau individu dapat berlangganan surat kabar dengan koran. Di sini koran adalah "tema" dan keluarga adalah "pengamat". Misalnya, jika sebuah keluarga perlu berlangganan surat kabar besok pagi, ini adalah "acara". Pagi berikutnya, koran diproduksi, dan ini adalah "acara". Ketika insiden itu terjadi, koran mengirim koran ke kotak surat rumah, yang merupakan "antarmuka panggilan balik".
Untuk pendengar di Javaweb, spesifikasi Servlet mendefinisikan beberapa kolom kelas antarmuka pendengar, mengekspos acara ke aplikasi melalui kelas antarmuka. Jika suatu aplikasi ingin mendengarkan peristiwa yang menarik, itu tidak harus secara langsung mendaftarkan acara yang sesuai. Sebaliknya, ia menulis pendengarnya sendiri untuk mengimplementasikan kelas antarmuka yang sesuai dan mendaftarkan pendengarnya sendiri ke wadah Servlet. Ketika suatu peristiwa yang dipedulikan program terjadi, wadah Servlet akan memberi tahu pendengar dan memanggil kembali metode dalam pendengar. Pendengar yang disesuaikan di sini adalah pengamat, dan wadah servlet adalah temanya.
2. Analisis sampel
Seperti disebutkan di atas, wadah servlet memaparkan acara ke aplikasi melalui kelas antarmuka pendengar. Jadi kami tidak terlalu banyak mendaftarkan acara, melainkan mendaftarkan pendengar. Langkah -langkah pemrograman yang sesuai adalah: 1. Tulis pendengar Anda sendiri dan terapkan antarmuka pendengar tertentu. 2. Daftarkan pendengar Anda di web.xml. Berikut adalah contoh antarmuka pendengar yang paling sederhana, ServletContextListener:
1.TestListener.java
Public Class TestListener mengimplementasikan servletContextListener {public testListener () {} public void contextInitialized (ServletContextEvent scCe) {System.out.println ("ServletContextListener.contextInitialized");} public void contextDestroyed (servletcontcontcontEvent ");} public void contextDestroyed (servletcontcontcontcontEvent);} public void ContextDestroyed (servletcontcontcontcontcoVent); {System.out.println ("ServletContextListener.contextDestroyed");}}2.web.xml
<listener> <listener-class> com.nantang.listener.testlistener </listener-class> </listener>
Ketika wadah dimulai, "ServletContextListener.contextInitialized" akan menjadi output ke log, dan ketika wadah ditutup, "ServletContextListener.contextDestroyed" akan menjadi output. Penjelasan terperinci akan dianalisis lebih lanjut nanti.
Perlu dicatat di sini bahwa jika Anda menunjukkan contoh di atas dalam IDE (Eclipse, STS, dll.), Saat memulai server, Anda dapat melihat "ServletContextListener.contextInitialized" di konsol, dan ketika menutup server, Anda tidak dapat melihat "ServletContextListener.contextDestroed". Ini bukan bahwa metode ContextDesroyed tidak dieksekusi, tetapi IDE tidak menerapkannya dengan sempurna. Untuk memverifikasi bahwa ContextDestroyed memang dipanggil, Anda dapat menulis sepotong kode dalam konteks yang dapat menghasilkan konten file alih -alih mengeluarkannya ke konsol.
3. Analisis Kode Sumber
Sekarang mari kita analisis peristiwa mana yang ditentukan oleh spesifikasi servlet untuk kita. Lebih tepatnya, antarmuka mendengarkan mana yang didefinisikan. Perkenalan berikut didasarkan pada spesifikasi Servlet 3.0.
Servlet3.0 memberi kita 8 antarmuka pendengar, yang dapat dibagi menjadi tiga kategori sesuai dengan ruang lingkupnya:
1.Servlet Antarmuka mendengarkan yang berhubungan dengan konteks, termasuk: ServletContextListener dan ServletContextAttributEnterer.
2. Antarmuka mendengarkan yang berhubungan dengan sesi HTTP, termasuk: httpsessionlistener, httpsessionactivationListener, httpsessionattributeListener dan httpsessionBindingListener.
3. Antarmuka mendengarkan yang terkait dengan permintaan Servlet, termasuk: ServletRequestListener dan ServletRequestAttributeListener.
Bahkan, dari penamaan antarmuka, Anda harus dapat menebak fungsi dasarnya. Mari kita jelaskan berdasarkan kategori di bawah ini.
1. Antarmuka mendengarkan yang berhubungan dengan konteks
Saat memperkenalkan servlets sebelumnya, kami menjelaskan bahwa aplikasi web sesuai dengan konteks servlet. Oleh karena itu, rentang kehidupan acara yang didengarkan oleh ServletContextListener dan ServletContextAttributeRistener berjalan melalui seluruh aplikasi web. Di bawah ini adalah hubungan hierarki diagram kelas antara kedua antarmuka ini.
1.1 EventListener
EventListener adalah antarmuka tag, dan semua pendengar acara harus mewarisi antarmuka ini. Ini adalah spesifikasi servlet, dan tidak ada penjelasan.
1.2 EventObject
Mirip dengan EventListener, EventObject adalah kelas tingkat acara, dan semua kelas acara tertentu harus mewarisi EventObject.
Kelas Publik EventObject mengimplementasikan java.io.serializable {Sumber objek transien yang dilindungi; public eventObject (sumber objek) {if (source == null) lempar baru ilegalargumentException ("null source"); this.source = source;} public objek getSource () {return source;} public string public tostring tostring tostring = source; + "]";}}Kelas ini sangat sederhana, esensinya hanyalah satu hal: sumber. Melalui nama kelas EventObject dan sumber nama properti, Anda dapat melihat bahwa kelas ini melakukan satu hal, memegang "objek sumber acara".
1.3 ServletContextEvent
Public Class ServletContextEvent memperluas java.util.eventObject {public servletContextEvent (servletContext source) {super (sumber);} public servletContext getServletContext () {return (servletcontext) super.getSource ();}}Acara Konteks Servlet, kelas acara ini adalah warisan sederhana dari EventObject. Contoh ServletContext disediakan sebagai sumber acara di konstruktor. Karena sumber acara adalah konteks servlet, GetServletContext disediakan untuk mendapatkan instance ServletContext.
Ketika kami menjelaskan kelas acara lain di masa depan, mereka semua adalah cetakan yang sama. Setiap kelas acara menyediakan metode konstruksi yang sesuai, lulus dalam objek sumber acara yang sesuai, dan menyediakan metode tambahan untuk mendapatkan sumber acara. Oleh karena itu, EventObject adalah kelas dasar sumber acara. Inti dari semua subclass peristiwa melakukan satu hal, tentukan objek sumber peristiwa tertentu.
Jadi tempat di mana kita akan menjelaskan kejadian itu kemudian berlalu.
1.4 ServletContextListener
Antarmuka Publik ServletContextListener memperluas EventListener {public void contextInitialized (servletContextEvent sce); public void contextDestroyed (servletContextEvent sce);}Antarmuka pendengar konteks servlet sesuai dengan dua peristiwa: acara inisialisasi konteks servlet dan acara penutupan konteks servlet.
Ketika aplikasi web diinisialisasi, wadah servlet akan membangun instance ServletContextEven dan memanggil kembali metode ContextInitialize.
Ketika konteks servlet akan ditutup, biasanya sebelum menutup server, wadah servlet akan membangun instance ServletContextEven dan memanggil kembali metode ContextDesroyed. Perlu dicatat di sini bahwa pelaksanaan metode ContextDestroyed akan dilakukan setelah semua servlet dan filter telah menyelesaikan metode Destroy.
Jadi jika kita ingin melakukan sesuatu ketika aplikasi dimulai atau ditutup, kita akan menulis pendengar kita sendiri untuk mengimplementasikan antarmuka.
Semua pendengar acara juga merupakan model yang sama. Metode antarmuka callback peristiwa yang sesuai didefinisikan sesuai dengan spesifikasi servlet. Parameter entri metode adalah instance sumber acara yang sesuai. Jadi kami juga akan melewati tempat di mana kami akan menjelaskan monitor nanti.
1.5 ServletContextAttributeEvent
Kelas Publik ServletContextAttributeEvent memperluas servletContextEvent {private string name; nilai objek privat; public servletContextAttributeEvent (servletContext source, name string, nilai objek) {super (sumber); this.name = name; this.value = value;} public string getName () {this.name = name; this.value = value;} public String getName () {this.name; }}ServletContextAttributeEvent mewakili peristiwa yang terkait dengan atribut konteks servlet. Secara umum, acara akan dipicu ketika atribut berubah. Kelas ini mewarisi ServletContextEven, dan sumber acara juga merupakan instance ServletContext. Metode tambahan untuk mendapatkan nama atribut dan nilai atribut disediakan.
1.6 ServletContextAttributeListener
Antarmuka Publik ServletContextAttributEnterener memperluas EventListener {public void attributeAdded (servletContextAttributeEvent scab); public void attributeemoved (servletContextAttributeEvent scab); public void attributeReplaced (servletContextattribute scab);Ketika atribut di atas servlet ditambahkan, dihapus, atau dimodifikasi, wadah servlet membangun objek acara ServletContextAttributeEvent, dan memanggil kembali metode yang diatribut, atributeMoved, dan atributeReplaced masing -masing.
Yang perlu Anda perhatikan di sini adalah metode atributePeplaced, yang menelepon kembali ketika nilai atribut diganti. Pada saat ini, jika Anda memanggil metode ServletContextAttributeEvent.GetValue (), pengembaliannya adalah untuk mengganti nilai atribut sebelumnya.
2 HTTP Sesi Terkait Antarmuka Mendengarkan
2.1 HttpSessionEvent
Kelas Publik HttpsessionEvent memperluas java.util.eventObject {public httpsessionEvent (sumber httpsession) {super (sumber);} httpsession public getSession () {return (httpsession) super.getSource ();}}Acara terkait sesi HTTP, yang akan dipicu saat sesi berubah. Sumber acara adalah instance httpsession dan menyediakan metode akuisisi httpsession tambahan.
2.2 HttpsessionListener
antarmuka publik httpsessionlistener memperluas EventListener {public void sessioncreated (httpsessionEvent se); public void sessionDestroyed (httpsessionEvent se);}Ketika sesi dibuat dan dihancurkan, wadah servlet membangun objek acara HttpsessionEvent dan memanggil kembali metode sesi yang dibuat dan distokasikan sesi.
2.3 HttpSessionactivationListener
antarmuka publik httpsessionactivationListener memperluas EventListener {public void sessionwillpastive (httpsessionEvent SE); public void sessionDidaCtivate (httpsessionEvent se);}Ketika sesi akan dipersiapkan atau telah diaktifkan, wadah Servlet membangun objek acara HTTPSESSESIVENT, Callback Session WillPastivate dan SesionDidactivate Metode.
Pasifan dan aktivasi dijelaskan di sini: pasif mengacu pada memori server tidak mencukupi atau batas waktu aktivitas sesi telah tiba, dan sesi yang baru -baru ini tidak aktif diserialisasi ke disk. Aktivasi berarti bahwa sesi pasif diakses lagi, deserialisasi sesi dari disk ke memori.
Dapat dilihat di sini bahwa untuk menyumbat dan mengaktifkan, sesi harus diserialisasi dan dihilangkan dengan terlebih dahulu. Pada saat yang sama, selama proses pemrograman, kami mencoba menggunakan objek sederhana seperti string dan integer sebanyak mungkin, dan mencoba untuk tidak menggunakan koleksi seperti daftar dan peta.
2.4 HttpsessionBindingEvent
kelas publik httpsessionBindingEvent memperluas httpsessionEvent {private string name; nilai objek privat; httpsessionBindingEvent publik (httpsession sesi, nama string) {super (sesi); this.name = name;} public httpsessionBindingEvent (httpsession sesion, this. value;} public httpsession getSession () {return super.getSession ();} public string getName () {return name;} public objek getValue () {return this.value; }}Acara yang terkait dengan atribut sesi HTTP dipicu ketika atribut sesi berubah. Sumber acara adalah instance httpsession dan menyediakan metode tambahan untuk mendapatkan httpsession, nama atribut, dan nilai atribut.
2.5 httpsessionattributeListener
Antarmuka Publik HttpssionAttributeRererer memperluas EventListener {public void atributeAdded (httpsessionBindingEvent se); public void atributeMoved (httpsessionBindingEvent se); public void attributeReplaced (httpsessionBindingEvent se);}Ketika atribut sesi ditambahkan, dihapus, atau dimodifikasi, wadah servlet membangun objek peristiwa HTTPSessionBindingEvent dan memanggil kembali metode yang diatribut, atributeMoved, dan atributeReplaced masing -masing.
Yang perlu Anda perhatikan di sini adalah metode atributePeplaced, yang menelepon kembali ketika nilai atribut diganti. Pada saat ini, jika Anda memanggil metode ServletContextAttributeEvent.GetValue (), pengembaliannya adalah untuk mengganti nilai atribut sebelumnya.
Ketika metode Invalidate dari sesi dipanggil atau sesi gagal, metode atributeremoved juga akan dipanggil kembali.
2.6 httpsessionBindingListener
Antarmuka Publik HttpsessionBindingListener memperluas EventListener {public void valueBound (peristiwa httpsessionBindingEvent); public void valueunbound (httpsessionBindingEvent event);}Pendengar ini juga mendengarkan perubahan dalam atribut sesi. Ketika atribut sesi ditambahkan dan dihapus, yaitu, ketika nilai atribut terikat dan nilai atribut tidak terhubung, wadah servlet membangun objek peristiwa HTTPSessionBindingEvent dan masing -masing memanggil kembali metode nilai dan nilai yang dihargai masing -masing.
Tampaknya tidak berbeda dengan HttpSsionAttributeListener, tetapi tidak demikian. Salah satu perbedaan penting antara keduanya adalah kondisi pemicu peristiwa.
Ketika ada perubahan di properti sesi, wadah Servlet akan memberi tahu HttpSsionAttributeListener. Tetapi untuk httpsessionBindingListener, wadah servlet hanya akan memberi tahu jika nilai properti yang terikat atau tidak diikat adalah contoh dari pendengar. Misalnya:
Kelas Publik TestListener mengimplementasikan httpsessionBindingListener {@Overridepublic void valueBound (httpsessionBindingEvent event) {System.out.println ("httpsessionBindingListener.valueBound");}@overridePublic void void voidBound (htvalueBound "); {System.out.println ("httpsessionBindingListener.valueunbound");}}Kami menyesuaikan pendengar TestListener untuk mengimplementasikan httpsessionBindingListener. Mari atur atribut sesi berikut dalam kode:
Httpsession session = request.getSession (); testListener testListener = testListener baru (); session.setAttribute ("listener", testlistener); session.removeattribute ("listener");Di sini nilai atribut dari sesi ini adalah instance pendengar TestListener kami. Jadi ketika kode ini dijalankan, wadah Servlet akan memberi tahu TestListener dan memanggil kembali metode ValueBound dan ValueUnbound.
Perlu dicatat di sini bahwa ketika metode yang tidak divalidasi dari sesi dipanggil atau sesi gagal, metode ValueAnbound juga akan dipanggil kembali.
3 antarmuka mendengarkan terkait permintaan servlet
3.1 ServletRequestEvent
Kelas Publik ServletRequestEvent memperluas java.util.eventObject {private servletRequest request; public servletRequestEvent (servletcontext sc, servletRequest request) {sc); this.request = request;} public servletRequest getServletRequest () {this.request = request;} public servletRequest getServletRequest () {this.request = return; (ServletContext) super.getSource ();}}Acara yang terkait dengan permintaan servlet akan dipicu ketika permintaan berubah. Sumber Acara adalah instance ServletContext dan menyediakan pengambilan tambahan metode ServletContext dan ServletRequest.
3.2 ServletRequestListener
Antarmuka Publik ServletRequestListener memperluas EventListener {public void requestDestroyed (servletRequestEvent sre); public void requestInitialized (servletRequestEvent sre);}Ketika permintaan diinisialisasi atau dihancurkan, klien meminta untuk memasukkan aplikasi web (masukkan servlet atau filter pertama) atau aplikasi web mengembalikan respons ke klien (keluar dari servlet atau filter pertama). Container Servlet membangun instance servletRequestEvent, dan memanggil kembali metode requestInitialized dan requestdestroyed.
3.3 ServletRequestAttributeEvent
public class ServletRequestAttributeEvent extends ServletRequestEvent { private String name;private Object value;public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) {super(sc, request);this.name = name;this.value = value;}public String getName() {return this.name;}public Object getValue() {return ini. Nilai; }}Acara yang terkait dengan Servlet meminta atribut, yang akan dipicu ketika atribut permintaan berubah. Sumber acara adalah instance ServletContext dan menyediakan metode tambahan untuk mendapatkan nama atribut dan nilai atribut.
3.4 ServletRequestAttributeListener
Antarmuka Publik ServletRequestAttributeListener memperluas EventListener {public void atributeadded (servletRequestAttributeEvent srae); public attributeemoved (servletRequestAttributeEvent srae); public void attributeReplaced (servletRequestattribute srae);Ketika atribut yang diminta ditambahkan, dihapus, atau dimodifikasi, wadah Servlet membuat objek acara ServletRequestAttributeEvent, dan memanggil kembali metode yang diatribut, atributeMoved, dan atributeReplaced masing -masing.
Yang perlu Anda perhatikan di sini adalah metode atributePeplaced, yang menelepon kembali ketika nilai atribut diganti. Pada saat ini, jika Anda memanggil metode ServletRequestAttributeEvent.getValue (), pengembaliannya adalah untuk mengganti nilai atribut sebelumnya.
4. Ringkasan
Pada titik ini, pendengar selesai berbicara. Kita dapat menemukan bahwa pendengar, servlet, dan filter memiliki satu kesamaan, keduanya dijadwalkan oleh wadah. Kami hanya perlu menulis pendengar kami sendiri untuk mengimplementasikan antarmuka pendengar yang kami pedulikan dan mendaftar. Sisa pekerjaannya adalah menulis logika bisnis di pendengar kita sendiri.
Pendengar yang diperkenalkan dalam posting blog ini dirumuskan oleh spesifikasi Servlet 3.0. 3.1 telah menambahkan beberapa antarmuka pendengar acara, dan prinsip -prinsipnya serupa, pembaca dapat memahaminya sendiri.