XMLHttpRequest() scheint nicht zu funktionieren

Klopfer

Mitglied
Hi zusammen,

also ich mache jetzt schon seit 3 tagen an dem Code rum und ich finde den Fehler nicht. Ich bin jetzt garantiert 20 Mal den Code auf schreibfehler oder sonst was was mir auffällig erscheint durchgegangen aber ich finde einfach keinen fehler. Ich bin anfänger und habe mit das Buch "Ajax und Java" zugelegt. Mein Problem ist, dass ich schon am ersten beispiel gnadenlos scheitere.

Die Funktion soll nichts anderes machen als den Buchstaben oder die Zahl die ich eingebe in den Dezimalwert umrechnen.

Hier mal der Code.

index.html
Code:
<html>
<head>
	<link rel="stylesheet" type="text/css" href="style.css">
	<SCRIPT language="Javascript" src="ajax.js"></SCRIPT>
	<title>Ajax mit Java, Kapitel 2, JavaScript für Ajax-Beispiel</title>
</head>
<body onload="focusIn();">
	<h1> AJAX-ZEICHENDEKODIERER </h1>
	<h2> Drücken Sie eine Taste um ihren Wert zu ermitteln. </h2>
	<table>
		<tr>
			<td>
				Geben Sie hier die Taste ein -> <input type="text" id="key" name="key" onkeyup="convertToDecimal();">
			</td>
		</tr>
	</table>
	<br>
	<table>
		<tr>
			<td colspan="5" style="border-bottom:solid black 1px;">
				Gedrückte Taste:
				<input type="text" readonly id="keypressed">
			</td>
		</tr>
		<tr>
			<td> Dezimal </td>
		</tr>
		<tr>
			<td><input type="text" readonly id="decimal"></td>
		</tr>
	</table
</body>
</html>

ajax.js
Code:
var req;

function convertToDecimal() {
	var key = document.getElementById("key");
	var keypressed = document.getElementById("keypressed");
	keypressed.value = key.value;
	var url = "/ajaxcharacterconverter/response?key=" + escape(key.value);
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	}	else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	req.open("Get",url,true);
	req.onreadystatechange = callback;
	req.send(null);
}

function callback() {
	if (req.readyState==4) {
		if (req.status == 200) {
			var decimal = document.getElementById('decimal');
			decimal.value = req.responseText;
		}
	}
	clear();
}

function clear() {
	var key = document.getElementById("key");
	key.value="";
}

function focusIn() {
	document.getElementById("key").focus();
}

AjaxResponseServlet.java
Code:
/*
*Wandelt ein Zeichen in sein Dezimalwert um
* und sendet den Wert in einer Antwort zurück.
*
*/
package com.oreilly.ajax.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class AjaxResponseServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		
		String key = req.getParameter("key");
		if (!key.equals("")) {
			// das erste Zeichen aus key als int herausziehen
			// und diesem int dann in einen String umwandeln
			int keychar = key.charAt(0);
			String decimalString = Integer.toString(keychar);
			// die Antwort einrichten
			res.setContentType("text/plain");
			res.setHeader("Cache-Control", "no-chache");
			// den Antwort-String ausgeben
			res.getWriter().write(decimalString);
		}	else {
			// wenn key leer ist, wird ein Fragezeichen zurückgeliefert
			res.setContentType("text/plain");
			res.setHeader("Cache-Control", "no-cache");
			res.getWriter().write("?");
		}
	}
}

build.xml
Code:
<?xml version="1.0"?>
<project name="CH03 AJAX-CODECONVERTER" default="compile" basedir=".">

	<property environment="env"/>
	<property name="src.dir" value="src"/>
	<property name="war.dir" value="war"/>
	<property name="class.dir" value="${war.dir}/WEB-INF/classes"/>
	<property name="lib.dir" value="${war.dir}/WEB-INF/lib"/>
	<property name="webapp.dir" value="${env.TOMCAT_HOME}/webapps/ROOT/ajaxcharachterconverter"/>
	
	<path id="ajax.class.path">
		<fileset dir="${lib.dir}">
			<include name="*.jar"/>
		</fileset>
	</path>
	
	<target name="init">
		<mkdir dir="${class.dir}"/>
	</target>
	
	<target name="compile" depends="init" description="Kompiliert den gesamten Quellcode.">
		<javac srcdir="${src.dir}" destdir="${class.dir}" debug="on" classpathref="ajax.class.path"/>
	</target>
	
	<target name="clean" description="Loescht den Inhalt des Verzeichnisses classes">
		<delete dir="${class.dir}"/>
	</target>
	
	<target name="deploy" depends="compile" description="Kopiert den Inhalt der Webanwendung in das Zielverzeichnis">
		<copy todir="${webapp.dir}">
			<fileset dir="${war.dir}"/>
		</copy>
	</target>
</project>

web.xml
Code:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
	<servlet>
		<servlet-name>AjaxResponseServlet</servlet-name>
		<servlet-class>
			com.oreilly.ajax.servlet.AjaxResponseServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>AjaxResponseServlet</servlet-name>
		<url-pattern>/response</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcom-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

die Style.css hab ich weggelessen, die ist eh uninteressant.
Wenn ich das ganze mit ant deploy ausführe, macht mir ant aus der .java eine .class und verschiebt auch alles in den webapps Ordner im Tomcat. Ihc kann die Seite dann aufrufen über localhost aber die umrechnung in Dezimal findet nicht stattt.

Über eine Hilfe wäre ich echt dankbar. Ich hab jetzt schon ettliche Stunden gegooglet und Foren bis zum ende durchsucht, ich weiß langsam echt nimmer weiter. :(
Kann es vielleicht eine falsche Konfiguration von Tomcat sein?

Gruß Fabian
 
Moin Klopfer,

also von Javascript-Seite aus funktioniert da alles, der Request wird gesendet, und auch in das Feld eingetragen... es ist daher ein Problem auf Serverseite wahrscheinlich.

Denkbar wäre bspw., dass die URL nicht stimmt, oder mit einem anderen Statuscode geantwortet wird als 200.
Falls du Firebug verfügbar hast, kannst du es dort unter "Netzwerk" bequem überprüfen, was gesendet wird und ob wer wie antwortet.

Liebe Grüsse an Bambi :)
 
Moin Sven,

den Gruß werd ich ausrichten :p

Danke für Deine Hilfe, mit Firebug bin ich jetzt schonmal etwas weiter.
http://localhost:8080/ajaxcharacterconverter/response?key=a liefert mir 404 zurück -> Not found.

Was mich an dem ganzen script Stört bzw mir nicht ganz geheuer ist. Woher weiß das Script, dass er auf die AjaxResponseServlet.class zurückgreifen soll?
Diese ist ja nirgends verlinkt und befindet sich ja auch in einem anderen Ordner.
Es gibt ja nirgends einen Eintrag der auf WEB-INF/web.xml (in der der Zielordner der Class angegeben ist) bzw direkt auf die .class verweißt.

Gruß Fabian
 
Dazu kann ich dir mangels JAVA-Kenntnisse leider nichts sagen.

Für den Javascript-Part ist es halt entscheidend, was eine Anfrage an /ajaxcharacterconverter/response zurückliefert. Wie du den Server oder JAVA dazu bekommst, das Gewollte zu Tun, enzieht sich meiner Kenntnis :-(

Im JAVA-Forum dürfte dir dabei evtl. besser geholfen werden können.
 
Hallo,

dein Tomcat macht genau das was er soll. Dein Deployment in der build.xml passt allerdings nicht so richtig.
Code:
<property name="webapp.dir" value="${env.TOMCAT_HOME}/webapps/ROOT/ajaxcharachterconverter"/>
Damit verschiebst du die Files in eine bestehende Webapplikation. Insbesondere liegt deine web.xml jetzt in einem Verzeichniss (/ROOT/ajaxcharachterconverter/WEB-INF/), wo sie nicht ausgewertet wird, und damit wird dein Servlet auch nicht aktiv". Deploy das ganze mal in eine eigene Webapplikation, also
Code:
<property name="webapp.dir" value="${env.TOMCAT_HOME}/webapps/ajaxcharachterconverter"/>

hth
THMD
 
Zurück