JSP + Bean -> doGet() wird nie aufgerufen
-
Hallo,
meine Bean wurde von HttpServlet abgeleitet, aber doGet() wird nie aufgerufen. Woran liegt es? Ich sitz schon den dritten Tag an dem Problem, aber ich check nicht an was es liegen könnte. Vielleicht an der web.xml? Ist das Mapping falsch eingestellt? Ich bin verzweifelt.
Wenn Ihr noch mehr Informationen braucht poste ich die gerne.
Hier ist nun alles was ich habe:
JSP:
<jsp:useBean id="myBean" class="myBeans.myServlet" scope="session" /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//DE"> <html> <head> <title>Hello World</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> </head> <body> <form method="get" action="helloworld.jsp"> <input type="text" name="myName" /> <input type="submit" value="los geht's!" /> </form> <!-- Start des JSP Codes //--> <%= "__Hello World!" %><br> <% for(int i = 0; i < 10; ++i) { out.println(i + "<br />"); } %><br><br> Anzahl: <%= myBean.getAnzahl() %> <!-- Ende des JSP Codes //--> </body> </html>
meine Bean:
package myBeans; import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class myServlet extends HttpServlet { private int anzahl = 0; public int getAnzahl() { return anzahl; } public void setAnzahl(int anz) { anzahl = anz; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ++anzahl; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } }
und meine web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Hello World</display-name> <description>Hello World</description> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>myBeans.myServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
Sehe ich das richtig? Du willst beim Aufruf der JSP dein die doGet()-Methode deines „Beans“ ausführen?
Erstmal ist das eher ein Servlet und weniger eine Bean. Willst du die doGet()-Methode ausführen, dann über Aufruf des Servlets über ein HTML-Formular oder über Eingabe in der Adresszeile des Browsers.
Willst du Daten in der Bean ablegen, dann würde ich dir empfehlen, Bean- und Servlet nicht miteinander zu vermischen.
Vorschlag – Mache eine ordentliche Bean:
package myBeans; public class myBean1 { private int anzahl = 0; public int getAnzahl() { return anzahl; } public void setAnzahl(int anz) { anzahl = anz; } }
Greife auf Bean-Eigenschaften mit jsp:setProperty und jsp:getProperty zu!
<jsp:useBean id="myBean1" class="myBeans.myBean1" scope="session" /> <jsp:setProperty name="myBean1" property="anzahl" value="223"/> Anzahl: <jsp:getProperty name="myBean1" property="anzahl" />
-
Hallo,
erstmal danke für die Antwort
Mein Servlet ist ja von HttpServlet abgeleitet, und es soll ganz einfach, wenn über das Formular ein Name eingegeben wurde, die Variable Anzahl hochzählen. Das hochzählen ist nur zum Testen gedacht.
Wenn ich das implizite Objekt request in meiner JSP nutze, funktioniert es, aberv es kommt nichts in meinem Servlet an. Und das genau ist mein Problem, denn ich würde die Logik gerne in mein Servlet auslagern.Meinst Du ich sollte über setProperty das request Objekt an mein Servlet übergeben? Ich dachte das geht automatisch weil es von HttpServlet abgeleitet wurde?
PS: Die Tag-Schreibweise werde ich mir noch angewöhnen - ich arbeite erst 3 Tage damit Aber danke für deinen Hinweis!
-
OK, kleiner Crashkurs in MVC. Vielleicht hilft dir das:
1. Schritt: Wir definieren uns eine Bean (ich hab' die Klassennamen im Gegensatz zu deinem Beispiel großgeschrieben).
package myBeans; public class MyBean1 { private int anzahl = 0; public int getAnzahl() { return anzahl; } public void setAnzahl(int anz) { anzahl = anz; } }
2. Schritt: Wir erstellen ein Servlet, das die "anzahl"-Eigenschaft der Bean bei jedem Aufruf um 1 erhöht. Danach leitet das Servlet sofort zur JSP um. Gibt es die Bean noch nicht im Sitzungskontext so wird das ensprechende Objekt erstellt, und als Attribut der Sitzung abgespeichert. Beachte, dass das Paket ein anderes ist!
package myServlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import myBeans.MyBean1; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { MyBean1 mb = (MyBean1)request.getSession().getAttribute("myBean"); if (mb == null) { mb = new MyBean1(); mb.setAnzahl(1); request.getSession().setAttribute("myBean", mb); } else { mb.setAnzahl(mb.getAnzahl() + 1); } request.getRequestDispatcher("helloworld.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } }
3. Schritt: Deine JSP wird vom Servlet aufgerufen, lädt die Bean und gibt die Eigenschaft "anzahl" aus. Schickst du das Formular (jetzt an das Servlet) ab, so wird "anzahl" um 1 erhöht (siehe oben).
<jsp:useBean id="myBean" class="myBeans.MyBean1" scope="session" /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//DE"> <html> <head> <title>Hello World</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> </head> <body> <form method="get" action="MyServlet"> <input type="text" name="myName" /> <input type="submit" value="los geht's!" /> </form> <!-- Start des JSP Codes //--> <%= "__Hello World!" %><br> <% for(int i = 0; i < 10; ++i) { out.println(i + "<br />"); } %><br><br> Anzahl: <%= myBean.getAnzahl() %> <!-- Ende des JSP Codes //--> </body> </html>
4. Schritt: Implementierungsdeskriptor schreiben. Ich habe deinen abgewandelt. Das Servlet wird jetzt als erstes aufgerufen.
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Hello World</display-name> <description>Hello World</description> <servlet> <servlet-name>MyServlet</servlet-name> <display-name>MyServlet</display-name> <servlet-class>myServlets.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>MyServlet</welcome-file> </welcome-file-list> </web-app>
Puh, hoffe das hilft dir.
-
Danke, Danke, Danke!
Ich kann also mein Servlet garnicht automatisch ausführen lassen, bzw. muss es vor der JSP ausführen.
Danke Dir vielmals. Ich werde es gleich ausprobieren!
-
hmmm, jetzt bekomm ich eine 404 Seite
-
the-architect schrieb:
hmmm, jetzt bekomm ich eine 404 Seite
Ja, solche Fehler können am Anfang nerven. Ich kann dir nur sagen, dass es bei mir funktioniert.
Wird das Servlet schon nicht gefunden oder ist es eine andere Ressource? Überprüfe das bitte. Die Fehler können an vielen Stellen zu finden sein: Groß- und Kleinschreibung der Pakete und Klassen. Hast du überhaupt alles in die richtigen Pakete kompiliert?
Oder probiere, ein simples Servlet aufzurufen, dass eine Ausgabe auf die Server-Konsole schreibt, um zu überprüfen, ob es überhaupt gefunden wird.
Was benutzt du eigentlich für eine Servlet-Engine? Ich hab's mit Tomcat probiert.
-
Ich hab mal eine ganz normale test.htm in das selbe Verzeichnis gepackt, aber es kommt wieder ein 404.
Ich hab Tomcat 5.5 laufen
-
the-architect schrieb:
Ich hab mal eine ganz normale test.htm in das selbe Verzeichnis gepackt, aber es kommt wieder ein 404.
Ich hab Tomcat 5.5 laufenAlso, ich habe die ganzen Codes, wie sie hier von mir aufgelistet sind, nochmal hergenommen, eine kleine WAR-Datei erstellt und sie über das Tomcat-Admin-Menü installiert. Und siehe da, es läuft alles wie’s laufen soll.
Nochmal zusammengefasst:
1. Kompiliere MyBean1.java. Danach müsstest du ein Verzeichnis „myBeans“ und darin die Klasse „MyBean1.class“ haben.
2. Kompiliere MyServlet.java. Danach müsstest du ein Verzeichnis „myServlets“ und darin die Klasse „MyServlet.class“ haben.
3. Erstelle Verzeichnis WEB-INF und darin das Verzeichnis classes.
4. Kopiere die Verzeichnisse „myServlets“ und „myBeans“ nach WEB-INF/classes und web.xml nach WEB-INF.
5. Die JSP helloworld.jsp bleibt im Wurzelverzeichnis
6. Erstelle eine WAR-Datei (z.B. jar cvf Test.war * )
7. Tomcat starten, WAR installieren, Mini-Anwendung starten, fertig.So, ich hoffe ich habe nichts übersehen. Wenn’s dann immer noch nicht klappt, muss es was anderes sein, auf das ich jetzt keinen Rat weiß (Tomcat-Konfiguration oder vielleicht sogar falsche Adresse eingegeben).
-
Hallo Felli.
Ich möchte mich recht herzlich bei Dir bedanken. Du hast mir wirklich sehr geholfen.
Ich glaube das Problem liegt an meiner Eclipse oder Tomcat Installation auf Arbeit. Jedenfalls habe ich es gerade zu Hause mit Netbeans nochmal probiert und voila! Es geht! Juhuu!!
Und das innerhalb von wenigen Minuten. Und meine getter und setter Methoden hat mir Netbeans auch gleich mit der Refactoring Tool gebasteltDas MVC Konzept hab ich auch verstanden!
So einfach wie PHP ist der Einstieg sicherlich nicht, aber wenn man diese Modell erstmal gecheckt hat, ist es doch Schlussendlich in jeder Sprache immer das gleiche Prinzip
So long! Und danke Dir nochmal.
Ich war echt am Verzweifeln!