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
Famework Spark jest oparty na open source-owym serwerze Jetty
3. plik startowy serwera
class App {
public static void main(String[] args) {
}
}kopiuj
i testujemy na domyślnym porcie 4567
http://localhost:4567/testkopiuj
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
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
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
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:
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)
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
<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
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
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.
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
String test = "response from server";
res.type("application/json");
return test;
}kopiuj
potrzebne importy
import spark.Request;
import spark.Response;kopiuj
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());
kopiuj7. 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
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
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
kopiuj