Cooli: Parameter per Post-Request

ich möchte aus einer EJB per POST Daten an ein Servlet übergeben um dort dann die Daten in doPOST per request.getParameter() auseinander nehmen zu können. Ich baue eine Connection auf und kann auch Daten zum Servlet senden
output = new DataOutputStream(connection.getOutputStream());
output.write("user=test".getByte());

Das kommt auch genauso beim Servelt an aber die Funktion getParameter liefert mir nix!
Wenn ich einen String über Browser an das Servlet schicke dann kann ich dort die Parameter auswerten! Im der EJB setzte ich die RequestMethode auf POST!

Was mache ich falsch!!!

  1. Hi Cooli,

    ich hab leider von EJB's (noch) praktisch keine Ahnung, aber bist Du Dir sicher, dass zur Kommunikation zwischen EJB und Servlet Post der richtige Weg ist ? Ich dachte bisher immer irgendwie mit EJBs würde man grundsätzlich mit RMI kommunizieren, aber wie gesagt, ich hab da nur sehr rudimentäres Wissen.
    Wenn Du schonmal Daten senden kannst, aber getParameter nicht geht, vermute ich dass die Daten nicht korrekt gesendet werden, hast Du es alternativ mal mit einem GET Request versucht ?
    Oder versuch mal eine kleine Serverklasse zu bauen, die Dir genau anzeigt, was die EJB da genau versendet (mit HTTP header...), ich glaube bei Post müsste nach dem Header 2 Linebreaks, und dann die Daten kommen, bei Get hängen die Daten hinten an der URL.
    Vielleicht hilft Dir das ein bisschen weiter.

    Gruss

    Marko

  2. Hallo Cooli,

    hast Du schonmal ausgelesen was im Request und was in der Session drin steht?
    Ich hab folgenden Testabschnitt in meinem Dispatcher:

    // *** Testbereich Anfang ***
            //Ausgabe der Attribute, die in der Session stehen
            Enumeration keys;
            String key;
            String value;
            logger.info("Inhalt Session: ");
            logger.info("~");
            keys = session.getAttributeNames();
            Enumeration enum;
            while( keys.hasMoreElements() ) {
                key = (String)keys.nextElement();
                logger.info("Attribut: "+key);
                Object o;
                o = session.getAttribute(key);
                value = o.toString();
                logger.info("Wert: "+o);
                logger.info("
    ~");
            }
            //Ausgabe der Attribute, die in dem Request stehen
            Enumeration keysR;
            String keyR;
            String valueR;
            logger.info("****************************************");
            logger.info("Inhalt Request: ");
            logger.info("~");
            keysR = request.getAttributeNames();
            Enumeration enumR;
            while( keysR.hasMoreElements() ) {
                keyR = (String)keysR.nextElement();
                logger.info("Attribut: "+keyR);
                Object o;
                o=request.getAttribute(keyR);
                value = o.toString();
                logger.info("Wert: "+o);
                logger.info("
    ~");
            }
            // *** Testbereich Ende ***
    wenn Du kein log4j benutzt halt noch logger.info durch System.out.println() (oder was Du normalerweise zur Ausgabe benutzt)
    ersetzen.
    mfg
    Christoph

    1. Danke habe dir mal eine e-mail geschickt mit den beiden funktionen
      vielleicht kannst du mir dann besser helfen!
      Werde nochmal testen was in der Session drin steht!!!

      Cooli

  3. Hi,

    output = new DataOutputStream(connection.getOutputStream());
    output.write("user=test".getByte());

    Das kommt auch genauso beim Servelt an aber die Funktion getParameter liefert mir nix!

    1. Was referenziert 'connection'? Was referenziert 'output'?

    Viele Grüße,
    Martin Jung

    1. connection ist vom Typ HttpURLConnection
      und ist mit HttpURLConnection connection = (HttpURLConnection) url.openConnection(); erstellt worden
      url ist dabei mein Servlet http://localhost:7001/unterverzeichnis/Servlet
      output ist doch nur der Stream auf den ich schreibe!

      Oder was möchtest du wissen?

      Cooli

  4. Hi,

    connection ist vom Typ HttpURLConnection
    und ist mit HttpURLConnection connection = (HttpURLConnection) url.openConnection(); erstellt worden
    url ist dabei mein Servlet http://localhost:7001/unterverzeichnis/Servlet
    output ist doch nur der Stream auf den ich schreibe!

    Oder was möchtest du wissen?

    Ich versuche zu verstehen, was Du machen möchtest und was Du wirklich machst.

    Ich zitiere aus Deinem Erstposting:

    Das kommt auch genauso beim Servelt an aber die Funktion getParameter liefert mir nix!
    Wenn ich einen String über Browser an das Servlet schicke dann kann ich dort die Parameter auswerten! Im der EJB
    setzte ich die RequestMethode auf POST!

    Aus dem letzten Satz entnehme ich indirekt, dass der POST-Request funktioniert, wenn das Servlet auf standardisierte Weise, nämlich einen vermittelnden Servlet-Container, der vermutlich gleichzeitig als Web-Server dient (Tomcat?), aufgerufen wird. D.h., der Browser generiert einen offensichtlich validen POST-Request, der als solcher vom Servlet-Container erkannt _und_ prozessiert werden kann. Als Folge wird dann die .service() Methode des Servlets durch den Container aufgerufen, wobei ein HttpServletRequest- und ein HttpServletResponse-Objekt als Parameter vom Container (der diese Objekte zuvor natürlich generiert hat) übergeben werden.
    Du sagtest, die Methode .getParameter(String name) 'liefert Dir nix' (ich vermute, sie gibt 'null' zurück). Diese Methode gehört zur Klasse HttpServletRequest, die einen prozessierten Client-Request (hier: POST) repräsentiert/kapselt. Wenn Du zusätzlich weißt, dass "user=test".getByte() 'auch genauso beim Servelt ankommt', ergeben sich für mich mehrere mögliche Ursachen:
    a) ein Objekt vom Typ HttpURLConnection ist zwar prinzipiell geeignet (ich habe HttpURLConnection noch nicht verwendet), einen validen HttpServletRequest zu generieren, aber der Aufruf von .setRequestMethod() mit anschließendem direktem Schreiben der Request-Parameter in den Stream dazu alleine reicht nicht aus.

    [..viele andere Auflistungspunkte nach nochmaligem Blick in die HttpURLConnection-API wieder gelöscht...]

    Was passiert, wenn Du connection.setRequestProperty("user", "test") an Stelle von output.write(..) verwendest?

    Viele Grüße,
    Martin Jung

    1. Uups,

      daneben gezielt ;-)

      Martin