# Problem mit Servlet



## siba (14. Jul 2006)

Hallo!


Untenstehendes jsp wird an ein Servlet weitergeleitet, das eine Formularüberprüfung durchführen soll! Sollte das Feld leer sein, soll es eine Fehlermeldung bringen und ansonsten soll der Produktname gespeichert werden. Aber irgendwie tut es weder das eine noch das andere. Was mache ich falsch?



```
<%@page language="java"	%>

<%@page contentType="text/html"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 


<html>
    <head>
    <link rel="stylesheet" href="Styles/stil.css" type="text/css">
        <title>Produkteingabe</title>
    </head>
    <body>
        <form name="Produkteingabeformular" action="<%= request.getContextPath() %>/ProduktServlet" method="GET">
            <table>
                <tr>
                    <td>Produktname</td>
                    <td><input type="text" name="Produktname" /></td>
                </tr>
                
                <tr>
                    <td colspan="2" align="center"><input type="submit" name="Eingabe" value="Eingabe" class="button" /></td>
                </tr>
            </table>
        </form>  
    </body>
</html>
```



```
package Servlets;

import Daten.Produktdaten;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import Klassen.Produkt;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ProduktServlet extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.getSession().removeAttribute("errors");

		Map errors = new HashMap();
		Produkt newProduct = null;

		String name = null;
            
		

		if (request.getParameter("Eingabe") != null) {

			if (request.getParameter("Produktname") != null
					&& request.getParameter("Produktname").length() > 0) {
				name = request.getParameter("Produktname");
			} else {
				errors.put("name", "Produktname fehlt!");
                                    System.out.println("Produktname fehlt!");
			}
			
			if (errors.size() > 0) {

				request.getSession().setAttribute("errors", errors);
				Produkt errorProduct = new Produkt();
				errorProduct.setName(name);
				
			} else {
				newProduct = new Produkt();		
				newProduct.setName(name);
				
				System.out.println("Neues Produkt angelegt: " + newProduct);

				Produktdaten dao = new Produktdaten();
				dao.speichern(newProduct);
			}
		} 
	}
   }
```


----------



## Ralf Ueberfuhr (14. Jul 2006)

Beim schnellen Drüberfliegen solltest du nicht den Request-Parameter "Eingabe", sondern "Produktname" im Servlet auslesen.

Dem Button einen Value zu geben ist nicht sinnvoll, bzw. kannst du dafür auch gleich den neueren <button>-Tag verwenden.


----------



## siba (14. Jul 2006)

Dies hat leider nicht den gewünschten Effekt!


----------



## Ralf Ueberfuhr (14. Jul 2006)

Ok, das war auch Blödsinn, zumindest, was den Parameter im Servlet angeht.

--> Wo hast du denn den entsprechenden Tag in deiner JSP?
--> Auf welche JSP leitet dein Servlet denn weiter? Sollte ja im Fehlerfall wieder deine o.g. JSP sein.
--> Was soll im Erfolgsfall passieren? Eine Bestätigungsseite? Falls du dann auch auf o.g. JSP weiterleitest, und er den Namen anzeigen soll, musst du das Input-Feld mit dem eingegebenen Wert füllen.

Was heißt denn, dass er es nicht speichert? Woran erkennst du es? Solltest du zumindest newProduct dann nicht in der Session ablegen, um es auf ner JSP wieder auszulesen?

Oder leitest du auf eine Übersicht weiter, die alle Produkte anzeigt und dafür erneut auf die Datenbasis zugreift? Falls Letzteres, liegt es wohl nicht an der JSP oder am Servlet, sondern an der speichern(...)-Methode.


----------



## siba (14. Jul 2006)

Also, eigentlich in ferner Zukunft  sollte das Servlet im Fehlerfalle wieder zu diesem jsp führen! Aber im Moment funktioniert nicht einmal folgendes:


```
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
                                 
                                 Produktdaten produktdaten = new Produktdaten();
                                 Produkt produkt = new Produkt();
                                 produkt.setName(request.getParameter("Produktname"));
                                 //oder:produkt.setName("neu");
                                 produktdaten.speichern(produkt);
}
```

An der speichern-Methode liegt es nicht, habe ich bereits gestest! Ich habe obenstehenden Code in eine andere Klasse kopiert und mit produkt.setName("neu") ausprobiert und "neu" wurde gespeichert!  Der Befehll request.getParameter("Produktname")); gibt auch die den eingegebenen Namen wieder, wenn man es in eine HTML-Seite verpackt! Also landet meine jsp-Seite samt dem Prdouktnamen im richtigen Servlet, aber das war es! So jetzt bin ich mit meinem Latein ein bißchen am Ende!


----------



## Ralf Ueberfuhr (14. Jul 2006)

Und wo bleibt da die Weiterleitung per Dispatcher auf eine Folgeseite? Im Moment bearbeitest du die Anfrage, gibst aber keine Antwort an den Client zurück.


Ich glaube der Befehl hieß

```
getServletContext(). getRequestDispatcher(jspUrl).forward(request, response);
```


----------



## siba (17. Jul 2006)

Was macht ein Dispatcher und wo genau und wie genau muß er hin?


----------



## Ralf Ueberfuhr (17. Jul 2006)

Der Dispatcher sorgt für eine Weiterleitung von einer J2EE-Komponente zu einer anderen. Wenn du nur das Servlet aufrufst, dann arbeitet es seine Zeilen Quellcode ab und fertig. Wenn du dem Client ne Antwort geben willst, dann entweder über diesen OutputStream (response.getWriter()) oder durch Weiterleiten auf eine JSP oder evtl. ein anderes Servlet.

Die Zeile

```
request.getRequestDispatcher("meineNaechsteSeite.jsp").forward(request, response);
```
muss demzufolge dort stehen, wo dein Servlet fertig ist mit der Abarbeitung des requests. Da du zwischen Erfolg und Misserfolg unterscheidest, kommt diese Zeile wohl 2mal rein, mit unterschiedlichen Weiterleitungszielen.

Also dein Code mit den Weiterleitungen:

```
if (errors.size() > 0) {

            request.getSession().setAttribute("errors", errors);
            Produkt errorProduct = new Produkt();
            errorProduct.setName(name);
            request.getRequestDispatcher("eingabeSeite.jsp").forward(request, response);

            
         } else {
            newProduct = new Produkt();      
            newProduct.setName(name);
            
            System.out.println("Neues Produkt angelegt: " + newProduct);

            Produktdaten dao = new Produktdaten();
            dao.speichern(newProduct);
            request.getRequestDispatcher("erfolgsSeite.jsp").forward(request, response);

         }
```


----------



## siba (17. Jul 2006)

Hat dies den gleichen Effekt wie response.sendRedirect(request.getContextPath() + "/erfolgsSeite.jsp");? 

Aber es bleibt immer noch das Problem, daß mein Produkt nicht gespeichert wird! Das Produkt sollte in einem txt-File gespeichert werden mithilfe eines ObjectOutputStream. Die Klasse Produktdaten, die dies tun soll, funktioniert auch, aber nicht mit meinem Servlet! Brauche ich hierfür einen Listener?
Und wenn ja, wie sollte dieser aussehen?


----------



## Ralf Ueberfuhr (17. Jul 2006)

Also ich bin kein J2EE-Experte, auch erst seit 5 Wochen im Gebiet tätig.

response.sendRedirect(...) könnte denselben Effekt haben, ich bin mir aber nicht sicher, ob es wirklich dasselbe ist. Die Javadocs werden es verraten. Unterschiede könnte es bezüglich der Parameter geben (z.B. läuft alles in einem Request ab oder sind es dann 2).

Wenn dein Produkt nicht gespeichert wird, dann liegt es wohl daran, dass du aufs Dateisystem zugreifst. Aus einem J2EE-Container hast du aber nicht die Rechte für diesen Schreibzugriff. Schau mal evtl. unter JCA (J2EE Connector Architecture) nach. Vielleicht äußert sich diesbezüglich auch mal jemand anderes im Forum.


----------



## KSG9|sebastian (17. Jul 2006)

- Wird die doGet bzw. doPost-Methode aufgerufen?
- Wie sieht die speichern-Methode der Produktdaten aus?Wenn du auf eine Textdatei im Dateisystem Zugreifen willst dann:

# leg die .txt-Datei in deinem Webprojekt an
# greif mittels super.getServletContext().getRealPath("meineTextdatei.txt"); drauf zu
# Kann sein dass die Textdatei nur temporär besteht.

Einfach nach dem Speichern den Pfad (super.getServletContext()...) ausgeben und schauen ob die Datei geschrieben wurde.

Gruß


----------



## siba (17. Jul 2006)

Ich habe sie inzwischen gefunden! Sie liegt im bin-Verzeichnis von Tomcat! Trotzdem vielen Dank an Euch alle!


----------

