Baza Wiedzy

Pierwszy Servlet "Hello World"

Jak już wcześniej pisałem, servlet jest to program napisany w języku Java przynależącego do pakietu javax obsługujący zapytania HTTP.

Teraz napiszę, jak krok po kroku możemy stworzyć własny servlet, który pozwoli nam wyświetlić w przeglądarce napis "Hello World".

Potrzebujemy:

    • Eclipse EE
    • Apache Tomcat

    1. Tworzymy nowy projekt

    Jako że servlet należy do dynamicznych komponentów języka Javy, tworzymy nowy projekt "Dynamic Web Project". Klikamy na File -> New -> Dynamic Web Project.

    eclipse - dynamic web project

    Wpisuje nazwę projektu i klikamy dalej, otworzy nam się okno z konfiguracją budowania aplikacji, ale tutaj nic zmieniać nie musimy. Klikamy dalej. Otworzy nam się okienko, które prosi o konfiguracje modułu webowego projektu.

    eclipse - web module

    Eclipse prosi nas o podanie "Context root" oraz "Content directory". Ja je ustawiłem jak jest pokazane wyżej. Ważne jest, aby zaznaczyć "Generate web.xml deployment descriptor". Dzięki temu, eclipse stworzy nam plik web.xml w którym skonfigurujemy sobie rozmieszczenie poszczególnych komponentów projektu, ale o tym za chwile.

    Jeśli udało nam się wszystko poprawnie wykonać, powinniśmy zobaczyć nowy projekt o nazwie "HelloWorld" w Project Explorerze.

    eclipse - helloworld projectPrzyjrzyjmy się teraz dokładnie naszemu nowo powstałemu projektowi:

    Strukturę "Dynamic Web Project 3.0" widzimy po prawej. Składa się ona z:

    • JAX-WS Web Services

    Folder ten zawiera serwisy sieciowe oparte o Java Api for XML. Folder ten nas nie będzie interesował w tym projekcie.

    • Deployment Description: HelloWorld

    Folder ten zawiera wszystkie komponenty, jakie zostały zawarte w naszym projekcie. Wspiera on wyszukiwanie, edytowanie oraz tworzenie nowych komponentów projektu, takich jak np Servlety. Eclipse mapuje katalogi projektu w poszukiwaniu odpowiednich komponentów i segreguje ich do odpowiednich katalogów.

    • Java Resources

    Folder ten zawiera wszystkie komponenty stworzone przez nas, takie jak pakiety, klasy czy interfejsy. To tu będą definiowane wszystkie źródłowe pliki.

    • JavaScript Resources

    Dynamic Web Project w pełni wspiera język JavaScript i tutaj zawarte są komponenty tego języka, które później będzie można wykorzystywać przy tworzeniu stron www.

    • build

    Folder zawiera wszystkie komponenty projektu, które będą tworzone przy buildowaniu projektu. Folder ten nas nie będzie interesował w tym projekcie.

    • webapp

    Folder zawierający pliki konfiguracyjne projektu.

    Plik MANIFEST.MF w folderze META-INF zawiera informacje o zależnościach z innych dynamicznych web modułów.

    WEB-INF zawiera folder lib, gdzie można dodać wszystkie biblioteki, z których chcielibyśmy w przyszłości korzystać w naszej aplikacji. Folder również zawiera plik web.xml.

    To co nas będzie interesować, to głównie foldery Java Resources -> src oraz webapp -> WEB-INF.

    Napiszemy teraz własny Servlet.

    W folderze Java Resource -> src stworzymy pakiet "pl.javastart.servlets" oraz klasę HelloWorldServlet.java .

    package pl.javastart.servlets;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class HelloWorldServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out = response.getWriter();
    		out.print("Hello World");
    	}
    }

    O to nasz pierwszy servlet wyświetlający napis "Hello World". Widzimy tutaj, że nasza klasa HelloWorldServlet dziedziczy po klasie HttpServlet. Dzięki temu, Tomcat będzie wiedział z jakim programem ma do czynienie i odpowiednio go przetworzy. Widzimy tutaj, że nasz servlet będzie wykonywał tylko funkcję "doGet". Gdy przeglądarka wyśle requesta (zapytanie) GET, servlet go przyjmie i odeśle response (odpowiedź dla przeglądarki) posiadający napis "Hello World".

    Teraz musimy powiedzieć Tomcatowi, gdzie jest w projekcie nasz servlet oraz jak ma go mapować. Do tego służy plik web.xml o którym wspominałem wcześniej.

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <servlet>
        <servlet-name>Hello World</servlet-name>
        <servlet-class>pl.javastart.servlets.HelloWorldServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Hello World</servlet-name>
        <url-pattern>/test</url-pattern>
      </servlet-mapping>
    </web-app>

    W sekcji <servlet> definiujemy nazwę naszego servletu (<servlet-name>) oraz podajemy ścieżkę (<servlet-class>) do klasy reprezentującą nasz servlet (paczka pl.javastart.servlets oraz klasa HelloWorldServlet).

    W sekcji <servlet-mapping> ustalamy sposób w jaki tomcat ma mapować poszczególne servlety naszego projektu. Dla  servletu "Hello World" link url (<url-pattern>) ustawiłem wartość "/test". Oznacza to, że gdy w przeglądarce wpiszemy "http://[adres serwera]/[nazwa projektu]/test" uruchomimy nasz servlet. <url-pattern> możemy ustawić na cokolwiek.

    Pora uruchomić nasz projekt.

    Klikamy prawym guzikiem na nasz projekt, wybieramy Run as -> Run on Server. Otworzy nam się się okno:

    eclipse - run on serverWybieramy naszego Tomcata, klikamy Finish i powinna nam się otworzyć strona internetowa z adresem "http://localhost:8080/HelloWorld/". Jest to domyślny adres naszego projektu. Przeglądarka wyświetli nam w nagłówku strony "HTTP STATUS 404 - /HelloWorld/". Oznacza to, że przeglądarka nie znalazła zasobu na tej strony, ale wystarczy, że dopiszemy do końca linku "test" i uruchomimy nasz Servlet.

    http://localhost:8080/HelloWorld/test

    Brawo, właśnie swoimi umiejętnościami programistycznymi możesz pochwalić się w internecie :).

    Tips and tricks:

    1. Po każdorazowej zmianie w projekcie (edycja klasy, pliku konfiguracyjnego) musimy zrestartować naszego Tomcata, aby mógł załadować nowe zmiany.

    2. Servlet możemy stworzyć troszkę czybciej, wystarczy kliknąć prawy na Deployment Descriptor: Hello World -> Servlets -> New -> Servlet.

    Zadania do realizacji:

    1. Napisz drugi Servlet, który będzie stroną startową naszego projektu (czyli będzie odpalany po uruchomieniu projektu w tomcacie).

    2. Dodaj link w startowym Servlecie do HelloWorldServlet. (tip : link definiujemy za pomocą <a href="adres url">Tekst widoczny w przeglądarce</a>).

    3. Dowiedz się, jaka jest różnica między metodą HTTP GET i POST.

    Najlepszy newsletter o Javie w Polsce

    Czy chcesz otrzymywać nowości ze świata Javy oraz przykładowe pytania rekrutacyjne? Zapisz się na newsletter i bądź na bieżąco! Otrzymasz także ekskluzywne materiały oraz informacje o nowych kursach i promocjach.

    Traktujemy Twoją prywatność poważnie. Nikomu nie udostępniamy Twojego maila no i zawsze możesz się wypisać.

    Komentarze do artykułu

    Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.

    Marcin

    No to zabieramy się do zabawy! :) Jedna rzecz: czy można zmienić coś, by obrazki po kliknięciu zostały powiększanie, a nie otwierał się nowy odnośnik? Strasznie irytująca rzecz, gdy chce się zobaczyć mały obrazek.

    Sławek Ludwiczak

    mówisz, masz :)

    Marcin

    Dzięki, od razu lepiej :)

    Marcin

    Gdzie znajduje się ten web.xml? W webapp/WEB-INF? Bo zawartość jest inna i nieco mnie to zaskakuje, bo nie wiem gdzie to znaleźć.

    Rafał Mikołajczuk

    W paczce którą dałem jest HelloWorld.zip\HelloWorld\webapp\WEB-INF\web.xml Cóż, może nie zmieniłeś nazwy WebContent na webapp. Jeśli tego nie zrobileś, to nic się nie stalo. Folder WebContent zawiera wszystko to co webapp i tam znajdziesz plik web.xml A jeśli go nie ma, to go stwórz ;)

    Marcin

    Dziękuję! Znalazłem go po prostu ściągając całą paczkę z workspace i tam go szukając. :) Dzieki jeszcze raz!

    Marcin

    Okej, nie było pytania. :P

    TT

    Mam problem z uruchomieniem mojego (waszego) projektu. Eclipse zainstalowany, Tomcat zainstalowany, projekt krok po kroku utworzony, konfiguracja (web.xml) i servlet skopiowane ale przy próbie uruchomienia dostaję "Could not load the Tomcat servcer configuration at \Servers\Tomcat v7.0 Server at localhost-config. The configuration may be corrupt or incomplete" :-(

    Rafał Mikołajczuk

    Eclipse nie jest wstanie podpiąć projektu do tomcata (nie jestem w stanie powiedzieć dlaczego). Spróbuj usunąć serwer w eclipsie i utworzyć go na nowo. Potrwa to szybko, bo tomcata masz już na dysku. Tam w pewnym momencie możesz nawet powiedzieć tomcatowi, aby od razu pobrał Twój projekt. Powinien się projekt uruchomić.

    TT

    faktycznie, po usunięciu tego serwera i stworzeniu go z nazwą nie zawierającą spacji i wskazując na folder wcześniejszej instalacji jako źródłowy - wszystko poszło ok. Czekam z niecierpliwością na następną lekcję i informację jak połączyć stronę JSP z kodem servletu, a może robi się to jeszcze jakoś inaczej? Czy serwlety mogą zwracać każdy typ danych czy to złamanie jakieś dobrej praktyki (myślę o zwracaniu json, albo streamu pliku) ?

    Piszu

    Czemu na Forum nie ma działu Java EE ?

    Piszu

    Dorzuciłem linię response.setCharacterEncoding("UTF-8");, jednak dalej w przeglądarce zamiast Świecie mam ?wiecie. Jak poprawnie powinno ustawiać się kodowanie?

    Rafał Mikołajczuk

    Aby poprawnie ustawić kodowanie, musiałbym w respone odsyłać strukture całego pliku html i w nagłówku pliku html ustawić kodowanie, np poprzez : . To co teraz odsyłasz w response to jest czysty tekst, bez żadnej struktury. Spróbuj sobie do String wpakować jakąś prostą stronę www z polskimi znakami, następnie tego stringa wrzucić do response i odesłać przeglądarce. Ustawiając kodowanie UTF-8 w response, ustawiasz sam typ kodowania zawartości żądania http, ale nie mówisz przeglądarce w jaki sposób ma być ta treść interpretowana.

    Piszu

    Jeszcze jedno pytanie.. tutaj otwieramy link http://localhost:8080/HelloWorld/test, a jak zrobić, żeby nasza aplikacja była widoczna bezpośrednio pod http://localhost:8080/

    Rafał Mikołajczuk

    Wydaje mi się, że musiałbyś namieszać w plikach konfiguracyjnych już samego Tomcata, gdyż jak wspominałem, Tomcat jest kontenerem na servlety, i każdy servlet jest mapowany właśnie przez nazwę po localhost:8080/NazwaProjektu. Bez problemu możesz zamienić '/test' na samo '/'. Kolejne pytania proszę kierować na forum, dzisiaj stworzyłem tam odpowiedni dział dla Javy EE.

    Żuku

    Witam, Napisałem program wg tutorialu, jednak elipse wyświetla mi błędy w pliku web.xml. W drugiej linii jest to "cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element-only.", identyczne błędy są podkreślone w liniach 3 i 7 dla servlet i servlet-mapping. Co może być tego przyczyną?

    Paweł

    Hej, jestem zielony z xmla, gdzie dokładnie muszę wstawić ten link jakistam Tekst widoczny w przeglądarce aby się takowy link wyswietlil? (wiem, ze w a href ma byc prawdziwy link, a nie napis "moj link")

    Sewer

    Hej ! zrobiłem krok po kroki jak według samouczka. Niestety dalej mi nie działa. Równiez miałem problem z serverem , ponownie go podpiąłem . Teraz jak lkikam run as .. to wyskakuje mi komunikat: ' Starting Tomcat v7.0 Server at localhost' has encountered a problem. Server Tomcat v7.0 Server at localhost failed to start " Pomożesz mi ?

    Malik

    Wydaje mi się że w pierwszym oknie konfiguracji projektu należy wybrać jako Target Runtime server Apache Tomcat, jeśli tego nie zrobimy pojawi się wiele błędów w konsoli.

    tomasz kowalczyk

    http://stackoverflow.com/questions/4076601/how-do-i-import-the-javax-servlet-api-in-my-eclipse-project

    Karolka

    Chcę utworzyć ten drugi Servlet. To ma byc kolejna klasa w tym samym projekcie? I jak teraz powinien wygladac ten plik xmlowy?

    Rafał Mikołajczuk

    Tak, należy napisać 2 servlet identycznie jak poprzednio oraz zdefiniowac nowo powstaly servlet w pliku xml. Robi się to tak samo jak przy servlecie Hello World.

    Miki

    Mam pytanie out.println("Tekst widoczny w przeglądarce</a"); po tym w pasku adresu wyskakuje mi http://localhost:8080/dwa/?test? stąd moje pytanie jak usunąć ten znak zapytania za pomocą kodu ?

    Krzysiek

    A ja mam pytanie związane z deployment description (plikiem web.xml). Czy potrafiłby ktoś dokładnie wytłumaczyć co to jest Welcome file? Wiem, że kontener korzysta z tych wytycznych ujętych w znaczniku ale ponoć nie zawsze, tylko wtedy jak coś tam do URI potrzebuje dodać, czy coś w tym rodzaju. Nie wiem, nie mogę tego zajarzyć dlatego pytam.

    Krzysiek

    Krzysiek: A ja mam pytanie związane z deployment description (plikiem web.xml). Czy potrafiłby ktoś dokładnie wytłumaczyć co to jest Welcome file? Wiem, że kontener korzysta z tych wytycznych ujętych jako Welcome files ale ponoć nie zawsze, tylko wtedy jak coś tam do URI potrzebuje dodać, czy coś w tym rodzaju. Nie wiem, nie mogę tego zajarzyć dlatego pytam.

    Paweł

    Mam ten sam problem co wyzej kolega, przy czym nie pomaga u mnie zafajkowanie w runtime tomcata. Jest zafajkowany, ale i tak wyrzuca ten sam błąd, a w tle mase czerwonych info. "Server Tomcat v7.0 Server at localhost failed to start." Jak sobie z tym poradzić?

    Kurs Java WrocławJavaStart na Youtube