Michi: Wie spring ich von der Clientseite ins Servlet?

Hallo,

kennt jemand eine gute Seite, auf der erklärt wird, wie man von einer JSP-Seite aus ein eigenes Servlet aufruft und wie JSP und Servlet in ein Eclipse-Projekt bzw. in die publizierte Webversion (-> WAR?) eingebunden werden müssen, damit sie zusammenarbeiten können?

Diese Seite erklärt schon viel:
http://www.torsten-horn.de/techdocs/java-eclipse.htm#Tomcat

und das Einführungstutorial
http://www.galileocomputing.de/openbook/javainsel5/javainsel17_000.htm#Xxx999378
ist schon auch hilfreich für Anfänger,

aber ich schaff es eben noch nicht, vom JSP aus das Servlet aufzurufen.

Vielleicht ist es aber auch gar nicht so gedacht, dass man von JSP aus in ein eigenes Servlet überspringt, zumal ich ja noch KEIN - nicht mal im galileocomputing, wo es ja eine ewiglange Einführung gibt - Beispiel dafür gefunden habe, außer für "form action"-Aufrufe, ansonsten immer nur so Standardmethodenaufrufe wie "java.util.Date()" - weiß ich eben nicht.

In dem Fall bitte ich um kurze Aufklärung, wie ich denn am Einfachsten von der Clientseite in ein Java-Servlet rüberkomme und evtl. auch wieder zurück, wenn das Servlet eben nicht alles machen soll. ;)

Im Anhang mein bisheriger, gescheiterter Eclipse-Versuch mit der Jasper-Fehlermeldung, von JSP aus ein Servlet zu starten.

Gruß Michi

____________________________________________________________________
____________________________________________________________________

Meine Projektstruktur vom Projekt "MyFirstJSP" im Eclipse schaut so aus:

HelloJSP.jsp
WEB-INF/src/HalloServlet.java
WEB-INF/web.xml

Inhalte:

HelloJSP.jsp:
_______________________________________________________________________
<%@ page import="java.text.*" %>
<%@ page import="java.util.*" %>

<html>
Hallo, meine erste JSP-Seite meldet sich!<br>
<%= request.getRemoteHost() %>,
<%= (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h" %>
<%= (new HalloServlet()) %>
</html>
_______________________________________________________________________

WEB-INF/src/HalloServlet.java:
_______________________________________________________________________
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HalloServlet extends HttpServlet
{
  public void doGet( HttpServletRequest requ, HttpServletResponse resp )
  throws ServletException, IOException
  {
    resp.setContentType( "text/html" );
    PrintWriter out = resp.getWriter();
    // out.println( "<html>" );
    out.println( "Hallo, mein erstes Servlet meldet sich." );
    // out.println( "</html>" );
    out.close();
  }
}
_______________________________________________________________________

WEB-INF/web.xml:
_______________________________________________________________________
<!DOCTYPE web-app PUBLIC
  '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
  'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
  <display-name>Mein erstes Servlet</display-name>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HalloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>
_______________________________________________________________________

Fehlermeldung:

_______________________________________________________________________
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 8 in the jsp file: /HelloJSP.jsp
Generated servlet error:
HalloServlet cannot be resolved to a type

org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
   org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
   org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
   org.apache.jasper.compiler.Compiler.compile(Compiler.java:288)
   org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
   org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
   org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:293)
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.
_______________________________________________________________________

  1. moin Michi :)

    kennt jemand eine gute Seite, auf der erklärt wird, wie man von einer JSP-Seite aus ein eigenes Servlet aufruft und wie JSP und Servlet in ein Eclipse-Projekt bzw. in die publizierte Webversion (-> WAR?) eingebunden werden müssen, damit sie zusammenarbeiten können?

    Eine gute Seite kann ich dir nicht nennen, aber ich kann dir deinen grundsätzlichen Verständnisfehler nennen.

    Nehmen wir uns mal dein Servlet vor:

      
    public class HalloServlet extends HttpServlet  
    {  
      public void doGet( HttpServletRequest requ, HttpServletResponse resp )  
      throws ServletException, IOException  
      {  
        resp.setContentType( "text/html" );  
        PrintWriter out = resp.getWriter();  
        // out.println( "<html>" );  
        out.println( "Hallo, mein erstes Servlet meldet sich." );  
        // out.println( "</html>" );  
        out.close();  
      }  
    }  
    
    

    du hast da eine Methode "doGet()". Damit überschreibst du die doGet-Methode aus  dem HttpServlet. Darin gibt es auch eine doPost()-Methode...
    GET, POST - klingelt da was im Zusammenhang mit Http?

    Genau! Wir brauchen eine Form, die wir abschicken, damit dein Servlet zum Zuge kommt. Klingt komisch - is aba so ;)
    Bau einfach mal eine Form in deine jsp-Seite ein und lass diesen Quark: <%= (new HalloServlet()) %> weg.

    Probier das erstmal aus - und wenn du dann nicht weiterkommst, steh ich gern für weitere Fragen zur Verfügung :)

    liebe Grüße aus Berlin
    lina-

    --
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
    1. Hi lina,

      oweh oweh, damit hat sich eine schlimme Befürchtung von mir bestätigt... :)

      Ich kann also nicht, außer vielleicht über Shellskript-Aufruf oder solche "Mogelkonstruktionen" ins Servlet hüpfen und damit grundsätzlich Java anstelle von PHP verwenden? Ich bin also immer auf das vorangehende Anwendergeklicke angewiesen und kann nicht GLEICH mit einem Servlet (index.jsp ruft index.class oder so auf) loslegen? :/ :)

      Gruß Michi

      1. moin Michi :)

        Ich kann also nicht, außer vielleicht über Shellskript-Aufruf oder solche "Mogelkonstruktionen" ins Servlet hüpfen und damit grundsätzlich Java anstelle von PHP verwenden? Ich bin also immer auf das vorangehende Anwendergeklicke angewiesen und kann nicht GLEICH mit einem Servlet (index.jsp ruft index.class oder so auf) loslegen? :/ :)

        nein - das kannst du nicht! Ist auch nicht Sinn der Sache ;)
        Es gibt allerdings eine Schummelvariante, die nicht auf ein "Anwendergeklicke" wartet:

          
        <body onload="document.forms[0].submit()">  
        <form>  
        ...  
        </form>  
        </body>  
        
        

        Aber Achtung! Hier bist du darauf angewiesen, dass der User Javascript angeschaltet hat. Was machst du wenn dies nicht der Fall ist?
        Vielleicht solltest du dein gesamtes Konzept mal überdenken ;)

        liebe Grüße aus Berlin
        lina-

        --
        Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
      2. moin Michi :)

        Was mir grad noch aufgefallen ist:
        Wieso brauchst du eigentlich Servlets?
        Normale Java-Dinge kannst du doch auch direkt in der JSP-Seite tun...

        liebe Grüße aus Berlin
        lina-

        --
        Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
        1. Hi lina,

          Ich kann also nicht, außer vielleicht über Shellskript-Aufruf oder solche "Mogelkonstruktionen" ins Servlet hüpfen und damit grundsätzlich Java anstelle von PHP verwenden? Ich bin also immer auf das vorangehende Anwendergeklicke angewiesen und kann nicht GLEICH mit einem Servlet (index.jsp ruft index.class oder so auf) loslegen? :/ :)

          nein - das kannst du nicht! Ist auch nicht Sinn der Sache ;)
          Es gibt allerdings eine Schummelvariante, die nicht auf ein "Anwendergeklicke" wartet:

          <body onload="document.forms[0].submit()">
          <form>
          ...
          </form>
          </body>

          Da ist mir die Schummelei zu offensichtlich! :)
          Ne, also JavaScript will ich sowieso nicht einsetzen, egal, wozu. ;)

          Was mir grad noch aufgefallen ist:
          Wieso brauchst du eigentlich Servlets?

          Noch brauche ich sie ja nicht. ;) Ich wollte die Technik eben einfach mal kennenlernen - natürlich mit dem Hintergedanken, mich damit bei Gefallen anzufreunden und sie ab demnächst einzusetzen. Nun bin ich nach Deiner Aufklärung jedoch erstmal ins Zögern geraten. :)

          Normale Java-Dinge kannst du doch auch direkt in der JSP-Seite tun...

          Hm, ja ok, aber reines Java ist eben das Übersichtlichste, was man so programmieren kann, wenn man das Nötige dazutut. (Find ich - Geschmackssache. ;)) Das, was jsp so kann (zumindest, was ich bisher gesehen habe), kann php ja auch, dabei vom Code her schöner und noch dazu mit wesentlich weniger Aufwand, nicht?
          Drum hätt ich im Sinn gehabt, bei großen, komplexen Anwendungen in Zukunft ab index (!) gleich Java einzusetzen. Wobei php inzwischen natürlich schon auch schön OOP unterstützt, an reines Java jedoch doch noch nicht rankommt. Vielleicht in Version 7 oder 8. ;)

          Gruß Michi

          Das ist nun halt ein kleiner Schock am frühen Morgen, der erstmal verdaut werden muss... :)

          1. moin Michi :)

            Normale Java-Dinge kannst du doch auch direkt in der JSP-Seite tun...

            Hm, ja ok, aber reines Java ist eben das Übersichtlichste, was man so programmieren kann, wenn man das Nötige dazutut. (Find ich - Geschmackssache. ;))

            In dieser Hinsicht widerspreche ich dir keineswegs :)

            Das, was jsp so kann (zumindest, was ich bisher gesehen habe), kann php ja auch, dabei vom Code her schöner und noch dazu mit wesentlich weniger Aufwand, nicht?

            keine Ahnung - ich kann kein PHP :]

            Das ist nun halt ein kleiner Schock am frühen Morgen, der erstmal verdaut werden muss... :)

            Nanana ;) nicht gleich die Flinte ins Korn werfen *g* Nachdem ich nun weiss, worum es dir eigentlich geht, möchte ich dir die Beans ans Herz legen :)
            Die kapseln alle Logik und wenn man es drauf anlegt, kann man komplette Seiten zurückgeben lassen (nicht unbedingt die beste Praxis *find*)

            liebe Grüße aus Berlin
            lina-

            --
            Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
            1. Hi lina,

              Das ist nun halt ein kleiner Schock am frühen Morgen, der erstmal verdaut werden muss... :)

              Nanana ;) nicht gleich die Flinte ins Korn werfen *g* Nachdem ich nun weiss, worum es dir eigentlich geht, möchte ich dir die Beans ans Herz legen :)

              Die kapseln alle Logik und wenn man es drauf anlegt, kann man komplette Seiten zurückgeben lassen (nicht unbedingt die beste Praxis *find*)

              Hab mich jetzt durch einige Bean-Seiten durchgelesen, aber nirgends find ich mal ein Beispiel, das auf die konsequente HTML-Code-Erstellung mit serverseitiger Logik in Java eingeht. Das, was Du meinst, sind also die Enterprise Beans, die serverseitig laufen? Denn sonst laufen Beans aufm Client, wie ich das verstanden hab?

              Sind Enterprise Beans dann lediglich serverseitig laufende APPLETS (schließlich hab ich immer wieder gelesen, dass die Größe des Beans definiert werden muss, was bei HTML-Code eigentlich nicht nötig ist, z.B. "Das erste, was für das Bean benötigt wird, ist eine Variable, in der die aktuelle Höhe und Breite, sog. Dimension, des Beans gespeichert wird"
              auf http://techni.chemie.uni-leipzig.de/schueler/java/Beans/Theorie eines Beans.html)
              oder ist es doch auch möglich, über Beans reinen HTML-Code (ohne Applets in irgendeiner Form, also irgendwelche "komischen Kästen" auf der Seite, innerhalb deren sich die Beans austoben :)) zurückzuliefern?

              Aber wie Du schon angedeutet hast, ist das wohl auch nicht die gängige Praxis und wahrscheinlich laufe ich deswegen mit meinem unwissenden Fortbildungsschädel gegen die Wand, weil ich dann dementsprechend natürlich auch keine Beispiele finden werde? :)

              (Vergleichbar damit wäre dann die Verwendung eines stinknormalen PKWs als Traktor - Geht natürlich mehr oder weniger irgendwie, "wenn mans drauf anlegt", ist aber sicher nicht die optimale Lösung. Und wenn man als landwirtschaftlicher Laie erstmal wissen will, wie das geht, wird man sich wundern, warum man in keiner Bedienungsanleitung von irgendeinem Autohersteller einen Hinweis geschweige denn ein grafisches Beispiel findet, wie man den Pflug konkret an die Anhängerkupplung anschließen muss... :)´ )

              Gruß Michi

              1. moin Michi :)

                Du bist leider komplett auf dem Holzweg ;)
                Beans haben gar nichts mit Applets zu tun! Also brauchst du auch keine Kästchen ;)

                Nehmen wir uns mal ein Bean:

                  
                package my.package;  
                import java.io.Serializable;  
                public class MyBean implements Serializable{  
                  private String htmlCode;  
                  
                  public void setHtmlCode( String htmlCode){  
                    this.htmlCode = htmlCode;  
                  }  
                  public int getHtmlCode(){  
                    String result="<body><h1>";  
                    result+=htmlCode;  
                    result+="</h1></body>";  
                    return result;  
                  }  
                  public int getTestAusgabe(){  
                    String result="<body><h1>Dies ist ein Test</h1></body>";  
                    return result;  
                  }  
                
                

                Alles klar soweit? Is ja nicht so schwierig.
                Nun guggen wir uns noch entsprechenden jsp-Teile an:
                Bean laden: <jsp:useBean id="myBean" class="my.package.MyBean" />
                eine Testausgabe: <jsp:getProperty name="myBean" property ="testAusgabe" />
                Überschrift setzen: <jsp:setProperty name="myBean" property="htmlCode" value="Hallo Michi" />
                Überschrift setzen: <jsp:getProperty name="myBean" property ="htmlCode" />

                noch Fragen? ;)

                liebe Grüße aus Berlin
                lina-

                --
                Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
                1. Hi Lina,

                  Alles klar soweit? Is ja nicht so schwierig.

                  An sich nicht - Das ganze ist zwar nicht grad intuitiv erahnbar, aber wenn man mal ein paar Beispiele gesehen hat, ist die Technik nachvollziehbar. Allerdings... :)

                  Nun guggen wir uns noch entsprechenden jsp-Teile an:
                  Bean laden: <jsp:useBean id="myBean" class="my.package.MyBean" />
                  eine Testausgabe: <jsp:getProperty name="myBean" property ="testAusgabe" />
                  Überschrift setzen: <jsp:setProperty name="myBean" property="htmlCode" value="Hallo Michi" />
                  Überschrift setzen: <jsp:getProperty name="myBean" property ="htmlCode" />

                  noch Fragen? ;)

                  Eine hätt ich noch! :)

                  Wie verknüpf ich nun das JSP mit dem Bean bzw. was muss ich tun, damit aus dem Java-Sourcecode der Bean eine .class wird?
                  Hab nun mehrere gefundene Beispiele (wenn man mal genügend Schlüsselwörter kennt und gezielt danach suchen kann, findet man auch solche ;)) ausprobiert, indem ich die Quellcodes mal in entsprechend benannte Files bzw. Classes im Eclipse kopiert habe, dabei die .java auch mal in den einzelnen Projektverzeichnissen (WEB-INF, WEB-INF/src, WEB-INF/src/lib, usw.) rumverschoben hab und dennoch war die Jasper-Meldung IMMER:

                  org.apache.jasper.JasperException: Unable to load class for JSP

                  Heißt also höchstwahrscheinlich, es scheitert nun noch daran, dass die .class fehlt. Ich behaupte mal, dass sie ganz fehlt, allein deswegen, weil ich bei der Suche nach *CalcBean* (wie die Bsp-Klasse heißt) lediglich die .java gefunden bekomme, nicht jedoch eine .class und auch sonst erscheint nichts Derartiges in meinem BeanTest-Verzeichnis. Manuell kompilieren kann ich das Bean im Eclipse nicht, weil die dafür zuständige Funktion deaktiviert (blassgrau) erscheint und der Jasper mag halt nicht, wenn ichs über das Starten des JSP probiere, weil ich die Bean-Klasse wahrscheinlich nicht korrekt abgelegt bzw. eingebunden (web.xml?) habe.

                  Was muss ich nun also noch tun, damit die Beans kompiliert werden? :)

                  Gruß Michi

                  Ich verspreche hiermit schon mal, dass ich dann, wenn ich mal fit bin mit den Beans, einen Einführungsartikel für Einsteiger schreibe und veröffentliche! ;)

                  1. moin Michi :)

                    Was muss ich nun also noch tun, damit die Beans kompiliert werden? :)

                    Du arbeitest mit Eclipse? Ich kenn jetzt deine Projekt-Architektur nicht so genau, aber bei mir hat es gereicht im Menüt unter "Project" Build Automaticaly anzukreuzen. Da hat er mir dann einen Folder mit dem Namen "bin" angelegt, in dem alle compilierten Klassen lagen. Wer es nicht mag, bei jedem Speichern zu kompilieren, kann auch unter Project die einzelnen Build-Optionen auswählen.

                    Falls es das nicht tut, bitte ich dich, mir mal deine Projektarchitektur zu zeigen (Welche Ordner, welche Dateien)

                    Ich verspreche hiermit schon mal, dass ich dann, wenn ich mal fit bin mit den Beans, einen Einführungsartikel für Einsteiger schreibe und veröffentliche! ;)

                    Cool :) von sowas hab ich damals geträumt...

                    liebe Grüße aus Berlin
                    lina-

                    --
                    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
                    1. Hi Lina,

                      hurra, ich habs endlich doch noch hinbekommen. *schnauf* :)
                      Zuletzt gescheitert ist es dann wohl daran, dass ich kein Package in /WEB-INF/src erstellt hab. Hab ich dann eben mal erstellt und die class-Zuweisung in der JSP entsprechend angepasst und dann gings doch noch.

                      Du arbeitest mit Eclipse? Ich kenn jetzt deine Projekt-Architektur nicht so genau, aber bei mir hat es gereicht im Menüt unter "Project" Build Automaticaly anzukreuzen. Da hat er mir dann einen Folder mit dem Namen "bin" angelegt, in dem alle compilierten Klassen lagen.

                      Hm, das macht meine Eclipse nicht so. Meiner generiert jetzt - endlich, olé olé! :) - im selben Verzeichnis, in der er das .java-Servlet aus der JSP erstellt die dazugehörige .class.

                      Wer es nicht mag, bei jedem Speichern zu kompilieren, kann auch
                      unter Project die einzelnen Build-Optionen auswählen.

                      Komisch, das geht in der Form bei mir nicht, zumindest nicht mit dem bin-Verzeichnis, aber inzwischen anders, eben in das /work/org/apache/jsp/-Verzeichnis. Konfigurationssache?

                      Ich verspreche hiermit schon mal, dass ich dann, wenn ich mal fit bin mit den Beans, einen Einführungsartikel für Einsteiger schreibe und veröffentliche! ;)

                      Cool :) von sowas hab ich damals geträumt...

                      So, nun, nachdems nun endlich mal geht, werd ich mal üben, üben, üben und mich immer fleißig fortbilden. *röchel, so ein Stress!* :)

                      Immerhin hab ich es ja schon mal geschafft, ein vorgegebenes Paar aus JSP und Bean um eine get-Property zur HTML-Ausgabe zu erweitern. Naja, die Technik selber ist schon ziemlich easy, aber der formelle Kram, was gehört in welches Verzeichnis, welches Package muss man wo definieren und wie einbinden usw.... Da kriegst als Anfänger ja mittlere Zustände und da kommst ohne Hilfe auch nie und nimmer von selber drauf! :)

                      Danke Dir sehr! ;)
                      Michi

                      (Na hoffentlich geht das ganze nicht von vorn los, wenn ichs dann mal aufm Server publizieren will. :/ :) )