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, ServletContextListener
moż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();
}
}
Serwlety 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();
}
}
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 HttpServletRequest
dodano dwie nowe metody: login(username, password)
ilogout()
.
Aby uzyskać więcej informacji, zapoznaj się z interfejsem API Java EE 6 .