Żądanie HTTP, zarówno typu GET jak i POST, określa przede wszystkim URL zasobu do którego wysyłamy żądanie, ale może dodatkowo zawierać pewną liczbę parametrów. Wysyłając żądanie GET klient ma możliwość przekazania parametrów poprzez doklejenie ich w odpowiedni sposób do URL. W przypadku żądania POST parametry przekazywane są w treści właściwej żądania (której nie widzimy – tworzy ją za nas przeglądarka WWW). Ogólna postać URL dla żądania GET jest następująca:
http://{domena}:{port}/{zasób}?{parametry}
Zarówno {port} jak i {zasób} są opcjonalne. Opcjonalne są także {parametry}, ale jeśli chcemy je przekazać wraz z żądaniem, to doklejamy je do końca URL po znaku zapytania. Składnia definicji pojedynczego parametru jest następująca:
{nazwa}={wartość}
Element {nazwa} to nazwa parametru a {wartość} to jego wartość. Kolejne definicje parametrów oddzielamy od siebie znakiem &. Przykładowo, aby przekazać 3 parametry napisalibyśmy:
{nazwa}={wartość}&{nazwa}={wartość}&{nazwa}={wartość}
Żądania typu POST służą do wysyłania formularzy, a parametry takich żądań to nic innego jak wartości wpisane w pola formularza. Przykładowy formularz poniżej:
<form method="POST" action="http://naukajavy.pl/kalkulator"> x: <input type="text" name="paramX"> y: <input type="text" name="paramY"> <input type="submit" value="Dodaj"> </form>
Wyświetlając powyższy formularz w ramach strony HTML przeglądarka wyświetli dwa pola tekstowe oraz przycisk którego kliknięcie spowoduje wysłanie żądania POST. Żądanie to będzie zawierało dwa parametry: parametr o nazwie paramX oraz paramY. Wartości tych parametrów będą takie, jakie wpiszemy w pola formularza.
Niezależnie od tego czy parametry przekazano w jeden czy drugi sposób, wraz z żądaniem GET czy POST, odczytujemy je w kodzie servletu w ten sam sposób, tzn. za pomocą metody String getParameter(String name) obiektu reprezentującego żądanie.
Parametry są zawsze typu String, tak więc aby np. zaimplementować servlet sumujący dwie liczby przekazane za pomocą formularza jako parametry żądania musielibyśmy sparsować je, tak aby otrzymać zmienne typu int. W tym celu możemy posłużyć się metodą statyczną int parseInt(String) z klasy Integer. Poniżej przykładowa implementacja takiego servletu:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = resp.getWriter(); String paramX = req.getParameter("paramX"); String paramY = req.getParameter("paramY"); out.println("<html><body>"); int sum = Integer.parseInt(paramX) + Integer.parseInt(paramY); out.println("Suma liczb x i y wynosi " + sum); out.println("</body><html>"); out.close(); }
Jeśli chcemy aby nasz servlet obsługiwał także żądania wysyłane metodą GET to wystarczyłoby do powyższego dopisać:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); }
Tym samym przekazujemy obsługę żądań typu GET do metody doPost(…). Jest to możliwe, jako że parametry, niezależnie od tego jakiego typu żądanie HTTP otrzymaliśmy, obsługujemy w ten sam sposób. Także w ten sam sposób generujemy stronę HTML która odsyłana jest jako odpowiedź na żądanie.
Witam. Bardzo fajny artykul. Napisalem program ktory loguje mi sie na strone i wypisuje zawartosc storny. Mam problem, poniewaz nie potrafie wyslac przy pomocy GET;a parametrow. PRosze o pomoc. 2344004 moje GG