Servlet InputStream leer?!

Status
Nicht offen für weitere Antworten.
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?

Code:
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);
	}	
}
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

Gast
mach mal extends HttpServlet oder schreibe dir deine eigene implementierung...
 
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.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:
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

Top Contributor
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
 
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.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

Gast
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
 
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!
 
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

Top Contributor
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
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.
 
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, */*
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.64
Host: localhost:6000
Connection: Keep-Alive

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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Encera Servlet Mapping Netzwerkprogrammierung 5
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
D Response in Java Servlet erzeugen Netzwerkprogrammierung 0
C Servlet erstellen klappt nicht Netzwerkprogrammierung 3
S HTTP Servlet als Instanzen im Programm starten Netzwerkprogrammierung 3
H Reponse vom Servlet leer Netzwerkprogrammierung 16
H Servlet Umlaute Netzwerkprogrammierung 20
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
F Kann Klasse nicht zu Servlet casten Netzwerkprogrammierung 5
S send riesige "Query" to servlet Netzwerkprogrammierung 7
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
N Servlet Response fehlerhaft Netzwerkprogrammierung 14
E RMI - Servlet Netzwerkprogrammierung 4
D Apache Mina und GWT Servlet Netzwerkprogrammierung 4
B Pdf Stream von Servlet mit itext Netzwerkprogrammierung 12
M Servlet als Login Netzwerkprogrammierung 20
B HTTP PDF Servlet download vom Server zum Client Netzwerkprogrammierung 3
B HTML meets Servlet Netzwerkprogrammierung 6
J ObjectOutputStream legt Servlet lahm Netzwerkprogrammierung 7
H Objekt von JSP an Servlet übergeben Netzwerkprogrammierung 4
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
H kleines Servlet Problem Netzwerkprogrammierung 2
N Servlet-RMI Kommunikation Netzwerkprogrammierung 8
D Verbindung über ein Servlet zu einem Server Netzwerkprogrammierung 4
Paule Connection Applet Servlet ohne Socket bzw RMI Netzwerkprogrammierung 2
R Problem mit Servlet ansprechen Netzwerkprogrammierung 7
B Servlet URL aufruf Netzwerkprogrammierung 4
R Servlet Komunikations Problem Netzwerkprogrammierung 4
D Einfache Applet-Servlet-Kommunikation Netzwerkprogrammierung 5
A JSP->Servlet->Programm (Ausführung) -> Servlet -&gt Netzwerkprogrammierung 2
M Servlet - Applet Kommunikation Netzwerkprogrammierung 3
R Java Applikation als Client ,Servlet als Server: Problem? Netzwerkprogrammierung 3
Z dateidownload vom servlet aus Netzwerkprogrammierung 4
T Servlet-Programmierung & Templates Netzwerkprogrammierung 4
T Einfacher Servlet-Server Netzwerkprogrammierung 8
A RMI Servlet Client Netzwerkprogrammierung 6
S object via post auf servlet send und weiter bearbeiten Netzwerkprogrammierung 11
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
R applet servlet kommunikation Netzwerkprogrammierung 2
I Servlet ParameterChaos Netzwerkprogrammierung 2
C Applet <> Servlet Netzwerkprogrammierung 4
K RMI Kommunication zw. Servlet und EJB Netzwerkprogrammierung 7
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
P Inputstream "verfügbar" Netzwerkprogrammierung 4
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2
M Sockets und InputStream Netzwerkprogrammierung 8
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
M InputStream - Bytes gehen verloren? Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
G inputstream hat plötzlich weniger inhalt Netzwerkprogrammierung 8
Z ProgressBar auf BufferedOutput- & -InputStream Netzwerkprogrammierung 2
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben