Szkolenia programowania we Wrocławiu
Kurs Java EE - rozszerzony

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.

 

<- Poprzedni kurs | Następny kurs ->

 

Komentarze

Komentarze zamknięte. Zapraszamy do grupy 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.

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.
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.

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