Serwlet Dżakarta - Jakarta Servlet

Serwlet Dżakarta
Pierwotny autor (autorzy) Pavni Diwanji
Deweloper(zy) Fundacja Eclipse
Pierwsze wydanie grudzień 1996 ; 24 lata temu ( 1996-12 )
Wersja stabilna
5.0 / 7 września 2020 ; 10 miesięcy temu ( 2020-09-07 )
Magazyn Edytuj to na Wikidata
Napisane w Jawa
Platforma Dżakarta EE 9
Rozmiar 2,56 MB
Rodzaj Komponent oprogramowania dla Web API
Licencja Licencja Publiczna Eclipse
Stronie internetowej Dżakarta .pl / specyfikacje / servlet / 5 0,0 /
Życie pliku JSP

Jakarta Servlet (dawniej Java Servlet) jest Java składnik oprogramowania , który rozszerza możliwości na serwerze . Chociaż serwlety mogą odpowiadać na wiele typów żądań, najczęściej implementują kontenery internetowe do obsługi aplikacji internetowych na serwerach internetowych, a zatem kwalifikują się jako internetowy interfejs API serwletów po stronie serwera . Takie serwlety WWW są odpowiednikiem Java innych technologii dynamicznej zawartości WWW , takich jak PHP i ASP.NET .

Wstęp

Jakarta Servlet przetwarza lub przechowuje klasę Java w Jakarta EE, która jest zgodna z Jakarta Servlet API, standardem implementacji klas Java, które odpowiadają na żądania. Serwlety mogą w zasadzie komunikować się za pośrednictwem dowolnego protokołu klient-serwer , ale najczęściej są używane z HTTP . Tak więc "serwlet" jest często używany jako skrót dla "serwletu HTTP". W ten sposób twórca oprogramowania może użyć serwletu, aby dodać dynamiczną zawartość do serwera WWW przy użyciu platformy Java . Wygenerowana treść to zwykle HTML , ale mogą to być inne dane, takie jak XML i częściej JSON. Serwlety mogą utrzymywać stan w zmiennych sesji w wielu transakcjach serwerowych za pomocą ciasteczek HTTP lub mapowania adresów URL .

Jakarta Servlet API został do pewnego stopnia zastąpiony przez dwie standardowe technologie Java dla usług internetowych:

Aby wdrożyć i uruchomić serwlet, należy użyć kontenera internetowego . Kontener WWW (znany również jako kontener serwletów) jest zasadniczo składnikiem serwera WWW, który współdziała z serwletami. Kontener WWW jest odpowiedzialny za zarządzanie cyklem życia serwletów, mapowanie adresu URL do konkretnego serwletu i zapewnienie, że requester URL ma odpowiednie prawa dostępu.

Servlet API , zawarty w hierarchii pakietów Javajavax.servlet , definiuje oczekiwane interakcje kontenera WWW i serwletu.

A Servletto obiekt, który odbiera żądanie i generuje odpowiedź na podstawie tego żądania. Podstawowy pakiet Servlet definiuje obiekty Java reprezentujące żądania i odpowiedzi serwletu, jak również obiekty odzwierciedlające parametry konfiguracyjne serwletu i środowisko wykonania. Pakiet javax.servlet.httpdefiniuje specyficzne dla HTTP podklasy ogólnych elementów serwletu, w tym obiekty zarządzania sesjami, które śledzą wiele żądań i odpowiedzi między serwerem WWW a klientem. Serwlety mogą być spakowane w pliku WAR jako aplikacja internetowa .

Serwlety mogą być generowane automatycznie z Jakarta Server Pages (JSP) przez kompilator Jakarta Server Pages . Różnica między serwletami a JSP polega na tym, że serwlety zazwyczaj osadzają HTML w kodzie Java, podczas gdy JSP osadzają kod Java w HTML. Chociaż bezpośrednie użycie serwletów do generowania kodu HTML (jak pokazano w poniższym przykładzie) stało się rzadkie, framework sieciowy MVC wyższego poziomu w Jakarta EE ( JSF ) nadal wyraźnie używa technologii serwletów do obsługi żądań/odpowiedzi niskiego poziomu za pośrednictwem FacesServlet. Nieco starszym zastosowaniem jest używanie serwletów w połączeniu z stronami JSP we wzorcu o nazwie „ Model 2 ”, który jest odmianą kontrolera model-widok .

Obecna wersja Servlet to 5.0.

Historia

Java Servlet API po raz pierwszy zostało publicznie ogłoszone na inauguracyjnej konferencji JavaOne w maju 1996 roku. Około dwa miesiące po ogłoszeniu na konferencji pierwsza publiczna implementacja została udostępniona na stronie JavaSoft. Była to pierwsza wersja alfa Java Web Server (JWS; wówczas znana pod nazwą kodową Jeeves ), która została ostatecznie wysłana jako produkt 5 czerwca 1997 roku.

W swoim blogu na java.net , weteran firmy Sun i lider GlassFish, Jim Driscoll, szczegółowo opisuje historię technologii serwletów. James Gosling po raz pierwszy pomyślał o serwletach we wczesnych dniach Javy , ale koncepcja ta stała się produktem dopiero w grudniu 1996 roku, kiedy Sun wysłał JWS. Tak było, zanim to, co jest teraz Jakarta EE, zostało przekształcone w specyfikację.

Specyfikacja Servlet1 została stworzona przez Pavni Diwanji podczas jej pracy w Sun Microsystems , a wersja 1.0 została ukończona w czerwcu 1997 roku. Począwszy od wersji 2.2, specyfikacja została opracowana w ramach Java Community Process .

Historia API serwletów
Wersja API serwletu Wydany Specyfikacja Platforma Ważne zmiany
Serwlet Dżakarty 5.0.0 M1 12 cze 2020 5.0 Dżakarta EE 9 API przeniesione z pakietu javax.servletdojakarta.servlet
Serwlet Dżakarty 4.0.3 13 sie 2019 4.0 Dżakarta EE 8 Zmieniono nazwę ze znaku towarowego „Java”
Serwlet Java 4.0 wrz 2017 JSR 369 Java EE 8 HTTP/2
Serwlet Java 3.1 maj 2013 JSR 340 Java EE 7 Nieblokujące we/wy, mechanizm aktualizacji protokołu HTTP ( WebSocket )
Serwlet Java 3.0 grudzień 2009 JSR 315 Java EE 6, Java SE 6 Podłączanie, łatwość rozwoju, serwlet asynchroniczny, bezpieczeństwo, przesyłanie plików
Serwlet Java 2.5 wrzesień 2005 JSR 154 Java EE 5, Java SE 5 Wymaga Java SE 5, obsługuje adnotacje
Serwlet Java 2.4 Listopad 2003 JSR 154 J2EE 1.4, J2SE 1.3 web.xml używa schematu XML
Serwlet Java 2.3 Sierpień 2001 JSR 53 J2EE 1.3, J2SE 1.2 Dodanie Filter
Serwlet Java 2.2 Sierpień 1999 JSR 902 , JSR 903 J2EE 1.2, J2SE 1.2 Staje się częścią J2EE, wprowadził niezależne aplikacje internetowe w plikach .war
Serwlet Java 2.1 Listopad 1998 2.1a Nieokreślony Dodano pierwszą oficjalną specyfikację RequestDispatcher,ServletContext
Serwlet Java 2.0 grudzień 1997 Nie dotyczy JDK 1.1 Część kwietnia 1998 r. Java Servlet Development Kit 2.0
Serwlet Java 1.0 grudzień 1996 Nie dotyczy Część z czerwca 1997 r. Java Servlet Development Kit (JSDK) 1.0

Cykl życia serwletu

W cyklu życia serwletu kluczowe znaczenie mają trzy metody. Są to init(), service(), i destroy(). Są one implementowane przez każdy serwlet i są wywoływane przez serwer w określonym czasie.

  • Na etapie inicjalizacji cyklu życia serwletu kontener WWW inicjuje instancję serwletu, wywołując init()metodę, przekazując obiekt implementujący javax.servlet.ServletConfiginterfejs. Ten obiekt konfiguracyjny umożliwia serwletowi dostęp do parametrów inicjalizacji nazwa-wartość z aplikacji WWW.
  • Po zainicjowaniu instancja serwletu może obsługiwać żądania klientów. Każde żądanie jest obsługiwane w osobnym wątku. Kontener WWW wywołuje service()metodę serwletu dla każdego żądania. service()Metoda określa rodzaj wniosku odniesienia i wysyła je do odpowiedniej metody do obsługi żądania. Twórca serwletu musi zapewnić implementację tych metod. Jeśli żądanie jest zgłoszone dla metody, która nie jest zaimplementowana przez aplet, wywoływana jest metoda klasy nadrzędnej, co zwykle skutkuje zwróceniem błędu do żądającego.
  • Na koniec kontener WWW wywołuje destroy()metodę, która wyłącza serwlet. destroy()Metoda, jak init(), nazywa się tylko raz w cyklu życia serwletu.

Poniżej przedstawiono typowy scenariusz użytkownika tych metod.

  1. Załóżmy, że użytkownik prosi o odwiedzenie adresu URL .
    • Przeglądarka następnie generuje żądanie HTTP dla tego adresu URL.
    • To żądanie jest następnie wysyłane do odpowiedniego serwera.
  2. Żądanie HTTP jest odbierane przez serwer WWW i przekazywane do kontenera serwletów.
    • Kontener mapuje to żądanie do konkretnego serwletu.
    • Aplet jest dynamicznie pobierany i ładowany do przestrzeni adresowej kontenera.
  3. Kontener wywołuje init()metodę serwletu.
    • Ta metoda jest wywoływana tylko wtedy, gdy aplet jest po raz pierwszy ładowany do pamięci.
    • Możliwe jest przekazanie parametrów inicjujących do serwletu, aby mógł się sam skonfigurować.
  4. Kontener wywołuje service()metodę serwletu.
    • Ta metoda jest wywoływana w celu przetworzenia żądania HTTP.
    • Aplet może odczytywać dane, które zostały podane w żądaniu HTTP.
    • Aplet może również sformułować odpowiedź HTTP dla klienta.
  5. Aplet pozostaje w przestrzeni adresowej kontenera i jest dostępny do przetwarzania wszelkich innych żądań HTTP otrzymanych od klientów.
    • service()Metoda jest wywoływana dla każdego żądania HTTP.
  6. Kontener może w pewnym momencie zdecydować o wyładowaniu serwletu ze swojej pamięci.
    • Algorytmy, za pomocą których podejmowana jest ta decyzja, są specyficzne dla każdego kontenera.
  7. Kontener wywołuje destroy()metodę serwletu w celu porzucenia wszelkich zasobów, takich jak uchwyty plików, które są przydzielone serwletowi; ważne dane mogą zostać zapisane w magazynie trwałym.
  8. Pamięć przydzielona dla serwletu i jego obiektów może być następnie zbierana.

Przykład

Poniższy przykładowy aplet wypisuje, ile razy jego service()metoda była wywoływana.

Zauważ, że HttpServletjest to podklasa GenericServlet, implementacja Servletinterfejsu.

service()Metoda HttpServletklasy wysyła żądania do metod doGet(), doPost(), doPut(), doDelete(), i tak dalej; zgodnie z żądaniem HTTP. W poniższym przykładzie service()jest nadpisany i nie rozróżnia obsługiwanej metody żądania HTTP.

import java.io.IOException;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class ServletLifeCycleExample extends HttpServlet {
    private Integer sharedCounter;

    @Override
    public void init(final ServletConfig config) throws ServletException {
        super.init(config);
        getServletContext().log("init() called");
        sharedCounter = 0;
    }

    @Override
    protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
        getServletContext().log("service() called");
        int localCounter;
        synchronized (sharedCounter) {
            sharedCounter++;
            localCounter = sharedCounter;
        }
        response.getWriter().write("Incrementing the count to " + localCounter);  // accessing a local variable
    }

    @Override
    public void destroy() {
        getServletContext().log("destroy() called");
    }
}

Serwery kontenerowe

Specyfikacja technologii Servlet została zaimplementowana w wielu produktach. Zobacz listę implementacji na stronie kontenera internetowego.

Bibliografia

Linki zewnętrzne