« Oktober 2007 | Main | Dezember 2007 »

November 2007 Archives

08.11.07

I'm BACK

Endlich sitze ich in meiner neuen Wohnung und habe sogar Internet am Arbeitsrechner!
Ich bin also wieder da und werde mich jetzt auf die Masterarbeit stürzen.

Noch was ganz anderes:
Eigentlich wollte ich ja auf die Sun Tech Days nach Frankfurt fahren, aber der Vortrag, der mich am Meisten interessierte ("Ruby on Rails in the Enterprise") wurde einfach komentarlos gestrichen. :(
Der Google-Cache beweist, dass ich nicht total bescheuert bin und der Vortrag tatsächlich geplant war. Nun findet ein anderer Vortrag an dessen Stelle mit dem vielsagendem Titel "NetBeans Platform" statt.

Na toll. Tja, dann fahr ich wohl nicht nach Frankfurt. Auf den Tech Days in Tokio wurde der Vortrag übrigens gehalten....

12.11.07

Netbeans und andere Katastrophen

Irgendwie wollte Netbeans heute nicht (oder konnte nicht?) so, wie ich wollte.

Ich habe herausgefunden, dass eine Webapplication schnell geschrieben - oder sollte ich sagen: zusammengeklickt - ist, aber in Verbindung mit EJB klappte das alles irgendwie nicht.

Also langsam: Meine Applikation soll eine Enterprise-Application sein, mit einem EJB-Modul und einem WAR-Modul.
Im EJB steht die PersistenceUnit (PU), also das Model mit den CRUD-Methoden etc.
Im WAR-Modul, der Web Application, stehen die Views, die ich ja mit JSF umsetzen will, kann, sollte...

Aber es ist nicht so einfach mit JSF vom WAR-Modul auf die PU im EJB zuzugreifen. Bzw. ich KANN die Inhalte der Datenbank ausgeben, nur beim Eintragen habe ich gerade erhebliche Schwierigkeiten.
Ein Tutorial oder Beispiele habe ich leider vergebens gesucht!
Was mich dann doch stutzig macht.... Benutzt das überhaupt irgendjemand in dieser Kombination? Sollte ich das dann tun, wenn es anscheinend nicht weit verbreitet ist?
Ein Beispiel ohne EJB gibt es, dort ist alles in einer web-application zusammengehaun.
Ein Beispiel ohne JSF gibt es, dort arbeitet die web-application mit stinknormalen JSPs mit einem EJB, in dem die PU steckt, zusammen.

Tja, was mach ich nur...
Ich schau nochmal in schlaue Bücher. Hoffentlich können die mir weiterhelfen...

...JSF is what i want, it's true,
but how it works? i have no clue....

;)

14.11.07

Datenbankdesign, zweiter Versuch

Um Facts später auch einfach hinzufügen zu können, habe ich die Datenbank jetzt grundlegend geändert. Neben der Tabelle für die Kunden "customers" und der Tabelle für die Ratings "ratings", gibt es jetzt eine Tabelle "facts" in der die Antworten stehen. D.h. Für jeden 'fact' zu einem 'rating' gibt es einen Eintrag mit den Daten zu welchem 'rating' der 'fact' gehört, zu welchem 'fact_type' und wie der Wert/die Antwort ist.
Datenbank
Und da habe ich auch schon das erste Problem... Ist der Wert des facts ('answer') immer eine Zahl, damit man damit rechnen kann? Ich habs jetzt erstmal als VARCHAR eingetragen, aber würde gerne hören, was ihr dazu sagt.

Um welchen 'fact' es sich handelt, wird wie gesagt mit der Referenz zur Tabelle "fact_types" gespeichert. Dort steht dann ein Name (zB "Berechnetes Eigenkapital") sowie die Fragestellung, die beim Eintragen von Fakten erscheinen soll. Außerdem habe ich ein Feld "question_type" vorgesehen, wo dann der Datentyp der Antwort festgelegt ist, falls also doch nicht jeder Wert als Zahl darstellbar ist.

Nun ist halt die Frage, was für Werte haben die Facts, kann man alle als Zahlen abbilden? Beim Eintragen des Facts reicht aber vermutlich nicht immer nur ein Textfeld, sondern es gibt ja auch Ja/Nein-Fragen, die dann über Radiobuttons eingegeben werden!? Gibt es vielleicht sogar Facts, wo man Auswahlmöglichkeiten hat? Wie würde man dies dann realisieren? Brauche ich noch weitere Tabellen für solche Typen um die Antwortmöglichkeiten einzutragen?

Nebenbei habe ich jetzt schonmal eine Kategorisierung vorgesehen, weil Phillip meinte es wäre gut, wenn man die Facts in Gruppen aufteilen kann. Also jeder 'fact_type' gehört zu einer Kategorie, die wiederum eine Unterkategorie von einer anderen Kategorie sein kann. Zur Zeit würde dort nur "hardfacts" und "softfacts" als Kategorien eingetragen sein. Aber das ganze kann man auch erstmal weglassen.

Btw: Kann man in der Tabelle "facts" nicht die id weglassen und als primary key das Tupel (rating_id, fact_type_id) nehmen? Vermutlich ist die Handhabung dann etwas schwieriger, oder? Bzw geht das bei mysql überhaupt? Nebensächlichkeit, aber würde mich mal interessieren.

21.11.07

Ein paar kurze Anmerkungen

JSF ist komisch:
Erstellt man einen commandLink, so wird dieser im HTML-Quelltext zum JavaScript-Ungetüm. Für den Benutzer stellt sich dann der Link als "<momentane_url>#" dar. Schön ist das nicht.

Schickt man ein Formular ab, welches bei Erfolg zB auf die Index-Seite zurückkehrt, so wird im Browser noch die URL vom Formular angezeigt. Außerdem kann man den CSS nicht mit relativen Pfaden angeben, weil eine Seite sich in unterschiedlichen Kontexten befinden kann. o_O

Warum einfach, wenn's doch so schön kompliziert geht, einen String auszugeben:


<h:outputText value="ich bin ein string"/>

Jedenfalls verwenden das einige Beispiele tatsächlich so.

Zum Schluss die Erfolgsmeldung:
Ich kann jetzt Kunden über JSF - BackingBean - EJB SessionBean LocalInterface - EJB SessionBean - EntityBean in die Datenbank eintragen.
Wo welche Komponente wie verwendet wird und warum, schreibe ich (hoffentlich) morgen.

26.11.07

JavaEE Komponenten

Java Platform, Enterprise Edition 5 (Java EE 5) ist die aktuelle Spezifikation von Sun einer Softwarearchitektur für webbasierte Javaanwendungen. Die Spezifikation besteht aus vielen Technologien, API Spezifikationen und Methoden, um eine solche Anwendung zu entwickeln, zu deployen (Verteilung, Installation und Konfiguration von Software auf Zielsystemen) und zu verwalten.

"Java Platform, Enterprise Edition (Java EE) is the industry standard for developing portable, robust, scalable and secure server-side Java applications." -- Sun [http://java.sun.com/javaee/]

Die Java EE Komponenten benötigen eine spezielle Laufzeitumgebung, einen "Application Server". Dieser Server stellt Dienste zur Verfügung wie zum Beispiel Namens- und Verzeichnisdienste und ist in logische Komponenten, sogenannte 'Container', unterteilt.
So gibt es einen 'EJB-Container', der die Laufzeitumgebung für EJBs bereitstellt, sowie einen 'Web-Container' für Servlets und JavaServer Pages (JSP).
[Bild]

Um sich bei der Auswahl der Technologien und Java EE Komponenten an den Empfehlungen von Sun zu orientieren, wurde als Application Server die Referenzimplementierung von Sun auf der Basis von Glassfish [http://glassfish.java.net/] 'Sun Java System Application Server' ausgewählt.

Für die Entwicklung einer webbasierten Ratinganwendung, die auch eine umfangreiche Geschäftslogik enthält, bietet sich die Verwendung von 'Enterprise JavaBeans 3.0' (EJB3) an, da dies der Standardweg für die Implementierung von "back-end buisiness code" ist. [http://java.sun.com/products/ejb/]
Da in EJB3 die Java Persistence API (JPA) enthalten ist, wird diese für die Verwalten und Abbildung der persistenten, relationalen Daten auf Objekte verwendet.

Weiterhin wurde auf die Verwendung von Web Application Frameworks Dritter wie zum Beispiel Struts [http://struts.apache.org/] verzichtet und stattdessen JavaServer Faces 1.2 (JSF) verwendet, um den "front-end user-interface code" zu implementieren.
Die Java EE 5 Technologie JSF ist ein Web Application Framework, basierend auf JSP-Technologie, welches einen komponenten-basierten Aufbau der Benutzerschnittstelle ermöglicht. Bei der Verwendung von JSF kommuniziert der Web-Container mit Hilfe von sogenannten 'BackingBeans' (auch 'ManagedBeans' genannt) über ein Interface mit einem 'Facade Session Bean'.
[Bild]

"Offering new and updated features such as Enterprise JavaBeans (EJB) Technology 3.0, JavaServer Faces (JSF) Technology, and the latest web services APIs, Java EE 5 makes coding simpler and more straightforward, but maintains the power that has established Java EE as the premier platform for web services and enterprise application development." -- Sun [http://java.sun.com/javaee/technologies/javaee5.jsp]

29.11.07

Query != SQL

Man nehme eine Datenbanktabelle...

Customers

... und eine Datenbankanfrage wie zB ...

Query q = em.createQuery("select object(o) from Customers as o");

... und bekommt eine Fehlermeldung...

Exception [TOPLINK-8034] (Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))): oracle.toplink.essentials.exceptions.EJBQLException
Exception Description: Error compiling the query [select count(o) from Customers as o]. Unknown abstract schema type [Customers].

... und wundert sich ...
... bis man feststellt, dass das SQL, was man da sieht, kein SQL ist und nicht der Tabellenname, sondern der Entityname - in diesem Fall "customer" - benutzt werden muss.
Wenn das nicht mal intuitiv ist...

Validator und Converter

Nachdem ich jetzt Customer eintragen kann, habe ich mich mal aufgemacht, die eingetragen Werte zu validieren und converter für DropDownMenüs (h:selectOneMenu) Objekte zu schreiben. Die liegen nämlich als Stringrepräsentation vor, wenn das Formular abgeschickt wird und müssen durch die ID dann in den richtigen Typen konvertiert werden.
Frage: Dies bedeutet doch, dass nicht einfach die ID im dafür vorgesehenen Fremdschlüssel eingetragen wird, sondern erst nochmal das Objekt mit der angegebenen ID aus der Datenbank geholt wird, um dann... uhm.. _nichts_ damit zu machen - na gut, außer festzustellen, dass es tatsächlich existiert, aber ist das nicht eigentlich ne Datenbankaufgabe? Irgendwie ist das nicht gerade gut, oder sehe/mache ich hier etwas falsch?

Außerdem: Leere Textfelder werden bei JSF nicht validiert! Mit der Begründung, dass es ja keinen Inhalt gibt, den man validieren kann. D.h. wenn man einen Validator nimmt und prüft, ob der String zwischen 2 und 25 Zeichen hat, dann gibt es keinen Validierungsfehler, wenn man 0 Zeichen eingibt...
Ich dachte schon, ich müsste nun explizit einen Validator schreiben, um zu prüfen ob der String überhaupt Zeichen enthält, aber zum Glück gibt es hier das Attribut "required" für Formularfelder.

Verwandtes Thema: Ist eine Angabe freiwillig und der Benutzer schickt ein leeres Textfeld ab, wird nicht null, sondern ein leerer String "" in die Datenbank gespeichert. Um dies zu beheben, musste ich tatsächlich einen StringConverter schreiben.
Dies ist aber - wie auch eigene Validator schreiben - ziemlich simpel! Hier konnte JSF zum ersten Mal von mir richtig Pluspunkte sammeln. ;)

About November 2007

This page contains all entries posted to Gerald's Blog in November 2007. They are listed from oldest to newest.

Oktober 2007 is the previous archive.

Dezember 2007 is the next archive.

Many more can be found on the main index page or by looking through the archives.

Powered by
Movable Type 3.31