Apa perbedaan antara Servlet 2.5 dan 3?

92

Saya memutar kode J2EE yang mengikuti Servlet 2.5 dan saya bertanya-tanya apa perbedaan utama antara 2.5 dan 3. Pointer ke dokumen resmi Sun dan pengalaman pribadi paling dihargai.

Jika saya tidak harus memikirkan diri saya sendiri dengan 3 untuk saat ini, katakan saja. Terima kasih!

Max A.
sumber
2
+1 Hanya menunggu jawaban :)
ATorras

Jawaban:

150

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 ServletContextListenerdapat 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();
        // no async support, thread will be free when runSlowProcess() and
        // doGet finish

        // ...
    }

}

Servlet 3:

@WebServlet(name="myServlet",
             urlPatterns={"/mySlowProcess"},
             asyncSupported=true) // asyncSupported MUST be specified for
                                  // servlets that support asynchronous
                                  // processing
public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {


        // an AsyncContext is created, now the response will be completed
        // not when doGet finalizes its execution, but when
        // myAsyncContext.complete() is called.
        AsyncContext myAsyncContext = request.startAsync(request, response);

        // ...

        // myAsyncContext is passed to another thread
        delegateExecutionToProcessingThread(myAsyncContext);

        // done, now this thread is free to serve another request
    }

}

// ... and somewhere in another part of the code:

public class MyProcessingObject {

    public void doSlowProcess() {

        // ...

        runSlowProcess();
        myAsyncContext.complete(); // request is now completed.

        // ...

    }

}

Antarmuka AsyncContextjuga 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 HttpServletRequesttelah ditambahkan dua metode baru: login(username, password)dan logout().

Untuk lebih jelasnya, lihat Java EE 6 API .

morgano
sumber
3
Perlu disebutkan bahwa Servlet 3.0 dirilis kembali pada bulan desember 2009. Pertanyaan dan jawaban yang diterima saat ini mendahului mereka.
eis
1
@ServletFilter@WebFilterdan @WebServletContextListener@WebListenerdalam spesifikasi resmi AFAICT.
lapo
21

Servlet 3.0 belum dirilis, tapi sepertinya sudah sangat dekat. Perubahan terpenting dalam 3.0 adalah: Pluggability, Kemudahan pengembangan, Async Servlet, Keamanan. Apakah ini penting atau tidak bagi Anda, tidak mungkin saya katakan.

Yang paling signifikan dari ini mungkin adalah dukungan untuk Servlet asinkron. Berikut artikel yang menjelaskan ini secara rinci. Spesifikasi lengkapnya bisa diunduh disini .

Dónal
sumber
Sialan, itu bagus. Hal-hal asinkron tampak luar biasa, terima kasih atas infonya. Saya baru saja menyelesaikan pengkodean sesuatu yang sangat mirip dengan ini.
Max A.
@adi itu dirilis pada Desember 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz
4
UPDATE Servlet 3.1 spec dirilis 2013-05. Lihat apa yang baru .
Basil Bourque
13

Seperti yang disebutkan Don, area utama perbaikan dan penambahan adalah:

  • Pluggability (modularisasi web.xml)
  • Kemudahan pengembangan (anotasi, generik, konvensi atas konfigurasi)
  • Dukungan servlet Async (untuk pemrograman gaya komet, proxy web async, layanan web asinkron)
  • Peningkatan keamanan (login / logout terprogram)
  • Lainnya (Cookie HttpOnly, Pelacakan sesi, EJB dalam file WAR)

Lihat presentasi Javaone 2008 " Java Servlet 3.0 API: What's new and exciting " untuk detailnya.

Pascal Thivent
sumber