Parameter Permulaan Konteks dan Servlet

1. Gambaran keseluruhan

Servlet adalah kelas Java biasa yang dijalankan dalam wadah servlet.

Servlet HTTP (jenis servlet tertentu) adalah warga kelas pertama dalam aplikasi web Java. API servlet HTTP ditujukan untuk menangani permintaan HTTP melalui siklus permintaan-pemprosesan-respons khas, yang dilaksanakan dalam protokol pelayan klien .

Tambahan pula, servlet dapat mengawal interaksi antara klien (biasanya penyemak imbas web) dan pelayan menggunakan pasangan nilai-kunci dalam bentuk parameter permintaan / respons.

Parameter ini dapat diinisialisasi dan terikat pada ruang lingkup aplikasi (parameter konteks) dan skop khusus servlet (parameter servlet).

Dalam tutorial ini, kita akan belajar bagaimana menentukan dan mengakses parameter dan parameter permulaan servlet .

2. Memulakan Parameter Servlet

Kami dapat menentukan dan menginisialisasi parameter servlet menggunakan anotasi dan deskriptor penyebaran standard - fail "web.xml" . Perlu diingat bahawa kedua-dua pilihan ini tidak saling eksklusif.

Mari kita terokai setiap pilihan ini secara mendalam.

2.1. Menggunakan Anotasi

Memulakan parameter servlet dengan anotasi membolehkan kita menyimpan konfigurasi dan kod sumber di tempat yang sama .

Di bahagian ini, kami akan menunjukkan cara menentukan dan mengakses parameter inisialisasi yang terikat pada servlet tertentu menggunakan anotasi.

Untuk melakukannya, kami akan menerapkan kelas UserServlet naif yang mengumpulkan data pengguna melalui bentuk HTML biasa.

Pertama, mari kita lihat fail JSP yang menjadikan bentuk kita:

   Context and Initialization Servlet Parameters    

Please fill the form below:

Name:Email:

Perhatikan bahawa kami telah mengkodkan atribut tindakan borang dengan menggunakan EL (Bahasa Ekspresi). Ini memungkinkannya untuk selalu menunjuk ke jalan “/ userServlet” , terlepas dari lokasi file aplikasi di server.

The "$ {pageContext.request.contextPath}" ungkapan menetapkan URL dinamik untuk bentuk, yang sentiasa relatif ke jalan konteks aplikasi .

Inilah pelaksanaan servlet awal kami:

@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"}, initParams={ @WebInitParam(name="name", value="Not provided"), @WebInitParam(name="email", value="Not provided")})) public class UserServlet extends HttpServlet { // ... @Override protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); forwardRequest(request, response, "/WEB-INF/jsp/result.jsp"); } protected void processRequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", getRequestParameter(request, "name")); request.setAttribute("email", getRequestParameter(request, "email")); } protected void forwardRequest( HttpServletRequest request, HttpServletResponse response, String path) throws ServletException, IOException { request.getRequestDispatcher(path).forward(request, response); } protected String getRequestParameter( HttpServletRequest request, String name) { String param = request.getParameter(name); return !param.isEmpty() ? param : getInitParameter(name); } } 

Dalam kes ini, kami telah menentukan dua parameter inisialisasi servlet, nama dan e - mel , dengan menggunakan initParams dan anotasi @WebInitParam .

Harap perhatikan bahawa kami telah menggunakan kaedah getParameter () HttpServletRequest () untuk mengambil data dari bentuk HTML, dan kaedah getInitParameter () untuk mengakses parameter inisialisasi servlet.

The getRequestParameter () kaedah pemeriksaan jika nama dan e-mel parameter permintaan adalah rentetan kosong.

Sekiranya mereka rentetan kosong, maka mereka diberi nilai lalai dari parameter permulaan yang sesuai.

Kaedah doPost () terlebih dahulu mengambil nama dan e-mel yang dimasukkan oleh pengguna dalam borang HTML (jika ada). Kemudian memproses parameter permintaan dan meneruskan permintaan ke fail "result.jsp" :

    User Data   

User Information

Name: ${name}

Email: ${email}

Sekiranya kami menyebarkan aplikasi web sampel kami ke pelayan aplikasi, seperti Apache Tomcat, Oracle GlassFish atau JBoss WidlFly, dan menjalankannya, pertama sekali ia harus memaparkan halaman bentuk HTML.

Setelah pengguna mengisi bidang nama dan e - mel dan menghantar borang, ia akan mengeluarkan data:

User Information Name: the user's name Email: the user's email 

Sekiranya borang kosong, ia akan memaparkan parameter inisialisasi servlet:

User Information Name: Not provided Email: Not provided 

Dalam contoh ini, kami telah menunjukkan bagaimana untuk menentukan parameter pengawalan servlet dengan menggunakan anotasi, dan bagaimana untuk mengaksesnya dengan g etInitParameter () kaedah .

2.2. Menggunakan Penerangan Penerapan Standard

Pendekatan ini berbeza dengan pendekatan yang menggunakan anotasi, kerana ini membolehkan kita memastikan konfigurasi dan kod sumber tetap terpisah antara satu sama lain .

Untuk mempamerkan bagaimana untuk menentukan parameter pengawalan servlet dengan "web.xml" fail, mari kita pertama mengeluarkan initParam dan @WebInitParam anotasi dari UserServlet kelas:

@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"}) public class UserServlet extends HttpServlet { ... } 

Seterusnya, mari tentukan parameter inisialisasi servlet dalam fail "web.xml" :

   UserServlet UserServlet  name Not provided   email Not provided    

Seperti yang ditunjukkan di atas, menentukan parameter inisialisasi servlet menggunakan file "web.xml" hanya akan menggunakan , dan tanda nama.

Selanjutnya, mungkin untuk menentukan seberapa banyak parameter servlet yang diperlukan, selagi kita berpegang pada struktur standard di atas.

Semasa kita menyebarkan semula aplikasi ke pelayan dan menjalankannya semula, aplikasi tersebut harus sama dengan versi yang menggunakan anotasi.

3. Memulakan Parameter Konteks

Kadang-kadang kita perlu menentukan beberapa data yang tidak berubah yang mesti dikongsi secara global dan diakses di seluruh aplikasi web.

Oleh kerana sifat global data, kita harus menggunakan parameter inisialisasi konteks aplikasi untuk menyimpan data, dan bukannya menggunakan rakan sekerja servlet .

Walaupun tidak dapat menentukan parameter inisialisasi konteks menggunakan anotasi, kami dapat melakukan ini dalam file “web.xml” .

Anggaplah bahawa kita ingin memberikan beberapa nilai global lalai untuk negara dan wilayah tempat aplikasi kita berjalan.

Kita dapat melakukannya dengan beberapa parameter konteks.

Mari kita ubah semula fail "web.xml" dengan sewajarnya:

  province Mendoza   country Argentina   

Masa ini, kami telah menggunakan , dantag untuk menentukan parameter konteks wilayah dan negara .

Sudah tentu, kita perlu memfaktorkan semula kelas UserServlet agar dapat mengambil parameter ini dan meneruskannya ke halaman hasil.

Berikut adalah bahagian yang berkaitan dengan servlet:

@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"}) public class UserServlet extends HttpServlet { // ... protected void processRequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", getRequestParameter(request, "name")); request.setAttribute("email", getRequestParameter(request, "email")); request.setAttribute("province", getContextParameter("province")); request.setAttribute("country", getContextParameter("country")); } protected String getContextParameter(String name) {- return getServletContext().getInitParameter(name); } } 

Please notice the getContextParameter() method implementation, which first gets the servlet context through getServletContext(), and then fetches the context parameter with the getInitParameter() method.

Next, we need to refactor the “result.jsp” file so that it can display the context parameters along with the servlet-specific parameters:

Name: ${name}

Email: ${email}

Province: ${province}

Country: ${country}

Lastly, we can redeploy the application and execute it once again.

If the user fills the HTML form with a name and an email, then it will display this data along with the context parameters:

User Information Name: the user's name Email: the user's email Province: Mendoza Country: Argentina 

Otherwise, it would output the servlet and context initialization parameters:

User Information Name: Not provided Email: Not provided Province: Mendoza Country: Argentina 

While the example is contrived, it shows how to use context initialization parameters to store immutable global data.

As the data is bound to the application context, rather than to a particular servlet, we can access them from one or multiple servlets, using the getServletContext() and getInitParameter() methods.

4. Conclusion

In this article, we learned the key concepts of context and servlet initialization parameters and how to define them and access them using annotations and the “web.xml” file.

For quite some time, there has been a strong tendency in Java to get rid of XML configuration files and migrate to annotations whenever possible.

CDI, Spring, Hibernate, to name a few, are glaring examples of this.

Walaupun begitu, tidak ada yang salah dengan menggunakan fail "web.xml" untuk menentukan parameter permulaan dan parameter servlet.

Walaupun Servlet API telah berkembang dengan cepat ke arah kecenderungan ini, kami masih perlu menggunakan deskriptor penyebaran untuk menentukan parameter inisialisasi konteks .

Seperti biasa, semua contoh kod yang ditunjukkan dalam artikel ini terdapat di GitHub.