HTTP Zeilenumbrüche aus HTML-Textarea entfernen

Xendarii

Mitglied
Hallo, liebe Forengemeinde.

Für die Uni musste ich in diesem Semester schon einen (sehr abgespeckten) XML-Parser schreiben, den wir jetzt auch Netzwerkebene zum Laufen bringen sollen. Soweit funktioniert auch alles ganz prima, Tomcat läuft, lässt sich ansprechen, die Kommunikation der Servlets untereinander klappt... jetzt will ich den XML-Code auf unserer HTML-Seite mit einer Textarea einlesen lassen, bei der Übertragung wird der Inhalt der Textarea als Parameter mitgegeben, also auch schon übertragen, damit ich ihn benutzen kann.

Das Problem: Wenn ich den XML-Code in der Textarea mit Zeilenumbrüchen trenne, sendet er die als "%0A%0D" auch mit - und genau da kommt dann das Problem. Ich brauche nämlich in meinem Code einen StringBuilder, den ich aus dem Array, das ich mit request.getParameterValues() bilde. In diesen StringBuilder integriert er auch die Leerzeichen, die ich da dann aus irgendeinem Grund nicht mehr rausbekomme. Hab schon versucht, ihn in einen String umzuwandeln und da ganz einfach die "\n" zu ersetzen, was allerdings nichts gebracht hat.

Kann mir jemand weiterhelfen? Die Zeilenumbrüche sorgen leider dafür, dass mein Parser das XML-Dokument nicht mehr als richtig erkennt und ich würde ihn ungern komplett umschreiben, zumal ich jetzt auch keinen Ansatz hätte, wie genau ich das bewerkstelligen müsste.
 
Wenn du die Eingabe der Textarea bereits in einem String hast, helfen Dir Regexes. Was Du willst, ist alle Trennzeichen (Leerzeichen, Tabs, Zeilenumbrüche) zwischen den Tags (und zwar nur da) zu entfernen. Folgender Codeschnipsel als Ansatz:
Java:
private static final Pattern SEPARATORS_BETWEEN_TAGS = Pattern.compile(">(\\s+?)<");

static String eraseSeparatorsBetweenTags(final String withSeparators) {

  final Matcher matcher = SEPARATORS_BETWEEN_TAGS.matcher(withSeparators);
    
  final String noSeparators = matcher.replaceAll("><");

  System.out.println(noSeparators);

  return noSeparators;
}
Das geht zwar auch mit String.replaceAll. Da es aber eine sich wiederholende Operation ist, macht es Sinn, das Pattern einmal zu compilen und immer wieder zu verwenden.
 
Ich hab ein neues Problem. Merkwürdigerweise - denn bis eben lief das Programm noch einwandfrei.

Ich lasse mir von meinem HTML-Dokument den Wert eines bestimmten Parameters übergeben, das ist nämlich der Inhalt der Textarea, in die das XML-Dokument geschrieben werden soll.
Bis eben hat das wunderbar geklappt - jetzt bekomme ich plötzlich eine NullPointer-Exception, wenn ich auf das Array zugreifen will, dabei habe ich am Code eigentlich gar nichts geändert. Sieht irgendjemand einen Fehler? Das Servlet, in dem sich der Code-Teil befindet, ist das erste Servlet, das vom HTML-Dokument aufgerufen wird und der Teil befindet sich sogar ganz oben in der doGet-Methode, das heißt, vorher wird kein anderer Code ausgeführt...

Java:
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		syntaxCheck = false;
		xmlBuild = false;
		dom2Build = false;
		
		String[] sA = request.getParameterValues("xml-code");
		
		Enumeration<String> e = request.getParameterNames();
		while(e.hasMoreElements()) {
			String s = e.nextElement();
			if(s.equals("checkXML")) syntaxCheck = true;
			else if(s.equals("buildXML")) xmlBuild = true;
			else if(s.equals("buildDOM")) dom2Build = true;
		}
		
		initialize(request, response);
		
	}
 
Ideen:
- Der Code steht in der doGet-Methode. Formulare werden eher gepostet. Ist bei Dir jetzt Absicht oder evtl. ein Fehler?
- Falls Absicht, schau Dir mal die Request-URL an. Dort müsste der Parameter namens "xml-code" ja auftauchen.
- "xml-code" ist der Name der Textarea. Vielleicht hast du im html-Code was verfuddelt? Du iterierst ja über alle parameternamen. Mach an der Stelle doch einen System.out.println, um zu sehen ob der Parameter überhaupt dabei ist.
 
Danke für die Antwort erst einmal.

Es geht momentan wirklich nur um die eine Zeile mit dem String-Array. Die drei Variablen in der Enumeration sind vorhanden - und auch der Parameter "xml-code" existiert, das habe ich schon nachgeprüft, nur die getParameterValues-Methode wirft, wie gesagt, eine NullPointerException. Normalerweise befindet sie sich auch in einem anderen Servlet, ich habe sie hierhin ausgelagert, um zu überprüfen, ob der Fehler an einer anderen Stelle im Code liegt, aber das tut er wie gesagt nicht, weil schon hier, wenn ich mir die Werte ausgeben lasse, einfach gar nichts erscheint. Parameter existiert also, hat aber keinen Wert und ich hab echt keine Ahnung, wieso. Kann auch nicht am HTML-Dokument liegen, das ist unverändert und wenn ich in die Textarea "<root>" eingebe, sollte ja irgendwas übergeben werden - eigentlich...
 
nur die getParameterValues-Methode wirft, wie gesagt, eine NullPointerException.
Kann sein, dass Du es etwas unglücklich formuliert hast und es nicht so meintest. Aber es ist nahezu ausgeschlossen, dass diese Methode eine NullPointerException wirft (außer vielleicht, wenn Du als Parameternamen null übergibst). Diese Methode kann aber durchaus null returnen. Das tut sie, wenn der Parametername im Request nicht vorkommt. Das ist die einzige in Frage kommende Ursache. Auch wenn Du im Moment noch glaubst, dass er doch drinnen ist. Er ist es nicht. Nach dem Grund dafür musst Du forschen.
 
Also - ja, stimmt, im normalen Betrieb wirft sie die nicht, erst im Debug-Modus. Ich hab jetzt mal Folgendes gemacht:

Java:
PrintWriter out = response.getWriter();
		Enumeration<String> g = request.getParameterNames();
		while(g.hasMoreElements()) {
			String s = g.nextElement();
			out.println(s);
		}
		String[] sA = request.getParameterValues("xml-code");
		for(String s: sA) {
			out.println(s);
		}
		Enumeration<String> f = request.getParameterNames();
		while(f.hasMoreElements()) {
			String s = f.nextElement();
			out.println(s);
		}

Und ich bekomme folgende Ausgabe:

xml-code xml-code

=> die Parameter sind vorhanden - aber ich kriege keinen Wert...
 
Ok, jetzt kommen wir der Sache schon näher. Der Parameter ist also da er enthält nur keinen Wert. Hier hängt es jetzt von der Implementierung des Webcontainers ab, was der draus macht. Jetty returnt für so einen Parameter null, Tomcat einen leeren String (glaube das war so...).

Das beantwortet natürlich noch nicht die Frage, wieso der Wert nicht ankommt. Das kann viele Ursachen haben, von fehlerhaftem Html-Code über Webfirewalls, die Sonderzeichen aus Requests rausfiltern (Stichwort XSS), irgendwelchen Forward- oder Redirectregeln und und und. Eine Analyse aller dieser Faktoren wird über ein Forum glaube ich schwierig.

P.S. Die Ausgabe zu dem von Dir gezeigten Code dürfte wohl eher:
Code:
xml-code
xml-code
sein.
 
Dann ist halt nur die Frage, warum es vor zwei Stunden noch einwandfrei funktioniert hat und jetzt nicht mehr... ich hab in der Zwischenzeit nicht einmal den PC neu gestartet... extrem ungünstig, weil morgen Abgabe ist und ich jetzt echt ratlos bin.

Wie auch immer - danke für die Hilfe. Dass du mir nicht weiterhelfen kannst, ist logisch, wenn es an solchen Faktoren liegt.

Und nein, die Ausgabe ist tatsächlich in einer Zeile.
 
Neue Erkenntnis: Normalen Text kann ich in das Fenster schreiben, den krieg ich im Servlet dann auch ausgegeben - nur bei Tags scheint er irgendwie keine Lust zu haben. Also:

Hallo => geht

<Hallo> => geht nicht

Obwohl's vorher funktioniert hat. Woran kann das liegen? Oo
 

Neue Themen


Zurück
Oben