ServletContext
Ketika wadah servlet (seperti Apache Tomcat ) mulai, itu akan menyebarkan dan memuat semua aplikasi webnya. Ketika aplikasi web dimuat, wadah servlet membuat ServletContextsekali dan menyimpannya di memori server. Aplikasi web web.xmldan semua web-fragment.xmlfile yang disertakan diuraikan, dan masing-masing <servlet>, <filter>dan <listener>ditemukan (atau masing-masing kelas dijelaskan dengan @WebServlet, @WebFilterdan @WebListenermasing - masing) dipakai satu kali dan disimpan dalam memori server juga. Untuk setiap filter instantiated, init()metodenya dipanggil dengan yang baru FilterConfig.
Ketika Servletmemiliki <servlet><load-on-startup>atau @WebServlet(loadOnStartup)nilai lebih besar dari 0, maka init()metode ini juga dipanggil saat startup dengan yang baru ServletConfig. Servlet tersebut diinisialisasi dalam urutan yang sama yang ditentukan oleh nilai tersebut ( 1adalah 1, 22, dll). Jika nilai yang sama ditetapkan untuk lebih dari satu servlet, maka masing-masing servlets dimuat dalam urutan yang sama seperti yang muncul dalam web.xml, web-fragment.xmlatau @WebServletclassloading. Jika nilai "load-on-startup" tidak ada, init()metode akan dipanggil kapan saja permintaan HTTP mengenai servlet untuk pertama kalinya.
Ketika wadah servlet selesai dengan semua langkah inisialisasi yang dijelaskan di atas, maka ServletContextListener#contextInitialized()akan dipanggil.
Ketika servlet kontainer menutup, itu membongkar semua aplikasi web, memanggil destroy()metode semua servlets yang diinisialisasi dan filter, dan semua ServletContext, Servlet, Filterdan Listenercontoh yang menghancurkan. Akhirnya ServletContextListener#contextDestroyed()akan dipanggil.
HttpServletRequest dan HttpServletResponse
Wadah servlet dilampirkan ke server web yang mendengarkan permintaan HTTP pada nomor port tertentu (port 8080 biasanya digunakan selama pengembangan dan port 80 dalam produksi). Ketika klien (misalnya pengguna dengan browser web, atau menggunakan programURLConnection ) mengirim permintaan HTTP, wadah servlet membuat objek HttpServletRequestdan baru HttpServletResponsedan melewati mereka melalui apa pun yang ditentukan Filterdalam rantai dan, akhirnya, Servletinstance.
Dalam kasus filter , doFilter()metode dipanggil. Ketika kode penampung servlet memanggil chain.doFilter(request, response), permintaan dan tanggapan berlanjut ke filter berikutnya, atau tekan servlet jika tidak ada filter yang tersisa.
Dalam kasus servlets , service()metode dipanggil. Secara default, metode ini menentukan salah satu doXxx()metode yang akan digunakan berdasarkan request.getMethod(). Jika metode yang ditentukan tidak ada dari servlet, maka kesalahan HTTP 405 dikembalikan dalam respons.
Objek permintaan menyediakan akses ke semua informasi tentang permintaan HTTP, seperti URL, header, string kueri, dan badan. Objek respons memberikan kemampuan untuk mengontrol dan mengirim respons HTTP seperti yang Anda inginkan, misalnya, memungkinkan Anda untuk mengatur header dan isi (biasanya dengan konten HTML yang dihasilkan dari file JSP). Ketika respons HTTP dilakukan dan diselesaikan, objek permintaan dan respons didaur ulang dan tersedia untuk digunakan kembali.
HttpSession
Ketika klien mengunjungi webapp untuk pertama kalinya dan / atau HttpSessiondiperoleh untuk pertama kalinya melalui request.getSession(), wadah servlet membuat HttpSessionobjek baru , menghasilkan ID panjang dan unik (yang bisa Anda dapatkan session.getId()), dan menyimpannya di server. Penyimpanan. Wadah servlet juga menetapkan a Cookiedi Set-Cookieheader respons HTTP dengan JSESSIONIDsebagai namanya dan ID sesi unik sebagai nilainya.
Sesuai spesifikasi cookie HTTP (kontrak yang harus dipatuhi oleh setiap browser web dan server web yang layak), klien (browser web) diharuskan untuk mengirim cookie ini kembali dalam permintaan berikutnya di Cookieheader selama cookie tersebut valid (cookie tersebut valid) yaitu ID unik harus merujuk ke sesi yang tidak kedaluwarsa dan domain dan jalurnya benar). Menggunakan monitor lalu lintas HTTP bawaan browser Anda, Anda dapat memverifikasi bahwa cookie tersebut valid (tekan F12 di Chrome / Firefox 23+ / IE9 +, dan periksa tab Net / Network ). Wadah servlet akan memeriksa Cookietajuk setiap permintaan HTTP yang masuk untuk mengetahui keberadaan cookie dengan nama JSESSIONIDdan menggunakan nilainya (ID sesi) untuk mendapatkan yang terkait HttpSessiondari memori server.
The HttpSessiontetap hidup sampai telah diam (yaitu tidak digunakan dalam permintaan) untuk lebih dari nilai batas waktu yang ditentukan dalam <session-timeout>, pengaturan di web.xml. Nilai batas waktu default ke 30 menit. Jadi, ketika klien tidak mengunjungi aplikasi web lebih lama dari waktu yang ditentukan, wadah servlet merusak sesi. Setiap permintaan berikutnya, bahkan dengan cookie yang ditentukan, tidak akan memiliki akses ke sesi yang sama lagi; wadah servlet akan membuat sesi baru.
Di sisi klien, cookie sesi tetap hidup selama instance browser berjalan. Jadi, jika klien menutup instance browser (semua tab / windows), maka sesi tersebut dibuang ke sisi klien. Dalam instance browser baru, cookie yang terkait dengan sesi tidak akan ada, sehingga cookie tidak akan lagi dikirim. Hal ini menyebabkan pembuatan yang sama sekali baru HttpSession, dengan cookie sesi yang sama sekali baru digunakan.
Pendeknya
- The
ServletContexthidup selama kehidupan aplikasi web. Itu dibagikan di antara semua permintaan di semua sesi.
- The
HttpSessionhidup selama klien berinteraksi dengan aplikasi web dengan contoh browser yang sama, dan sesi belum habis waktunya di sisi server. Itu dibagikan di antara semua permintaan dalam sesi yang sama .
- Itu
HttpServletRequestdan HttpServletResponsehidup dari saat servlet menerima permintaan HTTP dari klien, sampai respons lengkap (halaman web) telah tiba. Itu tidak dibagikan di tempat lain.
- Semua
Servlet, Filterdan Listenercontoh hidup selama aplikasi web hidup. Mereka dibagikan di antara semua permintaan di semua sesi.
- Apa pun
attributeyang didefinisikan ServletContext, HttpServletRequestdan HttpSessionakan hidup selama objek yang dipermasalahkan hidup. Objek itu sendiri mewakili "ruang lingkup" dalam kerangka kerja manajemen kacang seperti JSF, CDI, Spring, dll. Kerangka kerja tersebut menyimpan kacang scoping mereka sebagai attributelingkup pencocokan terdekat.
Keamanan Thread
Yang mengatakan, perhatian utama Anda mungkin keamanan benang . Anda sekarang harus tahu bahwa servlet dan filter dibagikan di antara semua permintaan. Itu hal yang menyenangkan tentang Java, itu multithreaded dan utas berbeda (baca: permintaan HTTP) dapat menggunakan contoh yang sama. Kalau tidak akan terlalu mahal untuk dibuat ulang, init()dan destroy()mereka untuk setiap permintaan tunggal.
Anda juga harus menyadari bahwa Anda tidak boleh menetapkan permintaan atau data cakupan sesi sebagai variabel instan dari servlet atau filter. Ini akan dibagikan di antara semua permintaan lain di sesi lain. Itu bukan thread-safe! Contoh di bawah menggambarkan ini:
public class ExampleServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Lihat juga: