Dienstag, 30. Mai 2017

Programmieren lernen: Übungsaufgabe

Übung Algorithmen und Datenstrukturen: Falsche Verzweigung

Das folgende Programmstückchen vertauscht den Inhalt der
Variablen x und y, wenn x größer als y ist. Stimmt das?

if ( x > y )
int swap = x;
x = y;
y = x;

Freitag, 19. Mai 2017

Implementierung von Modellen und Software Spezifikationen

Hat man ein Modell aufgestellt will man damit Aussagen über das abgebildete Original machen -> Simulation. Wenn mathematische Gleichungen: Algorithmus zur Lösung finden.

Programmpaket festzulegen, in dem die Implementierung vorgenommen werden soll. In einem nächsten Schritt wird das Modell programmiert. Dabei ist von Beginn an auf eine ausführliche Dokumentation (siehe Abschnitt Dokumentation) und auf eine strukturierte Programmierung zu achten. Andernfalls ist die Fehlersuche und die Einarbeitung neuer Mitarbeiter unmöglich.

Montag, 7. November 2016

GlassFish Server administrieren mit asadmin

GlassFish Verwaltung via Konsole mit asadmin


Asadmin ist ein Konsolenprogramm zur Administration des Java-EE-Servers GlassFish. Domänen können mit asadmin eingerichtet und gestartet werden. Es befindet sich im Verzeichnis …\glassfish\bin, kann aber von jedem Pfad aus gestartet werden, sofern der asadmin-Pfad zuvor in der Umgebungsvariable PATH gesetzt wurde. Dies passiert nicht automatisch bei der NetBeans / GlassFish Installation sondern muss danach händisch erfolgen.


Mit dem Befehl asadmin - - help kann man sich alle verfügbaren Optionen anzeigen lassen:




GlassFish Domäne erzeugen mit asadmin


Wer asadmin ohne Parameter aufruft gelangt zu einer Texteingabe-Konsole.



Mit dem Befehl create-domain kann eine neue Domäne erzeugt werden. Eine Domäne mit dem Namen mydomain könnte also mit dem Aufruf

create-domain mydomain

Erzeugt werden. Dies funktioniert allerdings nur bei laufendem GlassFish, ansonsten schlägt der Befehl fehl (vgl. Bild unten).




Gegebenenfalls also den GlassFish Java-EE-Server starten mit startsrv :



Wenn der Domänenname weggelassen wird wird eine Domäne mit dem Namen domain1 erzeugt, da dies auch den Default-Wert darstellt. Grundsätzlich führt das weglassen von Optionsparametern zur Verwendung von Standardwerten. So werden zum Beispiel Default-Werte für die verschiedenen Ports, die innerhalb einer Domäne verwendet werden, gesetzt. Der Standard-Wert für den adminport einer Domäne ist 4848, für den instanceport (Die eigentliche Webanwendung für den Endanwender) gilt 8080.

Montag, 31. Oktober 2016

Java EE Servlets - GlassFish Server

Servlets sind sogenannte Lowlevel-Komponenten, JSF hingegen sind als Highlevel-Komponenten anzusehen. Lowlevel bezeichnet hier die Programmierung der Grundfunktionalität der jeweiligen Technologie, HighLevel die Programmierung auf einer abstrakter Ebene mit Hilfe eines zu grundeliegenden Frameworks, das den Umgang mit den unterliegenden Lowlevel-Technologien vereinfacht.

Sobald ein Web-Container im Spiel ist, sind Servlets unverzichtbar, da diese die Basis jeder Java-Webanwendung bilden. Die aufwändige und lästige Programmierung von Servlets wurde mit dem Aufkommen von JSF glücklicherweise immer weniger wichtig. Servlets werden benötigt, um mit einem Webbrowser kommunizieren zu können, sprich HTTP-Anfragen eines Browsers beantworten zu können. Damit sind sowohl JSF als auch JSP darauf angewiesen, dass Servlets generiert werden.

Wissen über Servlets und die zugrundeliegenden Technologien hilft, mit dem JSF-Framework besser zurechtzukommen.

Samstag, 31. Oktober 2015

GlassFish Server 4.1.1. nach der Installation

So sieht das Glassfish-Verzeichnis nach der Installation aus:


In \bin befinden sich einige Glassfish Admin-Kommandos. Ein komplettes Verzeichnis aller Administrationskommandos liegt jedoch in einem anderen Unterverzeichnis.

\glassfish ist das tatsächliche Install-Verzeichnis des EE-Servers.

\javadb enthält das frühere Derby, ein relationales DBMS.

\mq enthält die Open Message Queue Quellen (Open MQ). Open MQ ist ein JMS-Provider der Nachrichten senden und empfangen kann. So kann auch in verteilten Systemen eine lose Kopplung erreicht werden.

 \pkg enthält Dateien für Installation und Deinstallation von GlassFish und für das Image Packaging Framework IPS.

Das \glassfish Verzeichnis sieht folgendermaßen aus:





Donnerstag, 11. September 2014

GlassFish - Domänen und Instanzen

Java EE Applikationen werden nicht „direkt“ auf dem GlassFish installiert, sondern vielmehr in einer Domäne. Es können beliebig viele Domänen auf einem Server betrieben werden, jede Domäne enthält auch einen eigenen Administrationsbereich. Im Produktivbetrieb sind mehrere Domänen pro Server unüblich.

Domänen können als Java-Maschinen betrachtet werden, in denen EJB- und Web-Container laufen. Instanzen sind Laufzeitumgebungen für alle darin enthaltenen Komponenten und Module. Von Domänen können Instanzen erzeugt werden, wobei jede Instanz unterschiedliche Konfigurationseinstellungen haben kann. Zur Laufzeit kann eine Konfigurationsinstanz genau einer Domäne zugeordnet werden. Weiter wird zwischen Standalone-Instanzen und Cluster-Instanzen unterschieden. Cluster-Instanzen werden, wie der Name schon sagt, zum einrichten von Clustern einsetzen. Dabei werden alle Cluster-Instanzen einer Anwendung auf einem eigenen Rechner (dann auch als Node bezeichnet) in einer Serverfarm installiert. Danach werden Cluster aus Administrationssicht wie ein einheitliches System betrachtet.

Donnerstag, 11. Oktober 2012

Java - Member als transient markieren


Anwendungsfall: Du möchtest ein Objekt serialisieren


 (aka in einen Byte-Array umwandeln, um es z. B. per Netzwerk zu verschicken). Alle als "transient" markierten Member werden nicht mitserialisiert. Das bedeutet, dass auf der "anderen Seite", wo der Byte-Array wieder zu einem Objekt gemacht wird (Deserialisierung), das entsprechende Member null sein wird, auch wenn es vorher zum Zeitpunkt der Serialisierung einen Wert gehabt haben sollte. Bei der Deserialisierung wird der Konstruktor nicht aufgerufen. In einem solchen Szenario kann sich die Klassenimplementierung eben nicht sicher sein, ob transiente Member nicht null sind. Die gängige Lösung ist, einen initialisierenden getter (siehe oben) zu schreiben und den Zugriff auf transiente Member immer über den getter zu machen. Das vermeidet NullPointerExceptions.

Praxisbeispiel: Java-Enterprise mit Hibernate und getrennten Servern für Webfrontend und Geschäftslogik


Wenn du von deinem Webfrontend Datenbankobjekte an den Geschäftsserver sendest, werden diese serialisiert. Es ist nicht unüblich, dass diese Objekte spezielle Schlüssel enthalten, die transient sind, und auf der anderen Seite neu berechnet werden müssen. Die Klasse weiß aber nicht (soll sie auch nicht), auf welcher Seite der Anwendung sie gerade benutzt wird. Die Implementierung muss diesem Umstand Rechnung tragen. Der Schlüssel wird in seinem Getter generiert, wenn er null sein sollte. Nicht im Konstruktor.

Ganz anderes Beispiel: Du schreibst eine Anwendung auf Basis von Eclipse RCP. Die Fenster (Views) deiner Anwendung werden vom RCP-Framework instanziiert und wieder verworfen. Du hast keinen direkten Einfluss darauf, wann welcher Konstruktor aufgerufen wird und wann Instanzen wieder verworfen werden. Laufzeitabhängige Werte sollte man in diesen Views on demand (lazy) initialisieren und nicht im Konstruktor.

Statische Member


Statische Member: Statische Member sind keine sog. Instanzvariablen. Sie gehören zur Klasse, nicht zu deren Instanzen. Werden ihre Werte geändert, ändern sich die Werte dieses Members in allen (!) Instanzen der Klasse.
Kurz: Wenn irgendein Programmteil zur Laufzeit die Werte von statischen Membern ändert, arbeiten alle Instanzen dieser Klasse mit den neuen Werten, ohne, dass sie die Änderung selbst angestoßen hätten oder davon etwas mitbekommen würden. Wenn das Verhalten deines Codes vom aktuellen Wert dieses Members abhängt, hängt es damit insbesondere davon ab, welchen Wert andere Leute irgendwann vorher mal irgendwie für dieses Member gesetzt haben.

Das ruft meist sehr seltsame Seiteneffekte hervor und lässt sich unheimlich schlecht debuggen. Klassen haben keinen Zustand, Instanzen schon. Speichere Zustände (änderbare Werte) nicht in statischen Membern.

Statische Member sind für Konstanten (static final) gut und evtl. für Singletonkram. Ansonsten sollte man sie meiden. Sie werden meist als Ersatz für Globale Variablen missbraucht oder, um den Zugriff auf wichtige Sachen zu erleichtern. Tu das nicht, ohne genau zu wissen, was du tust! Globale Variablen sind böse, weil jeder Zugriff auf sie hat und dadurch besagte Seiteneffekte hervorrufen kann.

Frameworks wie Log4J oder Mockito nutzen solcherlei Dinge. Deren Enwickler wissen aber 1. was sie tun und der Code ist 2. mittlerweile recht oldschool.