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.
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 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.
Przyjrzyjmy 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:
Wybieramy 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:
-
Po każdorazowej zmianie w projekcie (edycja klasy, pliku konfiguracyjnego) musimy zrestartować naszego Tomcata, aby mógł załadować nowe zmiany.
-
Servlet możemy stworzyć troszkę czybciej, wystarczy kliknąć prawy na Deployment Descriptor: Hello World -> Servlets -> New -> Servlet.
Zadania do realizacji:
-
Napisz drugi Servlet, który będzie stroną startową naszego projektu (czyli będzie odpalany po uruchomieniu projektu w tomcacie).
-
Dodaj link w startowym Servlecie do HelloWorldServlet. (tip : link definiujemy za pomocą <a href="adres url">Tekst widoczny w przeglądarce</a>).
-
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ć?