JAVA 04 (p) - SPARK framework - GET /updated 11.04/

JAVA 04 (p) - SPARK framework - GET /updated 11.04/
ukryj menu
SPEC
aktualizacja: 2022-04-11 21:31:03

1. założenia na dzisiaj

- instalacja i opanowanie pracy z mikroserwerem Spark
- opanowanie get-a na tym serwerze
- praca z klasami


2. utworzenie projektu plus Maven

tworzymy nowy projekt jak zwykle

New Project / Java / OpenJDK 17 / Next / Lokalizacjakopiuj

Famework Spark jest oparty na open source-owym serwerze Jetty
Aby używać zewnętrznych bibliotek, można użyć managerów Gradle lub Maven
umożliwiających dodanie odpowiednich zależności
My będziemy korzystać z Mavena:


Klikamy prawym klawiszem na nazwę projektu / add Framework Support / Maven


po prawej pojawia się zakładka Maven oraz plik pom.xml

do wygenerowanego pliku pom.xml wstawiamy poniższe zależności (podobnie jak do package.json w NodeJS)

<dependencies>

<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.9.1</version>
</dependency>

</dependencies>kopiuj



naciskamy "odśwież" w zakładce Maven i sprawdzamy czy w dependencies widać bibliotekę spark


3. plik startowy serwera

w folderze main/java tworzymy plik i klasę App


class App {
    public static void main(String[] args) {
        
    }
}kopiuj


importujemy funkcje serwera spark

import static spark.Spark.*;kopiuj

i uruchamiamy najprostszego get-a w main

get("/test", (req, res) -> "test");kopiuj

cały serwer wygląda jak poniżej


import static spark.Spark.*;

class App {
    public static void main(String[] args) {
        get("/test", (req, res) -> "test");
    }
}




startujemy main

i testujemy na domyślnym porcie 4567

http://localhost:4567/testkopiuj

w tym momencie wszystko powinno działać lokalnie

4. Logowanie pracy serwera

podczas startu serwera pojawia się ostrzeżenie związane z brakiem odpowiednich bibliotek służących do logowania
pracy serwera

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.



dodajemy w pliku pom.xml poniższe dependencies

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-simple</artifactId>
   <version>1.7.30</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.7.30</version>
</dependency>kopiuj


restartujemy i obserwujemy konsolę serwera

powinna się pojawić m. in. informacja o porcie na którym startuje serwer

Listening on 0.0.0.0:4567kopiuj

Uwaga: jeśli wersja 1.7.30 nie działa, proszę zainstalować starszą
Dotyczy to wszystkich bibliotek.
W razie problemu zawsze można próbować po kolei starszych wersji

5. serwer spark - get

w powyższym przykładzie wyświetlał się tylko napis bezpośrednio w get
poniżej przykładowy get, i osobna funkcja do jego obsługi
wraz z kodowaniem odpowiedzi do klienta


get("/test", (req, res) -> testFunction(req, res));kopiuj

funkcja w klasie App

static String testFunction(Request req, Response res) {
        String test = "response from server";
        res.type("application/json");
        return test;
}kopiuj




potrzebne importy

import spark.Request;
import spark.Response;kopiuj

testujemy w firefox, będzie widać nagłówki

6. informacje które można uzyskać z responsa i requesta

wstaw do funkcji obsługującej geta /info poniższe informacje i wykonaj je przy adresie

http://localhost:4567/info?x=222&y=333kopiuj

informacje o obiektach request i response

System.out.println(res.status());
System.out.println(req.requestMethod());
System.out.println(req.attributes());
System.out.println(req.cookies());
System.out.println(req.params()); // potrzebne dziś
System.out.println(req.uri());
System.out.println(req.url());
System.out.println(req.queryParams()); // potrzebne dziś
System.out.println(req.queryParams("x")); // potrzebne dziś
System.out.println(req.pathInfo());
System.out.println(req.contentLength());
System.out.println(req.contentType());
System.out.println(req.protocol());
System.out.println(req.headers());
kopiuj



7. GSON - formatowanie danych

w postaci JSON-a

do przesyłania danych typu list z serwera do przeglądarki zastosujemy bibliotekę google Gson

dodajemy w pom.xml


<dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>2.8.6</version>
</dependency>kopiuj


przykład konwersji listy na json

w punkcie 8

ćwiczenie: utwórz dowolną ArrayList typu String i przetestuj jej wysłanie do przeglądarki

8. problemy z typami danych w Gson

dla złożonych typów najczęściej trzeba Gsona o nich poinformować

tworzymy obiekt klasy Gson

Gson gson = new Gson();kopiuj

gson zwraca obiekt przekonwertowany na stringa

return gson.toJson(l, ArrayList.class );kopiuj

dokumentacja Gson-a pokazuje jak poprawnie poinformować go o typie danych do konwersji
kiedy dane są w postaci bardziej złożonej niż lista stringów
poniższy przykład dalej jest oparty o listę stringów dla zrozumienia

Type listType = new TypeToken<ArrayList<String>>() {}.getType();
Gson gson = new Gson();
return gson.toJson(list, listType );kopiuj


9. pliki statyczne na serwerze spark

ustalenie ścieżki do stron html:

automatycznie pod adresem "/" startuje strona o nazwie index.html
zamieszczona w katalogu głównym aplikacji w "src/main/resources/public"
w tym wypadku jej lokalizacja to:


staticFiles.location("/public")kopiuj

poniższe ustalenie ścieżki do katalogu public umożliwia odświeżanie stron bez restartu serwera

externalStaticFileLocation("C:\\appfolder\\src\\main\\resources\\public");kopiuj

10. zadanie

na bazie jednej strony index.html z formularzem, zbuduj prosty serwis
dane samochodu w klasie Car{}
listę samochodów przechowuj w ArrayList<Car>
w serwisie wykorzystaj tylko metodę get
poniżej konkretne adresy, które należy obsłużyć


proszę wyniki sprawdzać w FF

get("/add")
get("/text")
get("/json")
get("/html")
get("/deleteall")
get("/delete/:id")
get("/update/:id")kopiuj



pobranie parametru z adresu o składni

http://localhost:4567/delete/2kopiuj

przy powyższych get-ach, to

req.params("id")
kopiuj