# XMLHttpRequest() scheint nicht zu funktionieren



## Klopfer (1. Mai 2009)

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

```
<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

```
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

```
/*
*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

```
<?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

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


----------



## Sven Mintel (2. Mai 2009)

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


----------



## Klopfer (2. Mai 2009)

Moin Sven,

den Gruß werd ich ausrichten 

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


----------



## Sven Mintel (3. Mai 2009)

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.


----------



## Klopfer (3. Mai 2009)

OKi, werde mich dort mal hinwenden.
Gruß Fabian


----------



## Maik (3. Mai 2009)

Klopfer hat gesagt.:


> OKi, werde mich dort mal hinwenden.


Moin,

es ist nicht nötig, die Frage dort erneut zu stellen, da das Thema von mir in den "Java"-Bereich umgeleitet wird, um mögliche "Crosspostings" in zwei Forenbereichen zu vermeiden.

mfg Maik


----------



## THMD (3. Mai 2009)

Hallo,

dein Tomcat macht genau das was er soll. Dein Deployment in der build.xml passt allerdings nicht so richtig.

```
<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

```
<property name="webapp.dir" value="${env.TOMCAT_HOME}/webapps/ajaxcharachterconverter"/>
```

hth
THMD


----------



## Klopfer (3. Mai 2009)

Cool  endlich mal ein erfolgserlebnis für heute 
Danke für Deine Hilfe

Gruß Fabian


----------

