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!
java
servlets
jakarta-ee
Max A.
źródło
źródło
Odpowiedzi:
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)
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 doSevletContext
: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()
(lubdoGet()
,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
HttpServletRequest
dodano dwie nowe metody:login(username, password)
ilogout()
.Aby uzyskać więcej informacji, zapoznaj się z interfejsem API Java EE 6 .
źródło
@ServletFilter
→@WebFilter
i@WebServletContextListener
→@WebListener
w oficjalnych specyfikacjach AFAICT.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 .
źródło
Jak wspomniał Don, główne obszary ulepszeń i dodatków to:
Sprawdź prezentację Javaone 2008 „ Java Servlet 3.0 API: Co nowego i ekscytującego ”, aby uzyskać szczegółowe informacje.
źródło
Ten link dostarczy wystarczających informacji na temat Servlet 3
Servlet 3 obsługuje adnotacje w celu wyeliminowania
web.xml
@WebServlet @WebServletContextListener @ServletFilter @InitParam
źródło