Java EE application server und Entwicklung in Eclipse

Tumbleweed

Captain
Registriert
März 2008
Beiträge
3.600
Ich versuche mich gerade in Servlets und JSPs einzuarbeiten.

Nun bin ich an dem Punkt angekommen, dass ich die Grundlagen verinnerlicht habe und gerne mal ein bisschen rumprobieren möchte.
Ich habe mich auch schon etwas umgesehen zum Thema application server usw. und bin auf Geronimo, Glassfish, JBoss und ein paar weitere gestoßen. Anscheinend ist keiner davon eine schlechte Wahl, also habe ich beschlossen erst mal mit Geronimo zu arbeiten. Ein paar Meinungen von Leuten die professionell damit zu tun haben würden mich aber schon interessieren, auch wenn ich befürchte damit wieder religiöse Streitigkeiten loszutreten.

Da tauchten aber auch schon die ersten Probleme auf. Den Server (Geronimo 3.0) per CLI zu starten und per web panel zu administrieren bereitete keine Probleme.

Nun würde ich aber gern auch von Anfang an komfortabel in Eclipse entwickeln und dort auch direkt testen. Also habe ich mir Geronimos Eclipse Plugin installiert was die ersten Fehler warf (dependencies). Mit Helios SR2 war es schon mal gar nicht möglich das zu installieren, also bin ich zur ersten Helios-Version zurück und damit funktionierte es.
Dann einem Tutorial folgend EAR, EJB und WAR Projekte eingerichtet und den Server in Eclipse eingestellt und schon knallte es an der nächsten Ecke.
java.lang.NoClassDefFoundError: Geronimo/etc/java/util/logging/properties
Ich fand mich damit ab, dass es anscheinend mit der neusten Version von Geronimo in Eclipse nicht so richtig rund läuft und probierte 2.2. Läuft anscheinend ohne Probleme, zumindest ließ sich der Server starten.
Kann es vielleicht sein, dass ich noch irgendein spezielles Java EE Paket herunterladen muss? Soweit ich weiß läuft Geronimo 3.0 mit Java EE 6 und 2.2 mit EE 5. Das wäre so mein letzter Ansatz. Habe bisher nur das gewöhnliche JDK installiert, mit dem ich mit Java SE entwickelt habe.

Habe ich mit Geronimo einfach eine schlechte Wahl getroffen, wenn es um die Entwicklung per Eclipse geht oder würde ich bei Glassfish usw. genau solchen Ärger haben? :freak:
 
Okay, ich schaue mir das erst mal an, solange ich bei meinem aktuellen Szenario nicht weiterkomme. Danke für die schnelle Rückmeldung. ;)
 
Glassfish ist auch die Referenzimplementierung von Java EE 6. Insofern würde ich den erstmal nutzen.
Falls du nicht auf Eclipse als IDE festgelegt bist, kann ich die Integration in Netbeans empfehlen!
 
Ich bin erstaunt wie leicht es mit GlassFish ablief. Fast ohne anzuecken eingerichtet und gestartet und die standardmäßige Hello World Seite wird präsentiert. Na da bin ich ja mal gespannt, ob das so intuitiv bleibt - wäre wünschenswert. :)

Edit:
Mag mir vielleicht jemand mal mit einfachen Worten zusammenfassen wofür der EJB Teil (also beans generell), EAR und WAR eigentlich gut sind im Vergleich zu "reinem JSP+Servlets"?
Ich habe bisher ein dynamic web project in Eclipse aufgezogen, welches über den integrierten GlassFish per Browser zugänglich wird.
In einem Tutorial habe ich allerdings eine weitaus aufwändigere Einrichtung gefunden (und hatte es auch probeweise mal so eingerichtet). Eben unter Benutzung eines EAR, eines EJB und eines WAR (dyn web) Projekts.
Ich meine aufgeschnappt zu haben, dass in dem Teil (vor allem in den beans) "Businesslogik" integriert wird. Was kann man sich darunter vorstellen, was man nicht in einem dyn web project unterbringen könnte (auch unter Verwendung von MVC wohlgemerkt)?
 
Zuletzt bearbeitet: (weitere Fragen)
Mit der neuen EJB Version können EJBs direkt ins war gepackt werden dürfte früher nicht gegangen sein.

Der Sinn von EJBs ist das Verteilte Ausführen von Code, bei JSP Projecten die am gleichen application server laufen kannst EJBs quasi direkt verwenden.
Vorteil von EJBs du musst dich nicht um die erstellung der objecte kümmern auch dinge wie transaction managment kannst du vom application server direkt verwalten lassen. Musst dich jedoch an ein paar Regeln halten wie keine Threads, kein system exit etc.

Typischerweise wäre das EJB die Business Logik wobei man wohl davon ausgehen kann das aufgrund des integrierten Transaktion managements auch der data layer mit rein gepackt ist.
 
Wenn du noch noch so sehr am Anfang stehst, dann sind EAR-Dateien und EJB für den Anfang vllt. ein bißchen viel auf einmal.

Fürs erste würde es reichen, wenn du mit Servlets und JSPs ein wenig herumprobierst. Ich nehme an, dass du Webanwendungen programmieren möchtest.

WAR-Datei = Web Application Archive = Eine einfache Ansammlung von Servlets/JSPs/statischen Webdateien(css/js/...). Eine WAR-Datei ist dafür gedacht eine Webanwendung zusammenzufassen, damit man es leicht weitergeben kann. So kann man diese WAR-Datei dann in einem beliebigen Applicationserver (JBoss, Geronimo, Glassfish, ...) oder auch nur ServletContainer (Tomcat, Jettty) installieren und laufen lassen.

EAR-Datei = Enterprise Archive = Eine Sammlung mehrerer WAR-Dateien und EJBs, welche im Verbund eine größere Anwendung darstellen. Ebenso wie ein WAR-File ist es dazu gedacht solche Anwendungen leicht weiterzugeben. Eine EAR-Datei benötigt i.d.R. einen echten Applicationserver, reine Servlet-Container werden damit nur eingeschränkt was mit anfangen können.

EJB = Enterprise Java Bean = Ist eine Sammlung sehr vieler Technologien. Das für die meisten interessatne ist die darin enthaltene Persistenzschicht JPA (Java Persistence API) welches einem eine angenehme Möglichkeit bietet Datenbanken anzusprechen und zu manipulieren. EJB ist gleichzeitig auch eine Komponententechnologie, welche es einem ermöglicht sehr große Projekte auf vielen Servern verteilt zu installieren. EJB sind auch eine Möglichkeit Webservices zu "verpacken". Das installieren von EJBs (befinden sich in einer EAR-Datei) benötigen ebenfalls i.d.R. einen echten Application Server.
Insgesamt habe ich in den letzten 10 Berufsjahren trotz großer Projekte keine ernsthafte Notwendigkeit gehabt EJB einzusetzen, da JPA und Webservices auch ohne EJB in einem Servlet-Container genutzt werden können..

Zum Anfangen brauchst also lediglich einen Servletcontainer wie Apache Tomcat. Alternativ ist Glassfish auch eine gute Wahl, vor allem, wenn du Netbeans als Entwicklungsumgebung nutzt, da dieses meines Wissen die Webanwendung direkt unter Glassfish starten und debuggen kannst. Bei Eclipse müsstest du zunächst erst Plugins suchen/zusammenstellen und aufeinander abstimmen.

Als Anfänger würde ich mit EJB erst anfangen, wenn du die Grundlagen wie Servlets/JSP wirklich beherrschst, da gibt es schon mehr als genug zu lernen.

So..etwas viel geschrieben, aber vllt. konnte ich dir damit ein größeren Überblick verschaffen.
 
Echt super, nun sehe ich ein ganzes Stück besser durch! :D Ich arbeite mich gerade durch Head First Servlets & JSP aber hab erst knapp 100 Seiten hinter mir. Mal sehen wie weit ich damit komme und danach interessiere ich mich dann mal weiter und kann hoffentlich besser abschätzen was ich von dem ganzen Kram mal brauchen kann.
 
Ich grabe mal meinen Thread wieder aus, da ich einen kleinen Tipp bezüglich der Entwicklung bräuchte.

Und zwar habe ich eine kleine ganz simple Accountverwaltung geschrieben, vor allem des Lerneffekts wegen. Dabei wird mit einer DB kommuniziert usw.
Mein erstes Problem war, dass ich überhaupt nicht wusste wohin mit den ganzen zusätzlichen externen jars (gnu trove, mysql connector, bonecp, etc.), die ich benutze. Für den Fall, dass wieder mal jemand vor dem gleichen Problem steht:

"C:\Program Files\eclipse\plugins\oracle.eclipse.runtime.glassfish_3.1.0.0\glassfish3\glassfish\lib"
So und nun zu meinem aktuellen Problem. Ich habe mir eine ClassCastException eingefangen und zu allem übel scheint sie in der JSP aufzutreten. Dadurch kann ich nicht genau lokalisieren an welcher Stelle es knallt.
Frage: Gibt es denn eine Möglichkeit den JSP code zu debuggen? Ich weiß, dass das kompiliert wird, aber irgendwie ist das ja doof, dass man dann überhaupt nicht mehr nachvollziehen kann, wo etwas schief läuft.

Beispiel:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.example.model.UserAccount;
at org.apache.jsp.result_jsp._jspService(result_jsp.java from :61)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
[...]
Code:
<body>
    <%
        out.print("All existing accounts are listed here (horror! but okay for development)<br>");

        UserAccount[] accounts = (UserAccount[]) request.getAttribute("existingUsers");
        for (UserAccount acc : accounts)
        {
            out.print("acc id:" + acc.getAccountId() + "acc name:" + acc.accountName +
                        " first name:" + acc.userFirstName + " last name:" + acc.userLastName + "<br>");
        }
    %>

</body>
und gesetzt wird das attribute hier
Code:
        if (validateAccountDataInput(newUser, repPw))
            AccountManager.getInstance().createUserAccount(newUser);
        
        req.setAttribute("existingUsers", AccountManager.getInstance().getUserAccounts().values());
        
        // Forward objects from the controller to the view
        RequestDispatcher view = req.getRequestDispatcher("result.jsp");
        view.forward(req, resp);
wobei getUserAccounts() eine TIntObjectHashMap (gnu trove collection) und durch values() ein UserAccount[] liefert.
Ich vermute wenn man an den Umgang mit JSPs gewöhnt ist, sieht man den Fehler sofort. Bin gespannt. :)
 
Zuletzt bearbeitet:
Sieht so aus:


Ich habe zum Spaß mal auf Collection alles umgebaut und da schrie der Compiler, dass es unchecked casts gibt. Wusste gar nicht, dass da ein Unterschied gemacht wird, wenn ich nun ein Object in eine Collection caste oder in ein Array, denn bei (UserAccount[]) als cast gab es keine Beschwerden vom Compiler, eben nur eine cast exception zur Laufzeit.

Edit: Ich habe gerade festgestellt, dass in dem was values() da liefert nichts drin steht (also noch ein Fehler in meinem AccountManager). Damit hat sich die Frage glaube ich vorerst erübrigt bzw. weiß ich jetzt, wo ich suchen kann. :D
 
Zuletzt bearbeitet:
Zurück
Oben