Java Grundlagen – Block3 (Java advanced) – Tag 5 - ModelViewControl, Log4j
hive-121566·@achimmertens·
0.000 HBDJava Grundlagen – Block3 (Java advanced) – Tag 5 - ModelViewControl, Log4j
<p>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:</p>
<h2 id="model-view-control">Model -View - Control</h2>
<p>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).</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-2.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-2.png?w=616" alt="" class="wp-image-3608"/></a></figure>
<p>Properties-Dateien liegen im Ordner "recources". Sie können wie folgt gelesen werden:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-3.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-3.png?w=1024" alt="" class="wp-image-3610"/></a></figure>
<p>Wir erzeugen ein jar Archiv:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-4.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-4.png?w=589" alt="" class="wp-image-3612"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-5.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-5.png?w=967" alt="" class="wp-image-3613"/></a></figure>
<p>Man muss aufpassen, wohin man die Properties schreibt. Intern oder Extern:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-6.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-6.png?w=956" alt="" class="wp-image-3615"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-7.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-7.png?w=1024" alt="" class="wp-image-3617"/></a></figure>
<p>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).</p>
<p>Wir erstellen ein resource Directory:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-8.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-8.png?w=564" alt="" class="wp-image-3618"/></a></figure>
<p>Lesen der Propertie-Datei:</p>
<pre class="wp-block-syntaxhighlighter-code"> // 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));</pre>
<p>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.</p>
<p>--------------------------------------------------------------</p>
<h2 id="logging-mit-log4j">Logging mit Log4j</h2>
<p>In der pom.xml wird log4j hinzugefügt:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-9.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-9.png?w=1024" alt="" class="wp-image-3622"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-10.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-10.png?w=850" alt="" class="wp-image-3624"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-11.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-11.png?w=642" alt="" class="wp-image-3625"/></a></figure>
<p>Konfig: Der Plasspath zeigt normalerweise auf …/src/main</p>
<p>Loglevel:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-12.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-12.png?w=896" alt="" class="wp-image-3627"/></a></figure>
<p>Appender sind die Punkte wo der Output hingehen soll:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-13.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-13.png?w=772" alt="" class="wp-image-3629"/></a></figure>
<p>Logpoint:</p>
<p>Der Logpoint nimmt die Logs auf.</p>
<p>Wenn eine Klasse aus "com.myapp" ein Log vom Typ Error wirft, dann wird sie an den Appender "mail" weiter gereicht:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-14.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-14.png?w=485" alt="" class="wp-image-3630"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-15.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-15.png?w=675" alt="" class="wp-image-3632"/></a></figure>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-16.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-16.png?w=667" alt="" class="wp-image-3633"/></a></figure>
<p>Hier sind die Properties:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-17.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-17.png?w=774" alt="" class="wp-image-3634"/></a></figure>
<p>Und so sieht das Logfile aus:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-18.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-18.png?w=908" alt="" class="wp-image-3636"/></a></figure>
<p>Hier noch mal die Log Einstellungen in unserem Java Package "Kurz und Gut":</p>
<p>KUGBuchCotroller.java</p>
<pre class="wp-block-syntaxhighlighter-code">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());
}
}
}
</pre>
<p>KUGBuch.java</p>
<pre class="wp-block-syntaxhighlighter-code">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 ;
}
}
</pre>
<p>KUGBuchView.java</p>
<pre class="wp-block-syntaxhighlighter-code">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() );
}
}
}
</pre>
<p>App.java</p>
<pre class="wp-block-syntaxhighlighter-code">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();
}
}
</pre>
<p>Ergebnis:</p>
<figure class="wp-block-image size-large"><a href="https://greensniper.files.wordpress.com/2021/12/image-19.png"><img src="https://greensniper.files.wordpress.com/2021/12/image-19.png?w=1024" alt="" class="wp-image-3639"/></a></figure>
<p>——————</p>
<h2 id="disclaimer">Disclaimer</h2>
<p>Alles was ich mitschrieb und verstanden habe ist ohne Gewähr.</p>
<p>Besten Dank an unseren</p>
<h2 id="trainer-hans-joachim-blanke-blanke-4point-de">Trainer: Hans-Joachim Blanke blanke@4point.de</h2>
<figure class="wp-block-image"><a href="https://greensniper.files.wordpress.com/2021/12/grafik-58.png"><img src="https://greensniper.files.wordpress.com/2021/12/grafik-58.png?w=514" alt="" class="wp-image-3601"/></a></figure>
<p>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).</p>
<p>Im Januar geht es dann weiter mit den Schulungen. So, stay tuned.</p>
<p>Gruß, Achim Mertens</p>