MEMPERBARUI
Hanya sebagai pembaruan dan untuk lebih eksplisit, ini adalah perbedaan utama antara servlet 2.5 dan 3 (saya tidak mencoba untuk menjadi lengkap, saya hanya menyebutkan bagian yang paling menarik):
Anotasi untuk mendeklarasikan servlet, filter, dan listener (kemudahan pengembangan)
Di servlet 2.5, untuk mendeklarasikan servlet dengan satu parameter init Anda perlu menambahkan ini ke web.xml :
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<param-value>config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>
Di servlet 3, web.xml bersifat opsional dan Anda dapat menggunakan anotasi sebagai pengganti XML. Contoh yang sama:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
Untuk filter, Anda perlu menambahkan ini di web.xml di servlets 2.5:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>
Setara dengan menggunakan anotasi di servlet 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Untuk pendengar (dalam hal ini ServletContextListener), di servlet 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
Hal yang sama menggunakan anotasi:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Modularisasi web.xml (Pluggability)
- Di servlet 2.5 hanya ada satu file web.xml monolitik .
- Dalam servlet 3, setiap jar "loadable" dapat memiliki web-fragment.xml dalam direktori META-INF-nya yang menentukan servlet, filter, dll. Ini untuk memungkinkan perpustakaan dan kerangka kerja menentukan servlet mereka sendiri atau objek lain.
Pendaftaran dinamis servlet, filter, dan pendengar pada waktu inisialisasi konteks (Pluggability)
Dalam servlets 3, sebuah ServletContextListener
dapat menambahkan dinamis servlets, filter dan pendengar menggunakan metode berikut ditambahkan ke SevletContext
: addServlet()
, addFilter()
danaddListener()
Dukungan asynchronous
Contoh: katakanlah bahwa beberapa wadah servlet memiliki lima utas di kumpulan utasnya, dan ada proses yang memakan waktu untuk dieksekusi per permintaan (seperti kueri SQL yang kompleks).
Dengan servlets 2,5 kontainer servlet ini akan kehabisan benang tersedia jika menerima lima permintaan pada waktu yang sama dan lima benang tersedia mulai melakukan proses, karena benang tidak akan kembali sampai service()
(atau doGet()
, doPost()
, dll) dijalankan dari awal untuk mengakhiri dan mengembalikan tanggapan.
Dengan servlet 3.0, proses lama ini dapat didelegasikan ke utas lain dan selesai service()
sebelum mengirim respons (respons sekarang akan dikirim oleh utas terbaru). Dengan cara ini utas bebas menerima tanggapan baru.
Contoh dukungan asynchronous:
Servlet 2.5:
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
runSlowProcess();
}
}
Servlet 3:
@WebServlet(name="myServlet",
urlPatterns={"/mySlowProcess"},
asyncSupported=true)
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
AsyncContext myAsyncContext = request.startAsync(request, response);
delegateExecutionToProcessingThread(myAsyncContext);
}
}
public class MyProcessingObject {
public void doSlowProcess() {
runSlowProcess();
myAsyncContext.complete();
}
}
Antarmuka AsyncContext
juga memiliki metode untuk mendapatkan objek permintaan, objek respons dan menambahkan pendengar untuk memberi tahu mereka ketika suatu proses telah selesai.
Login dan logout terprogram (peningkatan keamanan)
Dalam servlet 3, antarmuka HttpServletRequest
telah ditambahkan dua metode baru: login(username, password)
dan logout()
.
Untuk lebih jelasnya, lihat Java EE 6 API .