Jakie są różnice między Servletem 2.5 i 3?

92

Wprowadzam kod J2EE, który jest zgodny z serwletem 2.5 i zastanawiam się, jakie są główne różnice między 2.5 a 3. Najbardziej cenione są wskazówki do oficjalnych dokumentów Sun i osobistych doświadczeń.

Jeśli na razie nie powinienem martwić się o 3, po prostu to powiedz. Dzięki!

Max A.
źródło
2
+1 Tylko czekam na odpowiedzi :)
ATorras

Odpowiedzi:

149

AKTUALIZACJA

Jako aktualizacja i żeby być bardziej precyzyjnym, oto główne różnice między serwletami 2.5 i 3 (nie staram się być wyczerpujący, wymieniam tylko najciekawsze części):

Adnotacje do deklarowania serwletów, filtrów i słuchaczy (łatwość programowania)

W apletach 2.5, aby zadeklarować serwlet z jednym parametrem inicjującym, musisz dodać to do 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>

W serwletach 3 plik web.xml jest opcjonalny i zamiast XML można używać adnotacji. Ten sam przykład:

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

W przypadku filtrów należy dodać to w pliku web.xml w serwletach 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>

Odpowiednik użycia adnotacji w serwletach 3:

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

Dla nasłuchiwania (w tym przypadku ServletContextListener), w serwletach 2.5:

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

To samo z adnotacjami:

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

Modularyzacja web.xml (możliwość podłączania)

  • W serwletach 2.5 jest tylko jeden monolityczny plik web.xml plik .
  • W apletach 3 każdy „ładowalny” plik jar może mieć w swoim katalogu META-INF plik web-fragment.xml określający serwlety, filtry itp. Ma to na celu umożliwienie bibliotekom i strukturom określania własnych serwletów lub innych obiektów.

Dynamiczna rejestracja serwletów, filtrów i detektorów w czasie inicjalizacji kontekstu (możliwość podłączania)

W serwletów 3, ServletContextListenermożna dodać dynamicznie serwlety, filtry i słuchaczy za pomocą następujących metod dodane do SevletContext: addServlet(), addFilter()iaddListener()

Wsparcie asynchroniczne

Przykład: załóżmy, że jakiś kontener serwletów ma pięć wątków w swojej puli wątków i że na żądanie jest wykonywany czasochłonny proces (jak złożone zapytanie SQL).

  • Z serwletów 2,5 ten kontener serwletów zabraknie dostępnych wątków, jeśli otrzyma pięć żądań w tym samym czasie i pięciu dostępnych tematów zacząć robić ten proces, ponieważ gwinty nie wróci aż service()(lub doGet(), doPost()itp) jest wykonywany od początku zakończyć i zwraca odpowiedź.

  • Dzięki apletom 3.0 ten długotrwały proces można delegować do innego wątku i zakończyć service()przed wysłaniem odpowiedzi (odpowiedź zostanie wysłana w najnowszym wątku). W ten sposób wątek może swobodnie otrzymywać nowe odpowiedzi.

Przykład wsparcia asynchronicznego:

Serwlety 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

        // ...
    }

}

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

        // ...

    }

}

Interfejs AsyncContext zawiera również metody pobierania obiektu żądania, obiektu odpowiedzi i dodawania detektorów w celu powiadomienia ich o zakończeniu procesu.

Automatyczne logowanie i wylogowywanie (ulepszenia bezpieczeństwa)

W serwletach 3 do interfejsu HttpServletRequestdodano dwie nowe metody: login(username, password)ilogout() .

Aby uzyskać więcej informacji, zapoznaj się z interfejsem API Java EE 6 .

morgano
źródło
3
Warto wspomnieć, że Servlet 3.0 został wydany w grudniu 2009 roku. Pytanie i obecnie akceptowana odpowiedź są starsze niż te.
eis
1
@ServletFilter@WebFilteri @WebServletContextListener@WebListenerw oficjalnych specyfikacjach AFAICT.
Lapo
21

Servlet 3.0 nie został jeszcze wydany, ale wygląda na to, że jest już blisko. Najważniejsze zmiany w 3.0 to: Możliwość podłączania, Łatwość programowania, Async Servlet, Bezpieczeństwo. Nie mogę powiedzieć, czy są one dla ciebie ważne, czy nie.

Najważniejszym z nich jest prawdopodobnie obsługa asynchronicznych serwletów. Oto artykuł, który szczegółowo to opisuje. Pełną specyfikację można pobrać tutaj .

Dónal
źródło
O cholera, to świetnie. Async wygląda niesamowicie, dzięki za informację. Właśnie skończyłem kodować coś bardzo podobnego do tego.
Max A.
@adi został wydany w grudniu 2009 r. ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz
4
UPDATE Servlet 3.1 wydany 2013-05. Zobacz co nowego .
Basil Bourque,
13

Jak wspomniał Don, główne obszary ulepszeń i dodatków to:

  • Możliwość podłączania (modularyzacja web.xml)
  • Łatwość tworzenia (adnotacje, typy ogólne, konwencja nad konfiguracją)
  • Obsługa serwletów asynchronicznych (do programowania w stylu komety, asynchronicznego serwera proxy sieci Web, asynchronicznych usług internetowych)
  • Ulepszenia bezpieczeństwa (automatyczne logowanie / wylogowywanie)
  • Inne (HttpOnly Cookie, śledzenie sesji, EJB w pliku WAR)

Sprawdź prezentację Javaone 2008 „ Java Servlet 3.0 API: Co nowego i ekscytującego ”, aby uzyskać szczegółowe informacje.

Pascal Thivent
źródło