Servlet 2.5 ile 3 arasındaki farklar nelerdir?


92

Servlet 2.5'e uyan J2EE kodunu kullanıyorum ve 2.5 ile 3 arasındaki temel farkların neler olduğunu merak ediyorum. Resmi Sun belgeleri ve kişisel deneyimlerle ilgili işaretler en çok takdir edilenler.

Şimdilik 3 ile kendimi endişelendirmesem, sadece söyle. Teşekkürler!


2
+1 Sadece cevap bekliyorum :)
ATorras

Yanıtlar:


150

GÜNCELLEME

Bir güncelleme olarak ve daha açık olmak gerekirse, bunlar, sunucu uygulamaları 2.5 ve 3 arasındaki temel farklardır (kapsamlı olmaya çalışmıyorum, sadece en ilginç kısımlardan bahsediyorum):

Sunucu uygulamaları, filtreler ve dinleyiciler bildirmek için ek açıklamalar (geliştirme kolaylığı)

Servlet 2.5'te, bir init parametresine sahip bir sunucu uygulaması bildirmek için bunu web.xml'ye eklemeniz gerekir :

<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>

Sunucu uygulamaları 3'te web.xml isteğe bağlıdır ve XML yerine ek açıklamaları kullanabilirsiniz. Aynı örnek:

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

Filtreler için, bunu web.xml'de servlet 2.5'e eklemeniz gerekir :

<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>

Sunucu uygulamaları 3'te ek açıklamalar kullanılarak eşdeğer:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

Bir dinleyici için (bu durumda bir ServletContextListener), 2.5 sunucu uygulamalarında:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

Ek açıklamaları kullanarak aynı:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

Web.xml'nin modülerleştirilmesi (Eklenebilirlik)

  • Servlet 2.5'te yalnızca bir monolitik web.xml dosyası vardır.
  • Sunucu uygulamalarında 3, her "yüklenebilir" kavanoz , META-INF dizininde sunucuları, filtreleri vb. Belirten bir web-fragment.xml'ye sahip olabilir . Bu, kitaplıkların ve çerçevelerin kendi sunucu uygulamalarını veya diğer nesnelerini belirtmelerine izin vermek içindir.

Bağlam başlatma zamanında sunucu uygulamalarının, filtrelerin ve dinleyicilerin dinamik kaydı (Takılabilirlik)

Servlet 3'te, bir ServletContextListenerdinamik ilave servlet'ler, filtre ve şu yöntemleri kullanarak dinleyici ekleyebilir SevletContext: addServlet(), addFilter()veaddListener()

Eşzamansız destek

Örnek: bazı sunucu uygulamacığı konteynerinin iş parçacığı havuzunda beş iş parçacığı olduğunu ve istek başına yürütülecek zaman alan bir işlem olduğunu (karmaşık bir SQL sorgusu gibi) söyleyin.

  • Aynı anda beş talep ve beş mevcut konuları sürecini yapmaya başlamak alırsa ipler kadar dönmek olmaz çünkü servlet 2.5 ile bu servlet konteyner, mevcut iş parçacığı dışarı aday olacağını service()(ya doGet(), doPost()vs.) baştan yürütülür biter ve bir yanıt döndürür.

  • Sunucu uygulamaları 3.0 ile, bu uzun süreli işlem başka bir iş parçacığına devredilebilir ve service()yanıtı göndermeden önce tamamlanabilir (yanıt şimdi en son iş parçacığı tarafından gönderilecektir). Bu şekilde ileti dizisi yeni yanıtlar almakta serbesttir.

Eşzamansız destek örneği:

Servletler 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

        // ...
    }

}

Servletler 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.

        // ...

    }

}

Arabirim AsyncContextayrıca istek nesnesini, yanıt nesnesini almak ve bir işlem bittiğinde bunları bildirmek için dinleyiciler eklemek için yöntemler içerir.

Programlı oturum açma ve kapatma (güvenlik geliştirmeleri)

Sunucu uygulamalarında 3, arabirime HttpServletRequestiki yeni yöntem eklenmiştir: login(username, password)ve logout().

Daha fazla ayrıntı için Java EE 6 API'ye bakın .


3
Servlet 3.0'ın Aralık 2009'da piyasaya sürüldüğünü belirtmekte fayda var. Soru ve mevcut kabul edilmiş cevap, bunlardan önce geliyor.
eis

1
@ServletFilter@WebFilterve @WebServletContextListener@WebListenerresmi özelliklerde AFAICT.
lapo

21

Servlet 3.0 henüz piyasaya sürülmedi, ancak çok yakın gibi görünüyor. 3.0'daki en önemli değişiklikler şunlardır: Takılabilirlik, Geliştirme kolaylığı, Async Servlet, Güvenlik. Bunların sizin için önemli olup olmadığını söylemem imkansız.

Bunların en önemlisi muhtemelen asenkron Servlet desteğidir. İşte bunu ayrıntılı olarak açıklayan bir makale . Tam şartname indirilebilir burada .


Vay canına, bu harika. Eşzamansız şeyler harika görünüyor, bilgi için teşekkürler. Buna çok benzer bir şeyi kodlamayı yeni bitirdim.
Max A.

@adi, Aralık 2009'da yayınlandı ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz

4
GÜNCELLEME Servlet 3.1 spesifikasyonu 2013-05'te yayınlandı. Bkz Yenilikleri .
Basil Bourque

13

Don'un bahsettiği gibi, iyileştirmelerin ve eklemelerin ana alanları şunlardır:

  • Takılabilirlik (web.xml'nin modülerleştirilmesi)
  • Geliştirme kolaylığı (ek açıklamalar, jenerikler, yapılandırma yerine konvansiyon)
  • Eşzamansız servlet desteği (kuyruklu yıldız tarzı programlama, eşzamansız web proxy'si, eşzamansız web hizmetleri için)
  • Güvenlik geliştirmeleri (programlı oturum açma / oturum kapatma)
  • Diğerleri (HttpOnly Cookie, Session tracking, WAR dosyasında EJB)

Ayrıntılar için " Java Servlet 3.0 API: Yenilikler ve heyecan verici " Javaone 2008 sunumuna bakın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.