# Servlet InputStream leer?!



## SchlechterInformatiker (10. Mrz 2009)

Hallo,

hier die kurze Frage: 
Wie komme ich denn an den Byte-Strom, der vom Browser oder einem anderen Programm an meinen Servlet übertragen wird? Ich will den einfach selber auslesen und sehen was im Original drin steht. Der InputStream ist scheinbar leer.


Hier die längere Frage:
nachdem ich jetzt einen funktionstüchtigen HttpServlet geschrieben und am Laufen habe, will mein Chef dass der Servlet neben der ganzen Http-Geschichte auch noch ein paar andere Sachen macht. Das würde ich gerne machen indem ich bei den Servlets quasi eine Ebene höher gehe und meine eigene Servlet-Klasse nicht von HttpServlet ableite sondern direkt einen Servlet schreibe, der das Interface Servlet implementiert.

Ich habe nun also versucht die service(ServletRequest,ServletResponse)-Methode zu implementieren. Die Ausgabe funktioniert, es kommt Text beim Browser an wenn ich den Servlet abrufe. Nur mit den empfangenen Daten hab ich Probleme. Der BufferedReader von ServletRequest.getReader() liest leider nix, der InputStream scheint leer zu sein. Bis auf ein paar Attribute (die tatsächlich ein bisschen Text enthalten) ist da nix zu holen: die Parameter sind leer, der InputStream auch usw...

Das Teil sollte weiter unter Tomcat laufen. Ist es also möglich an den Byte-Strom ran zu kommen? Ich würde dann selber die Methoden doGet() und doPost() usw. aufrufen. Was muss ich dann noch beachten?


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class PortalServlet implements Servlet
{
	public void destroy() 
       {
	
	}
	public ServletConfig getServletConfig() 
       {
		return null;
	}
	public String getServletInfo() 
       {
		return null;
	}
	public void init(ServletConfig arg0) throws ServletException 
	{

	}
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException 
	{
		BufferedReader in = arg0.getReader();
		in.reset();
        	System.out.println("from service");
        	PrintWriter out = arg1.getWriter();
        	out.println("Hello. Roses are red.");
        	out.println("Violets are blue.");

               /*
                  Obige Ausgabe kommt am aufrufenden Browser an, 
                  Unten versuche ich die übermittelten Daten einzulesen und ebenfalls auszugeben, aber es
                  bleibt bei der Ausgabe, die oben erzeugt wird
               */

        	char[] c = new char[100];
        	in.read(c);
        	String s = new String(c);
        	out.println(s);
	}	
}
```


----------



## Gelöschtes Mitglied 5909 (10. Mrz 2009)

mach mal extends HttpServlet oder schreibe dir deine eigene implementierung...


----------



## SchlechterInformatiker (10. Mrz 2009)

Einen Servlet der von HttpServler ableitet habe ich bereits. Der funktioniert auch solange ich mit den Methoden getParameter(String) etc. arbeite. Jedoch komme ich auch bei einem HttpServlet nicht an den originalen übertragenen Byte-Strom ran bzw. dieser ist ebenfalls leer.


Wie meinst du das mit der eigenen Implementierung? Ein Java Programm welches so tut als wäre es ein Tomcat? Komm ich denn wirklich nicht einfacher an den Byte-Strom heran? Also als Servlet meine ich.


----------



## Gelöschtes Mitglied 5909 (10. Mrz 2009)

verwende doGet bzw doPost und les dann den InputStream aus dem HttpRequest aus

um bei get und post das gleiche auszuführen kannst du die deligieren

edit: btw das was du suchst ist wohl eher getQueryString()

Die Parameter stehen nur bei POST im body, der InputStream / Reader enthält nur die Daten des bodies



> Retrieves the body of the request as binary data using a ServletInputStream. Either this method or getReader() may be called to read the body, not both.


----------



## SchlechterInformatiker (10. Mrz 2009)

Ok, falscher Ansatz und schlecht formulierte Frage. Nochmal:

Ich will in meinem Servlet an die Original-Daten heran, die der Browser an meinen Servlet schickt, also sowas in der Art:

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: de
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)
Host: localhost:6000
Connection: Keep-Alive




Komme ich da aus meinem Servlet heraus irgendwie heran so dass ich das selber parsen kann?

mfg


----------



## Ebenius (11. Mrz 2009)

Ich versteh den Sinn nicht. Du willst die [HIGHLIGHT]HTTP-Anfrage[/HIGHLIGHT] haben und unbedingt [HIGHLIGHT]nicht von HttpServlet[/HIGHLIGHT] erben? Das passt in meinen (weintrunkenen) Augen nicht zusammen.

Ebenius


----------



## SchlechterInformatiker (11. Mrz 2009)

Naja ich verstehe das so:
Es gibt Servlets und es gibt deren untergeordnete Kategorie, die HttpSevlets, die speziell für das Http Protokoll zu verwenden sind. Ich dachte mir also, wenn ich ein anderes Protokoll als Http fahren will, leite ich nicht von "HttpServlet" ab sondern implementiere "Servlet". 

Wenn dann also Datein hereinkommen, und die mit "GET / HTTP/1.1" oder so ähnlich beginnen, dann schmeisse ich selber meinen HttpServlet an, und wenn andere Daten ankommen, dann mache ich was anderes, z.B. etwas nach meinem eigenen Protokoll. 

Aber dazu müsste ich schon irgendwie an die Daten kommen, die von einem aufrufenden Programm an meinen Servlet (nicht HttpServlet) übertragen werden.


Ich meine, wozu kann man überhaupt selber "Servlet" implementieren wenn man damit scheinbar sowieso nix anderes machen kann als einen eigenen HttpServlet zu bauen??

Sagen wir vereinfacht: Ich will nix mehr mit Http zu tun haben und deswegen will ich nicht von HttpServlet ableiten.


----------



## Gelöschtes Mitglied 5909 (12. Mrz 2009)

nix für ungut, abstraktion und unabhängigkeit in allen ehren, aber ein nicht httpservlet macht in meinen Augen wenig sinn

Wenn du nochmal etwas genauer den Sinn und Zweck beschreibst was du tun willst kann man dir vielleicht eher helfen


----------



## SchlechterInformatiker (12. Mrz 2009)

Auch wenn es wenig Sinn macht, mir geht es nur darum ob es möglich ist.

Ich habe einen Servlet. Und der Servlet soll auch mit gewissen anderen Programmen übers Netzwerk kommunizieren können, nicht nur mit Browsern. Mit den anderen Programmen soll der Servlet über ein selber entwickeltes Protokoll kommunizieren, nicht über Http.

Sorry wenn das ein bisschen schroff rüberkommt, aber:

ist es nun möglich, von meinem Servlet aus an die vom Browser an den Tomcat übertragenen Daten zu kommen? Und zwar an die Original-Daten - nichts was vom Tomcat schon vorgekaut wurde.

Ja oder nein?
Ich will keine Ersatzlösungen bitte.


Und trotzdem danke für eure bisherigen Antworten!


----------



## Gelöschtes Mitglied 5909 (12. Mrz 2009)

> ist es nun möglich, von meinem Servlet aus an die vom Browser an den Tomcat übertragenen Daten zu kommen?



browser = http, wie du an die daten kommst steht oben


----------



## SchlechterInformatiker (13. Mrz 2009)

Ja aber wenn es nun eines von den anderen Programmen ist, die Kontakt zu meinem Servlet aufnehmen, dann ist es eben kein Http, sondern ein anderes, selber entwickeltes Protokoll. Und das will ich mit dem Servlet auch entgegennehmen können.


----------



## HLX (13. Mrz 2009)

SchlechterInformatiker hat gesagt.:


> GET / HTTP/1.1
> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
> Accept-Language: de
> UA-CPU: x86
> ...


Das ist ein HTTP-Header. Die Infos daraus bekommst du nur über ein HttpServletRequest-Objekt, Methode getHeader(headerName). Somit brauchst du ein HttpServlet.

Java 2 Platform EE v1.3: Class GenericServlet:


> GenericServlet implements the Servlet and ServletConfig interfaces. GenericServlet may be directly extended by a servlet, *although it's more common to extend a protocol-specific subclass such as HttpServlet.*


----------



## SchlechterInformatiker (13. Mrz 2009)

> Zitat:
> Zitat von SchlechterInformatiker Beitrag anzeigen
> GET / HTTP/1.1
> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
> ...



Das war ja auch nur ein Beispiel! Ich weiß dass das ein Http Header ist. Und wenn ich ein eigenes Protokoll implementieren möchte, sieht das aber ansers aus, ganz anders. Und zwar dermaßen anders, dass es ein Servlet, der von HttpServlet ableitet, sicher nicht damit umgehen kann. Deswegen will ich ja selber diese Header-Daten von meinem eigenen Protokoll auswerten. Und um diese Daten auswerten zu können, muss ich erst mal an die Daten ran.


Nochmal: Mein Servlet soll neben dem Http Protokoll auch noch ein anderes, selber entwickeltes Protokoll verstehen. Das heißt ja, dass wenn mein Servlet Daten empfängt, ich die selber auswerten muss und dann selber erkenne, ob es nun eine Http-Anfrage war oder was anderes. Ich muss also irgendwie an die empfangenen Daten ran um sie analysieren zu können! 

Aber wie??


----------



## HLX (15. Mrz 2009)

Dann musst du das extrahieren der Informationen wohl selbst implementieren. Besorg dir doch mal den Quellcode vom Tomcat und von dessen Servlet-API, dann siehst du, wie dort der Header etc. extrahiert wurde.


----------



## SchlechterInformatiker (16. Mrz 2009)

Also gut, dann mach ich das wohl anders als geplant.

Danke


----------

