Betr. JPA

Bisher hat der Umbau der vorhanden Klassen hinsichtlich der Nutzung von JPA promblemloser funktioniert als gedacht. Bisher versuche ich halt nur, das User Objekt aus der Tabelle User auszulesen.
Letztendlich muss ich aber mein bisheriges Konzept soweit umstellen, dass ich die Validierung von Eingaben aus der User Klasse in eine sperate Application Klasse auslagere.
Allen anschein nach klappt das Laden der User Klasse mit Hilfe eines EntityManagers fehlerlos, allerdings scheint es da an einigen Stellen noch zu Problemen zu kommen.
Nach der Überarbeitung sieht die User Klasse nun wie folgt aus:

Die Methoden isLogin and isWithName werden dann wahrscheinlich auch ausgelagert werden müssen. Das Attribut error wird wohl einer Fehlerbehandlungsklasse weichen und in Folge dessen als Sammlung von Exceptions implimentiert werden.
Als Primary Key habe ich mich jetzt für das Attribut Name entschieden, da es scheinbar nur möglich ist, die find Methode des EntityManagers anhand eines Primary keys zu nutzen und ich aller Vorraussicht nach eher nach Namen als nach IDs suchen werde.
Das Laden des Objektes passiert nun in einer neuen Klasse Application:

Leider wird mir bei der Methode showID() eine NullPointerException geworfen, die ich noch nicht ganz nachvollziehen kann :-/. Letztendlich wird mir JPA aber denke ich eine Menge an Arbeit abnehmen, sobald es erstmal stabil läuft.
Bei Sun habe ich allerdings noch ein Beispiel gefunden, was wie perfekt für mich zu sein scheint, weil es schon ziemlich viel von dem behandelt, was ich eigentlich machen möchte [1]

Was bisher so geschieht…

Moin…
Ich wollte mal wieder ein wenig Feedback geben, woran ich bisher so sitze…
Letztendlich bin ich endlich mit einer schönen Datenbankklasse ausgestattet, die mir auch die Dinge bietet, auf die ich angewiesen sein werde – ob da jetzt noch etwas dazu kommt, wird sich zeigen, aber erstmal reicht mir das, was bisher vorhanden ist. Zudem bin ich auf ein paar Besonderheiten von JSP/Java und MySQL gestossen, die in meinen Augen recht unlogisch sind, aber nunja, vielleicht gibt sich das noch.
Mein bisheriger Plan ist es, jetzt erstmal die Grundfunktionen des Servers mit einer einfachen HTML Oberfläche zu erstellen, um dann den Client mit Hilfe von YUI dynamischer zu gestallten.
Aber jetzt erstmall ein Überblick über die Klassen:

Die statische Config Klasse ist erst später hinzugekommen, sodass ich die Attribute aus der Datenbankklasse, welche den Zugriff betreffen wohl dann entferne und die Benutzerdaten zentral in der Config Klasse speichere.
Ich habe jetzt auch schon erste Tests mit einer Session hinter mir, aber das Klassendesign ist noch sehr gewöhnungsbedürftig ^^.

Die Klasse TOOLS soll einfach zur Sammlung verschiedener Funktionen dienen.
Die md5 Methode dient einfach dazu, einen gegeben String als md5 Summe zurückzugeben. Dies brauche ich u.a. für die Passwörter.
Sobald ich die erste HTML Oberfläche habe (die dann einfaches Anmelden, Erstellen und Auflisten von Einträgen beherrschen wird, werd ich erste Funktionstests machen.
Das Schöne, was ich an Eclipse gefunden habe ist, dass man per Vorgabe einfache TextKlassen für Klassen erstellen kann. Dort werden alle Methoden einmal aufgerufen.
Ob das für ein Unit Testing ausreicht muss ich dann noch mal sehen.

Achja… Java und MySQL: Die erhaltenen Einträge aus der Datenbank speichert Java in einem sog. Resultset. Mit der methode next() kann man die verschiedenen Einträge durchblättern. Das komische ist nur, dass wenn – nachweislich – nur ein Eintrag vorhanden ist, muss man dennoch einmal die next() methode aufrufen.
Also muss man von 0. Eintrag auf den 1. blättern? O_o. Meiner Meinung nach irgendwie unnlogisch. Dementsprechend hat mich das auch ein wenig aufgehalten.
Betroffen war u.a. diese Methode aus der Klasse User:

public void load(){
    this.DB.Query("SELECT `ID`, `password` " + 
                   "FROM `users` WHERE `name` = '"+this.name+"' ");
    try {
        ResultSet res = this.DB.getLastResult();
        System.out.println(res.toString());
        res.next();
        this.ID = res.getInt("ID");
        this.password = res.getString("password");
    }catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Ob ich jetzt das “erste Blättern” in der getLastResult() unterbringe habe ich mir noch nicht überlegt.
Wünsche allen frohes Schaffen und ein schönes Rest-Wochenende!

Update & Design Entscheidungen

SOOOO die ersten Erfahrungen mit Java Servlets und Beans sind gemacht.
Letztendlich lässt sich eines sagen: Die Fehlermeldungen sind nicht wirklich sooo hilfreich.
Auf den Weg zu einer ersten funktionierenden Implimentierung einer User Klasse habe ich folgende Dinge (erstmal vorläufig) entschieden um mal ein lauffähiges Grundsystem zu haben:

  1. Alle meine Klassen werden im Package de.hausswolff.Diplom ihren Platz finden. Ob ich die Hirachie dann noch aufbreche muss ich dann noch sehen.
  2. Es gibt eine Datanbankklasse, die mir den Zugriff auf die Datenbank kapselt. Bisher ist das einfach eine Sammlung aller nötigen MySQL Funktionen (wie Update/Queries, Rückgabe der erhaltenen Einträge usw.). Diese Klasse initialisiert beim ersten Aufruf auch alle benötigten Tables (d.h. Letztendlich muss beim ersten Aufruf nur eine beschreibbare Datenbank zur Verfügung stehen)
  3. Es gibt eine (statische) Config Klasse, die hauptsächlich aus Attributen besteht und u.a. die Datenbank-Einstellungen, sowei ein Flag für den LDAP Zugriff enthält. Hier soll dann auch gespeichert werden, ob die Datenbank schon initialisert ist oder nicht – wie das ablaufen soll, muss ich dann noch sehen.
    nachfolgende Festlegungen haben nur im Kontext einer flachen Benutzertabelle, welche als vorläufiger Ersatz einer LDAP Authentifizierung dient.
  4. Ein Username ist eindeutig. Es gibt zwar für jeden Benutzer eine eindeutige ID, allerdings soll kein User einen schon vorhandenen Usernamen benutzen dürfen (dies wird durch die setName methode, welche bei einer Benutzererstellung aufgerufen wird überprüft und ggf. mit einer Fehlermeldung quittiert)
  5. Das Password wird in der Datenbank als md5 Hash abgelegt. Eine Überprüfung auf Richtigkeit eines Passwortes erfolg nur über die md5 hashes.

Konzeptionelles

Da ich egientlich schon Mitte der Woche nen Zeitplan fertig haben wollte, fühle ich mich ein wenig unwohl. Letztendlich weiß ich ja schon ungefähr welche einzelnen Bereiche es abzuarbeiten gilt, aber man hat ja dann irgendwie auch Anspruch, dass ganze ein wenig mit Struktur und Übersicht zu verbinden.
Bisher sammelte sich alles in 2 Mind-Maps:
1. Funktionalität:

2. Systemübersicht:


Im Moment bin ich dabei einen Programmablauf zu erstellen, damit ich die einzelnen Abläufe mal zusammen bekomme.
Ansonsten habe ich in JSP die ersten Datenbank-Funktionen fertig und schon die ersten Beans in Java geschrieben und eingesetzt.
P.S.: Mit ? versehende Punkte sind optional/bisher nicht als voll implementiert geplant.
P.P.S.: Extra für Willem: Man kann auf die Bilder klicken und sie werden größer. Und eine Vorschau dient zur Vorschau und nicht zum ansehen der Bilder ^^

es geht voran

Nach der gestrigen Ernüchterung habe ich es dann heute einfach noch mal mit ner aktuellen Eclipse Version versucht. Auf der Eclipse Homepage gibt es ja den “Europa Build”. Und siehe da: es ging plötzlich. War zwar erst immer noch etwas absturzfreudig das ganze, aber nachdem ich Java wieder auf Version 6 umgestellt habe, konnte ich sogar damit arbeiten.
Das hat zu folge, dass ich mittlerweile in wenig weiter mit JSP gekommen bin (allerdings immer noch auf bekanntem Gebiet 😀 – siehe dazu auch die Quelltexte).
Zudem habe ich dann heute mal mein erstes Script als JSP/YUI Kombination geschrieben. Und das schönste: es geht sogar.
Nachfolgend also eine Tabelle, die sehr simpel durch 2 Schleifen erstellt wurde.
Zudem habe ich Schleifen benutzt, um das JavaScript fürs YUI zu erstellen.
(für die Sortierfunktion muss man alle Table Headers als Array angeben – das war mir ein wenig zu mühselig um es per Hand zu machen 🙂 )
Tabelle ohne YUI:

Tabelle mit YUI:

(durch Klick auf den Tabellenkopf kann man die einzelnen Spalten jeweils sortieren)
allererstes Panel:

Letzendlich gibt es bei YUI immer zwei (okay eigentlich drei) Möglichkeiten, um den Inhalt zu erstellen.

  1. durch Veränderung von vorhandenem HTML Code (sog. Markup)
  2. durch reine JavaScript Befehle
  3. durch JavaScript und eine externe Quelle (sei es nun ein XML Feed oder JSON)

Das eröffnet einem einen relativ großen Bereich an Möglichkeiten.
Zudem fand ich heute eine weitere, interessant Seiten, auf der die verschiedenen Möglichkeiten des YUI Frameworks demonstriert werden. [1][2]
Der Code für die obigen Beispiele ist folgender:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello Client <%=request.getRemoteHost() %>!</title>
<style type="text/css">
    .grey{
        background: grey;
    }
    .black{
        background: black;
        color: white;
    }
    td, th{
        font-size: xx-small;
    }
</style>
<link rel="stylesheet" type="text/css" href="yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="yui/datatable/assets/skins/sam/datatable.css" />

<script type="text/javascript" src="yui/utilities/utilities.js"></script>
<script type="text/javascript" src="yui/datasource/datasource-beta.js"></script>
<script type="text/javascript" src="yui/datatable/datatable-beta.js"></script>
<script type="text/javascript" src="yui/yahoo-dom-event/yahoo-dom-event.js"></script> 
<script type="text/javascript" src="yui/element/element-beta-min.js"></script> 

</head>
<body>
<a href="menu.jsp">Men&uuml;</a>
<h2>THIS is a JSP/YUI TEST TABLE!</h2>
<%
    int _cols = 20;
    int _rows = 30;
%>

<div id="myContainer">
<table  id="accounts">
<%
    out.println("t<thead><tr>");
    for(int j=0; j<_cols; j++){
        out.println("tt<th class="black">"+j+"</th>");
    }
    out.println("t</tr></thead>");
    String css_class = "";
    out.println("t<tbody>");
    for(int i=0; i<_rows;i++){
        out.println("t<tr>");
        if(i % 2 == 0)
            css_class = "white";
        else
            css_class = "grey";
        for(int j=0; j<_cols; j++){
            out.println("tt<td class=""+css_class+"">"+i+","+j+"</td>");
        }
        out.println("t</tr>");
    }
    out.println("t</tbody>");
%>
</table>
</div>

<script type="text/javascript">

YAHOO.util.Event.addListener(window, "load", function() {
    YAHOO.example.EnhanceFromMarkup = new function() {
        var myColumnDefs = [
            <%
            for(int j=0; j<_cols; j++){
                out.print("t{key:""+j+"",label:"No "+j+"", sortable:true}");
                if(j != (_cols-1))
                    out.println(",");
                else
                    out.println("");
            }
            %>
        ];

        this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("accounts"));
        this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
        this.myDataSource.responseSchema = {
            fields: [

                    <%
                    for(int j=0; j<_cols; j++){
                        out.print("t{key:""+j+""}");
                        if(j != (_cols-1))
                            out.println(",");
                        else
                            out.println("");
                    }
                    %>
            ]
        };

        this.myDataTable = new YAHOO.widget.DataTable("myContainer", myColumnDefs, this.myDataSource,
                {caption:"Example: This is just the Table Title ;-)",
                sortedBy:{key:"0",dir:"desc"}});
        };

        this.parseNumberFromCurrency = function(sString) {
            // Remove dollar sign and make it a float
            return parseFloat(sString.substring(1));
        };
});

</script>

</body>
</html>

index.jsp (für die Tabelle)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Panel Demo</title>
<link rel="stylesheet" type="text/css" href="yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="yui/container/assets/skins/sam/container.css" />
<script type="text/javascript" src="yui/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="yui/container/container.js"></script>
</head>
<body>
Simple Panel

<div id="myPanel">
    <div>my little Demo Panel</div>
    <div>
    <ul>
    <li><a href="index.jsp">item one</a></li>
    <li><a href="index.jsp">item two</a></li>
    <li><a href="index.jsp">item tree</a></li>
    </ul>
    </div>
    <div>&copy; by me :-)</div>
</div>

<script type="text/javascript">
myPanel = new YAHOO.widget.Panel("myPanel", {
    width:"240px", 
    height:"480px", 
    fixedcenter: true, 
    constraintoviewport: true, 
    underlay:"shadow", 
    close:false, 
    visible:true, 
    draggable:true } );
myPanel.render();
myPanel.show();
</script>

</body>
</html>

menu.jsp (für das Panel)

Hierbei ist zu beachten, dass jeweils zwischen der JSP Code zu finden ist. Von der Syntax ist JSP sehr an Java angelehnt.
Ich werde die restlichen Tage der Woche benutzen, um das ganze auch auf meinem Laptop zum Laufen zu kriegen und dann schon mal versuchen, eine Verbindung zu einer MySQL Datenbank herzustellen.

Day of Bugs

Da ein recht wichtiger Teil, meiner Arbeit unter JSP in einem geeigneten Container ablaufen soll, dachte ich mir so, dass es im Open-Source Umfeld neben dem Tomcat Server auch eine geeignete IDE geben muss.

Da ich mit der Programmierung in PHP, dem Schreiben von HTML und natürlich bei dem Umgang mit Java mit Eclipse gute Erfahrungen gemacht habe, machte ich mich auf, ein gutes Plug-In zu finden.
Weil: Von der Tatsache eine funktionierende JSP Seite im ROOT Folder lauffähig zu haben, zu der Idee, eine wirkliche (wie heißt es noch so schön: deploybare) Anwendung zu erhalten, ist es noch ein weiter Weg. Angeblich (und ich schreibe das hier jetzt wirklich ganz bewußt) soll das vorhandene Plug-In (welches im WTP [1] Projekt enthalten ist) diese ganze Arbeit erleichtern.
Wären da nicht ein paar Kleinigkeiten, die mich heute über den gesamten Tag hinweg sehr viele Nerven gekostet haben:

  1. Eclipse + WTP laufen unter Java 6 – nett gesagt – instabil
  2. Tomcat 5.5 wird unter WTP nur durch sehr tiefe Eingriffe in den Eclipse Innereien unterstützt
  3. Starten/Beenden von Tomcat geht unter Linux so gar nicht (ich habe es mittlerweile nun auch mit verschiedener Rechtervergabe aufgegeben)

Immerhin weiß ich nun, dass ich bei meinem ganzen Frust und Problemen nicht alleine bin und es irgendwann zwischen jetzt und in drei Monaten einen Release Candidate von Eclipse geben wird, der das dann alles besser können soll.

Letztendlich bin ich jetzt dazu über gegangen, mir die notwendige Struktur in Ordner aufzubauen und das ganze entweder manuell zu kopieren oder per Export als WAR Datei [2] zu importieren.
Soviel zum Thema Tools, aber es geht und ist für mich zumindest vollständig nachvollziehbar.

preparing the tools

Damit ich dann auch recht bald loslegen kann, wenn das Konzept fertig ist, habe ich so allmählich meine Entwicklungsumgebung zusammengestellt:

  • Also Basis dient mir hierbei Ubuntu Linux 7.04, weil ich
    1. eh lieber mehr Linux/Unix lastig arbeite
    2. Ubuntu als das bessere Debian empfinde
  • Java Version 6 läuft (braucht man für die meisten nachfolgende Programme)
  • Tomcat läuft (der ist ein quasi Standard wenn es um die Entwicklung und den Betrieb von JSP Anwendungen geht)
  • Eclipse mit passenden Plugins ist ebenso installiert und lauffähig.

Die ersten Test mit dem Yahoo Framework waren auch schon erfolgreich und meine erstes Hello World Java Server Page steht auch schon.
Was ich heute eher durch Zufall fand sind die Yahoo Cheat Sheets. Ich könnte mir sowas gut also Poster vorstellen :-). Ich denke das wird mir noch mal sehr nützlich sein, wenn mir ein Befehl mal absolut nicht mehr einfallen will. Ich werde die nächsten Tage jetzt mal die Grundlegen Funktionen sammeln, meine Objekte bilden und dann schaun, dass ich schon mal erste Tests mit der Schnittstelle hinbekomme. Was ich bisher von JSP so gesehen habe, ist es gut on-the-fly zu lernen, wobei man die Besonderheiten – die sicherlich noch auftauchen werden – natürlich nicht unterschätzt werden sollten.

P.S.: Gruß an Tim:
[1] (Video)
Im letzten Drittel müsste es um das Zeichnen im Canvas gehen.
Siehe dazu auch: [2] (das schreiben sie bei Mozilla dazu)
Ich habs zwar bisher noch nie brauchen können, fand es aber nachhaltig höchst interessant…… Hm okay…. Grüße dann die anderen auch mal 🙂