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

Kurs Java EE i Jakarta EE

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.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

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 : <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> . 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ą?

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.

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

<blockquote> <a href="#comment-12763" rel="nofollow"> <strong><em>Krzysiek:</em></strong> </a> 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. </blockquote>

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ć?