servus,
allgemeine angaben:
- benutze Tomcat 6.0.29
- habe in der web.xml die servlet-api-2.5 festgelegt (siehe web.xml unten)
ich habe folgendes Problem:
ich habe ein Applet auf dem tomcat, welches durch eine Methode ein serialized-object an ein servlet übergibt und dort das String-Vektor-Objekt in einer Text-datei auf dem Server abgespeichert werden soll.
Dazu sollte mit folgenden Zeilen die doPost-methode des servlets aufgerufen werden und das objekt 'weggeschrieben' werden:
(diese Zeilen sind innerhalb einer Methode des Applets, welche durch eine Button-Action ausgeführt werden)
hier ist mein SaveServlet-code:
meine web.xml:
[XML]
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>TestServlet</display-name>
<description>Welcome to MyTestServlet</description>
<servlet>
<servlet-name>save</servlet-name>
<servlet-class>SaveServletNeu</servlet-class>
<servlet-name>load</servlet-name>
<servlet-class>LoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>save</servlet-name>
<url-pattern>/save</url-pattern>
<servlet-name>load</servlet-name>
<url-pattern>/load</url-pattern>
</servlet-mapping>
</web-app>
[/XML]
Dabei sind mir ein paar dinge noch ein wenig unklar:
hat jemand deshalb evtl. ein gutes, vollständiges (alle kleinen schritte umfassend) tutorial, wie man die applet-servlet-kommunikation auf dem tomcat realisert (also wo servlet, applet, web-inf etc. liegen müssen, worauf in der web-xml geachtet werden muss)
oder
kann mir evtl die grundsätzlichen beziehungen (der oben genannten probleme), welche man bei der realisierung beachten muss, erläutern?
allgemeine angaben:
- benutze Tomcat 6.0.29
- habe in der web.xml die servlet-api-2.5 festgelegt (siehe web.xml unten)
ich habe folgendes Problem:
ich habe ein Applet auf dem tomcat, welches durch eine Methode ein serialized-object an ein servlet übergibt und dort das String-Vektor-Objekt in einer Text-datei auf dem Server abgespeichert werden soll.
Dazu sollte mit folgenden Zeilen die doPost-methode des servlets aufgerufen werden und das objekt 'weggeschrieben' werden:
(diese Zeilen sind innerhalb einer Methode des Applets, welche durch eine Button-Action ausgeführt werden)
Java:
URL servletURL=New URL("http://hierStehtDieServerAdresse/save");
URLConnection connectToServlet = null;
try {
connectToServlet = servletURL.openConnection();
} catch (IOException e) {
System.err.println("I/O Error when creating an URLConnection");
}
connectToServlet.setDoOutput(true);
connectToServlet.setRequestProperty("Content-Type",
"application/x-java-serialized-object");
ObjectOutputStream urlOutput = new ObjectOutputStream(connectToServlet
.getOutputStream());
// obj ist hier das serialized-object
urlOutput.writeObject(obj);
urlOutput.flush();
urlOutput.close();
hier ist mein SaveServlet-code:
Java:
public class SaveServlet extends HttpServlet {
private void storeData(Vector<String> simulatedData) {
String fileName = getServletContext().getRealPath("").concat(
"/AppletValues.txt");
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fileName));
} catch (IOException e) {
System.err.println("Server -> I/O Problem: generate Writer");
}
try {
for (Iterator<String> iterator = simulatedData.iterator(); iterator
.hasNext();) {
writer.write((String) iterator.next());
writer.newLine();
}
} catch (IOException e) {
System.err.println("Server -> Write Problem: write in file");
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
System.err.println("Server -> I/O Problem: close file");
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
/**
* public abstract class javax.servlet.ServletInputStream extends
* java.io.InputStream
*/
ServletInputStream in = null;
try {
in = request.getInputStream();
} catch (IOException e) {
System.err.println("I/O Problem: ServletInputStream");
}
ObjectInputStream objReader = null;
try {
objReader = new ObjectInputStream(in);
} catch (IOException e) {
System.err
.println("Filter Problem: ObjectInputStream(ServletInputStream)");
}
Vector<String> simulatedData = null;
try {
simulatedData = (Vector<String>) objReader.readObject();
} catch (IOException e) {
System.err.println("Server -> Read Problem: serialized Object");
} catch (ClassNotFoundException e) {
System.err
.println("Server -> Read Problem: object data type not available");
}
storeData(simulatedData);
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
System.err
.println("Server -> Write Problem: response in OutputStream");
}
out.println("data saved");
out.close();
} // doPost(...)
}
meine web.xml:
[XML]
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>TestServlet</display-name>
<description>Welcome to MyTestServlet</description>
<servlet>
<servlet-name>save</servlet-name>
<servlet-class>SaveServletNeu</servlet-class>
<servlet-name>load</servlet-name>
<servlet-class>LoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>save</servlet-name>
<url-pattern>/save</url-pattern>
<servlet-name>load</servlet-name>
<url-pattern>/load</url-pattern>
</servlet-mapping>
</web-app>
[/XML]
Dabei sind mir ein paar dinge noch ein wenig unklar:
- ich habe auf dem Tomcat in dem webApps-ordner meine WEB-INF-datei, in der ich die oben stehende web.xml und das saveservlet in dem classes-ordner habe. mein applet liegt in einem unterorder von webapps mit der aufrufbaren html-datei. mir ist hier unklar, wie der aufruf der der doXXX-Methode geschieht. also was im hintergrund der connectToServlet.getOutputstream()-Methode passiert. ist dies überhaupt die verbindung zum servlet???
- falls ich die URL eines Servlets aufrufe, in welchem (in doGet und doPost steht das gleiche) nur "test" ausgegeben wird, kommt der Fehler 'HTTP status 404' und folgende beschreibung: The requested resource (/info) is not available.
- mein Applet kann nicht aufgerufen werden, wenn dies nicht in einem unterordner von webapps liegt. warum ist dies so organisiert? Dies verhindert ein URL-aufbau durch die getDocumentbase()-methode, der ich den '/save'-zusatz an die url mit concat(...) anheften wollte.
- ich musste bis jetzt immer meine updates des applets umbenennen (applet-klasse sowie damit zusammenhängend die .jar-datei), damit er nicht eine alte version im browser aufruft, welche bereits mit der neuen version überschrieben wurde. müsstes da nicht ein neustarten des tomcats reichen, damit er weis, dass eine neue version vorliegt?
hat jemand deshalb evtl. ein gutes, vollständiges (alle kleinen schritte umfassend) tutorial, wie man die applet-servlet-kommunikation auf dem tomcat realisert (also wo servlet, applet, web-inf etc. liegen müssen, worauf in der web-xml geachtet werden muss)
oder
kann mir evtl die grundsätzlichen beziehungen (der oben genannten probleme), welche man bei der realisierung beachten muss, erläutern?