Seiten

Freitag, 25. Februar 2011

GUI Fortsetzung JAVA

Ich bin mir ziemlich sicher bereits erwähnt zu haben, dass sich die Entwicklung von Grafischen Benutzeroberflächen in Java sogar mit dem dafür vorgesehenen Equipment ( Visual Editor für eclipse) ein zeimlich schmerzhafter Prozess ist.
Gestern habe ich vier Stunden damit zugebracht mich etwas darin einzuarbeiten. Selbstverständlich ist alles Übungssache, aber der Aufbau von Frames und den darin enthaltenen Elementen könnte meiner Meinung nach kaum unintuitiver gestaltet worden sein. Selbstverständlich muss ein Frame wie ihn heute alle Windowsbenutzer kennen ( gibt es eigentlich Betriebssysteme die auf die Frame - GUI verzichten ) einige Anforderungen erfüllen:
Der Frame kann vergrößert oder verkleinert werden. Dafür muss aber vorher festgelegt sein, wie sich die einzelnen Elemente verhalten, wenn die Größe sich ändert. Dafür kann man die Elemente in Raster, sogenannte GridBacks unterteilen. Je nach Vorgabe bleiben dann Rasterelemente beim Scrollen der Größe gleich groß (  Bei Buttons , die mit Text gefüllt sind besipielsweise unverzichtbar, da man sonst den Text nichtmehr lesen kann ) oder verändern die Elemente Ihre Größe ( z.B.: Textfelder , die dann scrollbars bekommen, damit man den Text trotzdem noch lesen kann, notfalls auch Wort für Wort ).
Schwierig ist es nun dies zu berücksichtigen. Komplizierter wird das ganze nun noch, wenn man mehrere Elementträger, sogenannte JPanes in einem Frame hat. Kein Objekt kann ohne darunterliegendes JPane dargestellt, bzw. eingebaut werden und meistens ist es nötwendig mindestens zwei bis drei JPanes zu verwenden.
Für jedes dieser JPanes muss auf dem darüberliegenden Pane eine Sortierstruktur ausgewählt werden, z.B.: ausrichtung nach X-  oder Y- Koordinate. Natürlich ist es auch möglich die Rastermethode zu verwenden um die Elemente wenigstens grob in Position zu bringen.

Datenbankanbindung mit PHP Teil 2

Ok damit mache ich heute einfachmal da weiter, wo ich gestern aufgehört habe und erläutere noch mehr methoden aus dem Php standart, mit denen man viele Tolle Sachen machen kann.
Zum Beispiel die Eingangserfassung von Paketen.

Wie viele wissen befindet sich der Php-Code auf dem server und wird vor Absenden der HTML- Webseite ausgeführt und dann aus dem Code entfernt. Problematisch daran ist, dass einige Dinge nicht vor ort ( also auf dem Rechner des Benutzers) ausgeführt werden können. Da dies nicht möglich ist, muss die Website, die dem Benutzer angezeigt wird irgendwie mit dem Server kommunizieren. Dies funktionierte früher mittels der Datenübertragung aus der URL, welche einfach als Paket gekapselt durch das internet rauschte und im Anschluß vom Server und dem entsprechenden Php Code ausgewertet werden konnte. Allerdings ist diese Methode nicht besonders Sicher, da die URL auch von Dritten ausgelesen werden kann.

Die sicherere und mittlerweile fast überall verwendete variante ist eine Übergabe der Daten in einem Feld ( einem Array ) dieses erreicht den Server auf einem anderen Weg und kann nicht über den Browser ausgelesen werden.
Die Attribute zur Fortsetzung der Bearbeitung von Nutzeranfragen sind dem Programm dann zugänglich, und können ausgelesen werden. Die Bezeichnung diese Feldes ist $_POST.
Es entspricht den PHP_standarts und ist ein assoziatives Array. Die Schlüssel sind dabei die Namen ( name=""...) der Formularfelder.
Die Übergabe findet selbstverständlich erst nach absenden des Formulares ab. Hier beitet sich nun die Möglichkeit eines Selbstaufrufes oder des aufrufens einer fortführenden Seite.

Mittwoch, 23. Februar 2011

Datenbankanbindung mit PHP

Da mir bereits erfolgreich eine Verbindung aus php und MySQL geglückt ist ( das Monatsauswertungstool ), sollte nun, um eingehende Pakete zu prüfen eine Website geschrieben werden, die die Sendungsdaten aufnehmen soll. Diese aufgenommenen Daten werden dann mit in der Datenbank gespeicherten Daten abgegelichen und ein weiterer Eintrag in einer neuen Table erzeugt.

Mithlife von php und Javascript wurde zuerst die website geschrieben. Hierbei handelt es sich um ein einfaches Formularfeld, das immer aktiv ist. Dies geschieht mit der Methode Focus() von JavaScript. Allerdings reagieren die Browser unterschiedlich darauf, und es spielt scheinbar auch eine Rolle, welchen Server man verwendet, damit der Cursor an der gewünschten Stelle blinkt.

Ist das geschafft, kann man sich dem Eingabegerät zuwenden. Die Sendungsdaten werden als Barcode von einem Laserscanner erfasst und dank des fokussierten Formularfeldes sofort an die richtiege Stelle geschrieben. Die Ausführung des Php - Codes erfolgt sofort nach dem Scanvorgang. Die Nummer wird mit der Zeile in der Datenbank vergleichen - ist sie vorhanden wird ein entsprechender Eintrag zusammengestellt und in die Datenbank zurückgeschrieben.

Nun den verwendeten Methoden:

 mysql_connect(String source, String connection, String password):
Stellt eine Verbindung mit der Datenbak des Servers her. 
  • "source" ist die Angabe der Quelle, entweder die DHCP - Bezeichnung oder die IP-Nummer
  • "connection" ist die Bezeichnung der Verbindung mit der MySQL Datenbank
  • "password" ist das MySQL Passwort der Verbindung
Php 5 ist damit ohne weitere Hilfsmittel in der Lage auf die Datenbank zu verbinden und Daten zu lesen oder zu schreiben.

Weitere Details gibts morgen.

Donnerstag, 10. Februar 2011

JAVA und XML 10-2-2011

Der heutige Tag bestand fast ausschließlich aus der Suche nach Programmierfehlern, was eigentlich beweisen müsste, dass ich mich dem echten Programmierbusiness doch weiter genähert habe. Die "letzten Schliffe" die die Anwendung noch gebraucht hat waren doch mal wieder ein paar schliffe mehr als erwartet.

Im Moment läuft das Ganze unter eclipse und versucht die bereits erwähnten xml Dateien in die SQL-Datenbank zu schreiben und die Geschriebenen Daten zu weiteren Vergleichen heranzuziehen. Die Fertigstellung einer .exe wird folgen, sobald der jetzige Vorgang und das Bugfixing abgeschlossen sind. Momentan sind es um die 18000 Einträge und ich habe schon befürchtet, dass der Rechner damit ausgelastet ist, weil keine weiteren Einträge mehr hinzukamen. Aber die Logfileausgabe zeigt, dass die Anwendung erfolgreich weiter läuft. Allerdings wird das ganze meinen Rechner wohl das ganze Wochenende in Beschlag nehmen wird. Rechnerisch wird es wohl Samstagabend werden.

Es gibt einen Haufen Dinge, die ich, sofern ich eine solche Anwendung erneut schreiben sollte ändern würde, wie etwa einige Vergleiche und Zugriffe, die die Rechenleistung optimieren würden. Vor allem die Datenbankzugriffe sollten sich am absoluten Minimum bewegen, und ich bin sicher, dass der ein oder andere Zugriff der im Moment noch im Code steht verhindert werden kann.

Notwendig wird das aber erst, wenn die Dateien an Größe weiter gewinnen und die verfügbare Rechenleistung konstant bleibt.

Als nächstes steht die Barcodescanner-Anwendung auf der Agenda. Dieses Mal müssen evtl. sogar 3 oder mehr verschiedene Sprachen zum Einsatz kommen (SQL mitgerechnet^^)

Mittwoch, 9. Februar 2011

JAVA und XML 9-2-2011

So heute war ein ziemlich frustrierenden javaToXML Entwicklungstag. Die eigentlichen Lösungen scheienen alle bereits vorhanden zu sein, aber es war unglaublich zäh und viele Fehler haben mich ungemein gebremst.

Erst wollte ich damit beginnen den Code, der das XML-Dokument Stückchenweise ( Nodeweise ) ausliesst ein bischen besser zu verstehen. Danach habe ich einen entsprechenden Setter in der Schleife für jeder einzelne Attribut vergeben. Beim Kopieren habe ich einen kleinen Fehler gemacht und diesen Fehler habe ich dann eine halbe Stunde gesucht.
Als dieses Problem aus der welt war ( ein Bezeichner geb den Falschen wert weiter -> immer fleißig Ausgaben produzieren, damit man sich nicht ewig fragen muss, was denn nun falsch läuft ), musste ich feststellen, dass die von mir kopierte Datenbankanbindung nicht funktioniert hat. Weitere 45 Minuten gingen ins land, bevor ich gemerkt habe, dass die Datenbankanbindung eine Bibliothek benötigt, die nicht in der JRE enthalten ist. Mir wurde das zwar gesagt, aber bis ich es bemerkte dauerte es. Als ich wiederum kapiert hatte, wo der Fehler lag und die Datenbank angebunden hatte musste ich feststellen, dass die vorgefundenen Mehtoden so gar nicht das taten, was ich eigentlich von ihnen wollte. Also begann ich alles umzuschreiben bis ich nach einer ganzen weile bemerkte, das das garnicht nötig war. Tonnenweise Änderungen rückgängig gemacht und weiter im Text. Als nächstes probiert automatisiert Werte aus den nodes in die Datenbank zu schreiben. Festgestellt, das es Probleme bei den Attributsbezeichnugen gibt "geschlossene Klammern". Diese Attributsbezeichnug manuell geändert und festgestellt, dass es Probleme mit dem Automatisch generierten Datum gibt. Ewig nach einer Lösung gesucht und diese dann schließlich gefunden -> Attribut mit der "?" funktion eingefügt. Danach merkte ich, das die SQL Überträger ein Riesen-Problem mit den in den Attributsbezeichnugen massiv vorhandenen Leerzeichen gibt. Es wird wohl darauf hinauslaufen, dass das Leerzeichen mit irgendwas anderem ersetzt werden muss. Das kommt dann morgen....

Dienstag, 8. Februar 2011

JAVA und XML 8-2-2011

Weiter bei der Entwicklung des XML Einlesewerkzeuges für die Datenbank. Abhilfe schaffte jetzt schnell und kurzfristig dieser code:

  try {
  File file = new File("c:\\MyXMLFile.xml");
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  Document doc = db.parse(file);
  doc.getDocumentElement().normalize();
  System.out.println("Root element " + doc.getDocumentElement().getNodeName());
  NodeList nodeLst = doc.getElementsByTagName("employee");
  System.out.println("Information of all employees");

  for (int s = 0; s < nodeLst.getLength(); s++) {

    Node fstNode = nodeLst.item(s);
    
    if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
  
           Element fstElmnt = (ElementfstNode;
      NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("firstname");
      Element fstNmElmnt = (ElementfstNmElmntLst.item(0);
      NodeList fstNm = fstNmElmnt.getChildNodes();
      System.out.println("First Name : "  ((NodefstNm.item(0)).getNodeValue());
      NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("lastname");
      Element lstNmElmnt = (ElementlstNmElmntLst.item(0);
      NodeList lstNm = lstNmElmnt.getChildNodes();
      System.out.println("Last Name : " ((NodelstNm.item(0)).getNodeValue());
    }

  }
  catch (Exception e) {
    e.printStackTrace();
  }


von 

http://www.java-tips.org/java-se-tips/javax.xml.parsers/how-to-read-xml-file-in-java.html

Benötigt werden folgende Packages:

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


Im oberen Teil des codes wird sich in der Baumstruktur des  XML  Dokumentes nach der Konvertierung in ein "Document" an die einzelnen Einträge "hinabgehangelt" und diese dan Ausgegeben.

Für die von mir angestrebte Lösung müssen diese Daten nun mit der Datenbank abgeglichen werden. Dies geschieht mithilfe der SQLObject - Klasse die bereits geschrieben wurde. Vermutlich werde ich aber morgen einige kleinere Änderungen für den Abgleich daran durchführen. 

Dann gab es heute noch Noten in ITS. Bin zufrieden, hätte aber malwieder besser sein können. 

Montag, 7. Februar 2011

Java und XML 7-2-2011

Heute begann die Arbeit am nächsten Tool, mit dessen Hilfe eine gigantische XML-Datei ausgewertet werden soll. Es handelt sich dabei um eine sehr einfache Struktur. Es gibt etwa 20 k Elemente, mit 6 Unterattributen. Diese Werte sollen ausgelesen und in einer Datenbank gespeichert werden, wenn sich etwas seit dem zuletzt vorgenommenen Eintrag geändert hat. Das Problem dabei ist in erster Linie nicht nur die Größe der Datei, sondern auch das Parsen der XML File und seiner Struktur. Ich habe einen ganzen Haufen von Paketen und Klassen gefunden, die das übernehmen können sollten. Irgendwie habe ich heute aber noch keinen Ansatz gefunden, wie ich das einlesen machen soll. Anscheinend ist die Java DOM - Package für diese Tätigkeit ausgelegt. Im Endeffekt kann es sich dabei doch auch nur um einen Parser handeln, der das Dokument durchsucht und die einzelnen Tags ausgibt.
Wenn ich es recht bedenke werde ich ein XML Objekt erzeugen, dass ein Objekt in der XML Datei heraussucht und die Attribute im XML - Objekt speichert. Dieses wird dann mit der Datenbank verglichen. Im Anschluss wird der nächste Eintrag gesucht und dieselbe Prozedur wiederholt sich, bis das gesamte Dokument abgearbeitet ist.
Meine Fortschritte morgen sind hoffentlich etwas besser, heute hatte ich aufgrund der Fülle an Lösungsvorschlägen offensichtlich etwas die Orientierung verloren. Morgen tritt möglicherweise Klarheit auf.