1.1 antara muka Servlet
Hari ini kita memulakan topik baharu dan menarik - servlets . Ia adalah penambahan servlet ke Java yang menyebabkan Java menjadi standard de facto untuk aplikasi pelayan yang besar. 80% daripada semua perisian perusahaan di dunia ditulis dalam Java. Dan di China, semuanya 100%. Jadi apa itu servlet?
Servlet ialah apa yang menjadikan program Java menjadi perkhidmatan web dan membolehkannya memproses permintaan daripada pelanggan. Dan ia adalah seperti ini ...
Pada tahun 90-an, sejurus selepas kemunculan World Wide Web, pelanggan web (pelayar) dan pelayan web muncul. Pelayan web biasanya hanya mengedarkan fail yang telah mereka simpan melalui Internet: halaman html, skrip, gambar, dsb.
Pada satu ketika, semua orang membuat kesimpulan bahawa adalah perlu untuk menjadikan kedua-dua pihak lebih bijak. JavaScript telah ditambahkan pada halaman HTML dan pemalam telah ditambahkan pada pelayan - skrip khas yang dipanggil sebagai tindak balas kepada permintaan tertentu dan menjadikan tingkah laku pelayan lebih fleksibel dan lebih pintar.
Jadi servlet ialah pemalam Java yang telah dibina Java web-server
dan membenarkannya untuk melaksanakan kod Java apabila diminta untuk halaman tertentu. Dan sudah pun kod Java ini, yang diwakili oleh kelas yang diwarisi daripada kelas Servlet, melakukan apa yang dimaksudkan oleh pembangunnya.
Dan seperti yang anda sedia maklum, pelayan web Java yang paling popular ialah Tomcat . Dinamakan, dengan cara itu, untuk menghormati kucing Tom dari kartun "Tom and Jerry".
Bagaimanakah Tomcat berinteraksi dengan servlet? Malah, proses ini diseragamkan dan dipanggil kitaran hayat servlet . Di dalamnya, servlet ialah objek yang boleh dimuatkan, dan pelayan web ialah bekas servlet .
Jika servlet belum lagi dimuatkan , maka:
- Kelas servlet dimuatkan oleh bekas.
- Bekas mencipta contoh kelas (objek) servlet.
- Bekas memanggil kaedah
init()
pada objek servlet. Kaedah dipanggil sekali sahaja.
Kitaran kerja standard - melayani permintaan pelanggan :
- Setiap permintaan diproses dalam urutan yang berasingan.
- Bekas itu memanggil kaedah
service()
pada servlet dan menghantar objek ServletRequest dan ServletResponse di sana. - Untuk menamatkan servlet, kaedah dipanggil
destroy()
pada objek servlet. Ia dipanggil sekali sahaja.
Terdapat banyak sebab mengapa servlet ditamatkan:
- Pengaturcara memulakan semula pelayan web, adalah perlu untuk menutup semua servlet dengan anggun.
- Pengaturcara memuatkan versi baharu servlet, yang lama mesti dipunggah dengan betul.
- Dan sebagainya.
Ingat perkara utama: pelayan web dan servletnya harus berfungsi tanpa kegagalan dan dimulakan semula selama berbulan-bulan, melayani beribu-ribu permintaan seminit. Oleh itu, kod untuk memuatkan, dan bekerja, dan memunggah servlet hendaklah sentiasa ditulis dengan kualiti yang sangat tinggi.
1.2 Kelas HttpServlet
Kelas Servlet wujud untuk menyeragamkan cara servlet dan bekas berfungsi. Pengaturcara tidak bekerja secara langsung dengan kelas ini. Nah, mereka jarang bekerja. Kelas yang paling biasa digunakan HttpServlet
diwarisi daripada Servlet.
Kelas ini mempunyai beberapa kaedah yang akan berguna kepada kita. Anda akan sering menggunakannya:
Kaedah | Penerangan | |
---|---|---|
1 | init() |
Dipanggil sekali apabila servlet dimuatkan |
2 | destroy() |
Dipanggil sekali apabila servlet dipunggah |
3 | service(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan baharu kepada servlet |
4 | doGet(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan GET baharu kepada servlet |
5 | doPost(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan POST baharu kepada servlet |
6 | doHead(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan HEAD baharu kepada servlet |
7 | doDelete(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan DELETE baharu kepada servlet |
8 | doPut(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan PUT baharu kepada servlet |
Kaedah init()
dan destroy()
diwarisi daripada kelas Servlet. Oleh itu, jika anda memutuskan untuk mengatasinya dalam servlet anda, anda juga perlu memanggil pelaksanaannya dari kelas asas. Perintah digunakan untuk ini super.method name()
.
Contoh Servlet:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 kaedah perkhidmatan (HttpServletRequest, HttpServletResponse).
Jika anda melihat pemprosesan permintaan pelanggan dari sudut pandangan servlet, maka perkara-perkara seperti ini.
Untuk setiap permintaan pelanggan, bekas (pelayan web) mencipta HttpServletRequest
dan objek HttpServletResponse
, dan kemudian memanggil kaedah service(HttpServletRequest request, HttpServletResponse response)
pada servlet yang sepadan. Objek ini dihantar kepadanya supaya kaedah boleh mengambil data yang diperlukan daripada request
dan meletakkan hasil kerja ke dalam response
.
Kaedah ini service()
mempunyai pelaksanaan lalai. Jika ia tidak ditakrifkan semula, maka ia akan dilaksanakan. Itu yang dia buat.
Kaedah service()
menentukan jenis kaedah HTTP daripada permintaan (GET, POST, ...) dan memanggil kaedah yang sepadan dengan permintaan.
Kaedah | Penerangan | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan baharu kepada servlet |
2 | doGet(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan GET baharu kepada servlet |
3 | doPost(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan POST baharu kepada servlet |
4 | doHead(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan HEAD baharu kepada servlet |
5 | doDelete(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan DELETE baharu kepada servlet |
6 | doPut(HttpRequest, HttpResponse) |
Dipanggil untuk setiap permintaan PUT baharu kepada servlet |
Dalam kelas anda, anda boleh sama ada mentakrifkan semula satu kaedah service()
atau biarkan sahaja, tetapi kemudian mentakrifkan semula kaedah doGet()
, doPost()
, ... seperti yang diperlukan.