Name & Praktikumstermin: Lars Köhler, 5211085 (Fr/2, Kr)
- Projekt: Einkaufszettel (Fr/2, Kr)
- Inhaltsverzeichnis
- Kurzbeschreibung inkl. Screenshot
- Beschreibung des Projektaufbaus
- Abgabedateien (LOC)
- Testdateien (TST)
- Aufbau der Anwendung
- Dokumentation des implementierten WebAPIs
- Technischer Anspruch (TA) und Umsetzung der Features
- Quellennachweis
Mittels des Programms kann der Nutzer einen bzw. mehrere digitale Einkaufszettel erstellen. Jedem dieser Einkaufszettel kann man frei einen Namen zuweisen. Auserdem kann man jedem Einkaufszettel beliebig viele Artikel zuweisen und nach Belieben auch wieder entfernen, sollte man diesen Artikel erworben haben. Einkaufszettel kann man speichern und nachträglich erneut öffnen und die dazugehörigen Artikel bearbeiten. Sollte man alle Einkäufe von einem Einkaufszettel erledigt haben, kann man diesen dann auch wieder komplett entfernen.
Verlinkter Dateiname | Dateiart | LOC |
---|---|---|
App.java | Java | 43 |
ListManager.java | Java | 65 |
HTMLGenerator.java | Java | 59 |
Session.java | Java | 21 |
connection.js | JavaScript | 3 |
main.js | JavaScript | 82 |
index.html | HTML | 37 |
all.css | CSS | 2 |
main.css | CSS | 58 |
variables.css | CSS | 9 |
= 379 |
Verlinkter Dateiname | Testart | Anzahl der Tests |
---|---|---|
ListTest.java | Asserts |
Die Tests werden wie folgt ausgeführt: Im Terminal wird auf der Ebene der ListTest.java
(src/main/java/shopping/list) die Eingabe jshell -R-ea ListTest.java
getätigt.
Datei | Inhalt |
---|---|
App.java | |
ListManager.java | |
HTMLGenerator.java | |
Session.java | |
connection.js | |
main.js | |
index.html | |
all.css | |
main.css | |
variables.css |
Der Ordner resources
beinhaltet den Code für das GUI (.html
und .css
) und die beiden JavaScript Dateien zum Senden von HTTP-Requests und Verarbeiten der HTTP-Responses des Servers.
Für die implementierten WebAPIs wurde zum einen JavaScript für die Request
und Javascript für die Response genommen. Die Funktion für die Javascript Request findet man somit in der connection.js
die dann in der main.js
verwendet werden.
Für die Request wurde die Methode POST
verwendet.
In Java werden die Request über Javalin app.post
angesprochen.
Über die connection.js
wird ein Request wie folgt definiert:
function sendToServer(target, query = '') {
return fetch(target, {body: query, method : "POST"}).then(response => response).catch(console.error);
}
In der main.js
wird in der Zeile 37 über die Funktion sendToServer
ein Request mit dem Namen "listhtml" gestellt welcher den Namen des Zettels an den Server App.java
übergibt
und als Response von dem Server das HTML von dem Einkaufszettel erwartet.
sendToServer('/listhtml', "name=" + listName).then((response) => {
response.text().then(function(responseText) {
document.getElementById("emotion").insertAdjacentHTML('beforeend', responseText);
registerEvents();
})
});
app.post("/listhtml", ctx -> {
ctx.result(ListManager.addList(ctx.formParam("name")));
});
me = this;
sendToServer('/article', "name="+ this.previousSibling.value +"&id=" + this.parentElement.id ).then((response) => {
response.text().then(function(responseText) {
document.getElementById(me.parentElement.id).insertAdjacentHTML('beforeend', responseText);
registerEvents();
})
});
app.post("/article", ctx -> {
int id = ListManager.splitId(ctx.formParam("id"));
String name = ctx.formParam("name");
ctx.result(ListManager.addArticle(id, name));
});
me = this;
sendToServer('/remove', "id=" + this.parentElement.parentElement.id + "&name=" + this.previousSibling.firstChild.data).then((response) => {
me.parentElement.remove();
})
app.post("/remove", ctx -> {
ListManager.removeArticle(ListManager.splitId(ctx.formParam("id")), ctx.formParam("name"));
});
sendToServer('/close', "id=" + this.parentElement.id);
document.getElementById(this.parentElement.id).remove();
app.post("/close", ctx -> {
int id = ListManager.splitId(ctx.formParam("id"));
ListManager.removeList(id);
});
me = this;
sendToServer('/save', "id=" + this.parentElement.id + "&name=" + this.parentElement.children[1].value).then((response) => {
response.text().then(function(responseText) {
me.parentElement.parentElement.insertAdjacentHTML('afterbegin', responseText);
me.parentElement.remove();
registerEvents();
})
})
app.post("/save", ctx -> {
int id = ListManager.splitId(ctx.formParam("id"));
ctx.result(HTMLGenerator.getListOpenHTML(id, ctx.formParam("name")));
ctx.sessionAttribute("list", ListManager.getArticlesById(id));
ctx.sessionAttribute("id", id);
ctx.sessionAttribute("name", ctx.formParam("name"));
});
me = this;
sendToServer('/open', "id=" + this.id + "&name=" + this.innerHTML).then((response) => {
response.text().then(function(responseText) {
document.getElementById("emotion").insertAdjacentHTML('beforeend', responseText);
me.remove();
registerEvents();
})
})
app.post("/open", ctx -> {
ctx.result(HTMLGenerator.getListHTMLbyId(Integer.parseInt(ctx.formParam("id")), ctx.formParam("name")));
});
Ich habe folgende Features verwendet. Die verlinkte Datei zeigt beispielhaft den Einsatz dieses Features in den angegebenen Zeilen im Quellcode.
- Bootstrap. index.html (13-41)
- Session Handling Session.java
https://www.w3schools.com/
https://stackoverflow.com/
https://git.thm.de/dhzb87/JbX
https://javalin.io/documentation
https://javalin.io/tutorials/
https://moodle.thm.de/course/view.php?id=4223
http://openbook.rheinwerk-verlag.de/javainsel/
Session.java https://javalin.io/tutorials/jetty-session-handling-java