Ich nehme derzeit an einer Akademie zum Java Fullstack Software Engineer teil. In den kommenden Wochen möchte ich hier meine Mitschrift, so gut es geht, aufzeichnen und mitteilen. Hier ist das, was ich vom fünften Tag in Block 3 gelernt und behalten habe:
Model -View - Control
MVC bedeutet, dass man die Klassen aufteilt in Model (Datenhaltung), View (macht Darstellung(Frontend)) und Control (macht die Verarbeitung. Hier gehört die Business-Logik hin).

Properties-Dateien liegen im Ordner "recources". Sie können wie folgt gelesen werden:

Wir erzeugen ein jar Archiv:


Man muss aufpassen, wohin man die Properties schreibt. Intern oder Extern:


Das externe File-system ist das, wo der Admin die Properties Dateien ablegen sollte. Diesen Pfad kann man auch mit der -D Variable als Übergabeparameter setzen. (Siehe Blog vom Vortag).
Wir erstellen ein resource Directory:

Lesen der Propertie-Datei:
// Oeffene der RecourceBundels (resources / META-INF) und oeffne dei Properties-Datei app.properties InputStream input = KUGBuchCotroller.class.getClassLoader().getResourceAsStream("app.properties"); //Properties Objekt erzeugen Properties prop = new Properties(); // Lese die Properties-Datei in das Properties-Objekt prop.load(input); String datafilename = prop.getProperty("data.filename"); // Puffer fuer die Datei einrichten // BufferedReader br = new BufferedReader(new FileReader("./data/kurz_u_gut.dat")); BufferedReader br = new BufferedReader(new FileReader(datafilename));
Bei dem Inputstream wird ja eine Methode aufgerufen, zu der scheinbar kein Objekt gehört, weil es kein "new KUGBuchCoroller" gibt. Aber in Wirklichkeit gibt es ein Objekt mit dem Namen "class", welches in java.lang (?) steckt.
--------------------------------------------------------------
Logging mit Log4j
In der pom.xml wird log4j hinzugefügt:



Konfig: Der Plasspath zeigt normalerweise auf …/src/main
Loglevel:

Appender sind die Punkte wo der Output hingehen soll:

Logpoint:
Der Logpoint nimmt die Logs auf.
Wenn eine Klasse aus "com.myapp" ein Log vom Typ Error wirft, dann wird sie an den Appender "mail" weiter gereicht:



Hier sind die Properties:

Und so sieht das Logfile aus:

Hier noch mal die Log Einstellungen in unserem Java Package "Kurz und Gut":
KUGBuchCotroller.java
package de.firma.control;import de.firma.model.KUGBuch;
import de.firma.view.KUGBuchView;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.io.;
import java.util.;public class KUGBuchCotroller {
private static final Logger LOGGER = LogManager.getLogger(KUGBuchCotroller.class); public void run() { String line; String[] fieldArray; List<KUGBuch> buchlist; Map<String, KUGBuch> buchmap; buchlist = new ArrayList<KUGBuch>(); buchmap = new HashMap<String, KUGBuch>(); try { // Oeffene der RecourceBundels (resources / META-INF) und oeffne dei Properties-Datei app.properties InputStream input = KUGBuchCotroller.class.getClassLoader().getResourceAsStream("app.properties"); //Properties Objekt erzeugen Properties prop = new Properties(); // Lese die Properties-Datei in das Properties-Objekt prop.load(input); input = null; String datafilename = prop.getProperty("data.filename"); // Puffer fuer die Datei einrichten // BufferedReader br = new BufferedReader(new FileReader("./data/kurz_u_gut.dat")); BufferedReader br = new BufferedReader(new FileReader(datafilename)); int satzcounter= 0; // Zeilenweise einlesen der Datei while ((line = br.readLine()) != null) { satzcounter++; if (line.length() != 0) { // Spitten des CSV-Datensatzes beim Pipe-Zeichens fieldArray = line.split("\\|"); if (fieldArray.length == 5) { // Preis korrektur Dezimelkomma zum Dezimalpunkt fieldArray[3] = fieldArray[3].replace(',', '.'); KUGBuch kb = new KUGBuch(fieldArray[4], fieldArray[0], fieldArray[1], Integer.parseInt(fieldArray[2]), Double.parseDouble(fieldArray[3])); buchlist.add(kb); buchmap.put(kb.getIsbn(), kb); } else { LOGGER.warn("Satz #" + satzcounter + " fehlerhaft, Inhalt: " + line); } } else { LOGGER.warn("Satz #" + satzcounter + " fehlerhaft, Inhalt: " + line); } } br.close(); KUGBuchView kugBuchView = new KUGBuchView(); kugBuchView.view(buchlist, buchmap); } catch (FileNotFoundException e) { // e.printStackTrace(); LOGGER.error("FileNotFoundException " + e.getMessage()); } catch (IOException e) { // e.printStackTrace(); LOGGER.error("IOException " + e.getMessage()); } }
}
KUGBuch.java
package de.firma.model;public class KUGBuch {
// Eigenschaften private String isbn; private String titel; private String autor; private int jahr; private double preis; //Konstruktoren public KUGBuch() { super(); } public KUGBuch(String isbn, String titel, String autor, int jahr, double preis) { this(); this.isbn = isbn; this.titel = titel; this.autor = autor; this.jahr = jahr; this.preis = preis; } // Getter- und Setter-Methoden public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getTitel() { return titel; } public void setTitel(String titel) { this.titel = titel; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } public int getJahr() { return jahr; } public void setJahr(int jahr) { this.jahr = jahr; } public double getPreis() { return preis; } public void setPreis(double preis) { this.preis = preis; } // Bussines-Logik @Override public String toString() { return this.isbn +" "+ this.titel +" "+ this.jahr +" "+ this.preis ; }
}
KUGBuchView.java
package de.firma.view;import de.firma.model.KUGBuch;
import java.util.List;
import java.util.Map;public class KUGBuchView {
public void view(List<KUGBuch> buchlist, Map<String,KUGBuch> buchmap){ System.out.println("KuG Buecher As List"); System.out.println("Anzahl: " + buchlist.size()); for(KUGBuch kb : buchlist) { System.out.printf("%s %s %d %6.2f \n",kb.getIsbn(),kb.getTitel(),kb.getJahr(),kb.getPreis() ); } System.out.println("--------------------------"); System.out.println("KuG Buecher As Mao"); System.out.println("Anzahl: " + buchmap.size()); for(String isbn : buchmap.keySet()) { KUGBuch kb = buchmap.get(isbn); System.out.printf("%s %s %d %6.2f \n",kb.getIsbn(),kb.getTitel(),kb.getJahr(),kb.getPreis() ); } }
}
App.java
package de.firma;import de.firma.control.KUGBuchCotroller;
import de.firma.model.KUGBuch;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class App {
public static void main( String[] args ) {
KUGBuchCotroller kugBuchCotroller = new KUGBuchCotroller();
kugBuchCotroller.run();
}
}
Ergebnis:

——————
Disclaimer
Alles was ich mitschrieb und verstanden habe ist ohne Gewähr.
Besten Dank an unseren
Trainer: Hans-Joachim Blanke blanke@4point.de

Das waren erst mal unsere Java Schulungen. Ich werde in den nächsten Wochen etwas Recapture machen. Mal schauen ob es für weiter Blogs reicht (wahrscheinlich ja).
Im Januar geht es dann weiter mit den Schulungen. So, stay tuned.
Gruß, Achim Mertens