# JSP/Servlet -> Einzelne Zeilen aus DB in Formular darstel



## sop (6. Dez 2006)

Hallo zusammen!
Ich programmiere eine kleine Webanwendung (JSP, Servlet) mit Datenbankanbindung (MySQL). Es wird eine CSV-Datei ausgelesen und bestimmte Werte werden in die DB geschrieben. Dazu kann man sich natürlich die Werte auch anschauen und verändern.

Ich lese nun die Datenbankeinträge aus und stelle diese in einer Tabelle dar. Weiterhin habe ich bereits hinter jede Zeile einen Druckknopf (Button) eingebaut. Dieser soll dafür sorgen das die besagt Zeile aus der DB ausgelesen wird und in ein Formular (zur Korrektur, Nachtrag, etc.) eingetragen wird.

Feststellung (richtig oder falsch?):
- Ich verweise über den Druckknopf auf dieses Formular (Beispiel: formular.jsp)
- Die formular.jsp liest den Datenbankeintrag aus und füllt die integrierten Formularfelder mit den Datensätzen aus.
- Man kann über formular.jsp die Daten danach ändern, löschen, etc. und erneut abspeichern.

Probleme:
1. Wie bekomme ich die Druckknöpfe derart programmiert, dass jeder Knopf genau weiß, welcher DB-Eintrag gemeint ist und wie verweise ich auf formular.jsp?
Ich dachte daran den Wert des Druckknopfes automatisch mit dem Wert des Primärschlüssel´s zu belegen. Wenn VALUE='1' -> dann auch DB-Eintrag='1'. Frage: Wie implementiere ich das am besten?

2. Gibt es allgemeine Lösungen zu diesem Problem? Es handelt sich ja um einen Fall, den jeder von uns kennt. Hinter einem bestimmten Datensatz hat man die Möglichkeit die Einträge z.B. zu ändern, löschen, ...


Schönen Gruß
Sascha


----------



## SlaterB (6. Dez 2006)

tja, ich würde mir da zunächst nicht allzu viele Gedanken machen,

so ein Button erzeugt einen Request a la
/edit?id=17
anhand dieser Id wird der Datensatz bestimmt 
(aus DB oder Cache, auf jeden Fall eher eine Aufgabe für ein Servlet als eine JSP)
und aus diesen Daten das Formular aufgebaut

komplizierter kann man es machen wenn es mal nötig wird..


----------



## sop (6. Dez 2006)

OK!

Gute Idee!
Wie bekomme ich es nun hin mit dieser ID den genaue Datensatz der DB auszulesen?

Mein Problem ist, dass alle Buttons die selbe ID in der URL entwickeln. 
Kann ich definierte ID´s generieren?

Gruß
Sascha


----------



## SlaterB (6. Dez 2006)

dynamische URLs sind für Buttons mit dynamsicher Bedeutung natürlich unerläßlich 

in JSPs gibt sicherlich viele Schreibweisen,
Button selber kann man ja auch verschieden umsetzen,

aber wenn du eine Zeile pro Datensatz hast, dann wirst du doch irgendwo bei der HTML-Generierung sowas wie eine Schleife und eine Variable für den aktuellen Datensatz haben

dann
<butten href=edit?id=${data.id}>

oder irgendwie sowas in der Art,
wie erzeugst du denn die Anzeige in der Tabelle?


----------



## sop (6. Dez 2006)

OK!


So erzeuge ich die Tabelle:


```
out.println( "<table><tr>" );
      for( int i=1; i<=n; i++ )    // Achtung: erste Spalte mit 1 statt 0
        out.println( "<th>" + rsmd.getColumnName( i ) + "</th>" );
      while( rs.next() )
      {
        out.println( "</tr><tr>" );
        for( int i=1; i<=n; i++ )  // Achtung: erste Spalte mit 1 statt 0
          
          out.println( "<td>"  + rs.getString(i) + "</td>");
          //Erzeugt Button "Ändern" am Ende der Zeile
          out.println( "<td>"  + "<form><input type='submit' name='submit' value='Ändern'></form>" + "</td>");
          //Erzeugt Button "Löschen" am Ende der Zeile hinter "Ändern"
          out.println( "<td>"  + "<form ><input type='submit' name='submit' value='Löschen'></form>" + "</td>");
      }
      
      out.println( "</tr></table></form>" );
```

Die Button´s sollten jetzt natürlich eine eindeutige ID bekommen. In der Datenbank habe ich einen Wert "id"  als Primärschlüssel deklariert; kann man diesen nicht idealerweise nutzen?

thx
Sascha


----------



## SlaterB (6. Dez 2006)

jo den solltest du wirklich nutzen, bisher ist dein Formular ja ganz leer,
da ist doch noch nicht mal die Ziel-JSP angegeben oder wo steht die?


```
int id = // id holen

          out.println( "<td>"  + "<form>"+
              +"<input type='hidden' name='id' value='"+id+"'>"
              +"<input type='submit' name='submit' value='Ändern'></form>" + "</td>");
```

http://de.selfhtml.org/html/formulare/definieren.htm


----------



## sop (7. Dez 2006)

Richtig - ich habe noch keine Zielseite angegeben, weil ich dauernd Kompilierungsprobleme hatte, wenn ich


```
<form action="Ziel.jsp"> [code]

eingebe. Prüfe ich jetzt mal. 

Vorerst danke und bis gleich ;-)

Sascha
```


----------



## sop (7. Dez 2006)

et funzt - thx to SlaterB.

Bin jetzt soweit, dass ich die den Button über die eindeutige ID (aus Datenbank) identifizieren kann. Es wird also 

*beispiel.jsp?id=396&submit=%C4ndern*

in der URL angezeigt.

Weitere Fragen folgen!!!

Gruß
Sascha


----------



## sop (7. Dez 2006)

HI!

Neues Übel. Ich stehe jetzt davor die Anweisung für das Auslesen der Datenbank in das Formular von ziel.jsp umzusetzen.
Ich bin also mit der richtigen ID auf die ziel.jsp gelangt. Wie kann ich nun am besten die Anweisung umsetzen. Ich habe an ein request gedacht, da ja ein <form> im Spiel ist. Nur hab ich keine gute Idee.

Sascha


----------



## SlaterB (7. Dez 2006)

'die Anweisung' klingt so abstrakt,
was ist das Problem?

aus der DB die Daten holen, mit einer Anweisung 'get Daten zu Id id',
und dann Daten anzeigen


----------



## Guest (7. Dez 2006)

Mit Anweisung meinte ich eine if-Anweisung, mit der ich in der _ziel.jsp_ prüfe, ob ein Button ausgelöst wurde. 

Dann würde ich den übergebenen Wert des Buttons ermitteln (wie weiß ich leider noch nicht) und die ID auslesen, damit ich mit diesem Wert dann den Datensatz aus der Datenbank bestimmen kann. Kommt das so hin?
Hatte leider keine wirkliche Lösung!

Wie meintest du das mit der Funktion *getDaten()* ?  Wie und wo kann ich diese einbauen bzw. welche Übergabeparameter muss ich nehmen?


----------



## SlaterB (8. Dez 2006)

nun, Request-Parameter auszulesen ist ja wohl eines der wichtigsten Dinge überhaupt,
um mit dem User zu interagieren 

in der JSP ist das immer ein Krampf, daher interessiert es mich gar nicht wie es da geht,
der richtige Platz ist ein Servlet,
dort
int id = Integer.parseInt(request.getParameter("id"));

und getDaten war abstrakt gemeint,
also eine DB-Anfrage "select * from .. where id = "+id
oder so in der Art, as sollte ja nun nicht mehr die Schwierigkeit darstellen wenn die Id da ist


----------



## sop (8. Dez 2006)

Verstehe!

Alles im Servlet verarbeiten und dann das Ergebnis an die JSP senden. Right?!

Mach ich jetzt !

THX-Sascha


----------



## sop (11. Dez 2006)

Habe ein unverständliches Problem. Die Fehlermeldung lautet:

*Fehler in SQL: java.sql.SQLException: Before start of result set*

Diese entsteht durch folgenden Code:

```
try 
          {
              Class.forName("org.gjt.mm.mysql.Driver");
              String url = "jdbc:mysql://localhost:3306/prepaid";
              Connection con = DriverManager.getConnection(url,"root", "mpt*sven");
              Statement stmt = con.createStatement();
              ResultSet rs  = stmt.executeQuery("SELECT nachname FROM kunde WHERE id = '"+id+"'");
              
              int column = rs.findColumn("nachname");  // result = 1
              String name = rs.getString("nachname");

              System.out.println(row);
              System.out.println(column);
              System.out.println(name);
```


Ich weiß nicht weiter. Der Datensatz wird ausgelesen, kann aber nicht mit getString() angezeigt werden.

Woran kann das liegen ?


----------



## SlaterB (11. Dez 2006)

hast du denn noch nie ein Statement ausgeführt?
dort kann man doch dann abgucken..

bevor im ResultSet ein Datensatz zugreifbar ist musst du erstmal mit rs.next() einen laden,
damit kannst du gleich prüfen, ob überhaupt einer da ist


----------



## sop (11. Dez 2006)

Ich wußte nicht das .next() so wichtig für die Abfrage ist. Habe noch viel zu lernen ;-)

Schönen Gruß und vielen Dank für die schnelle Hilfe


----------



## sop (11. Dez 2006)

Ich habe es jetzt geschafft, den Datensatz aus der bestimmten / gewollten Zeile in die Formularfelder einzutragen.

Nun sollten die Daten geï¿½ndert werden kï¿½nnen. Nach der ï¿½nderung wird abgespeichert (Submit) und der modifizierte Eintrag sollte in der Datenbank angezeigt werden.

Jetzt die Frage: 

Kann ich das mit einem UPDATE-Befehl lï¿½sen oder muss ich eine Query schreiben und spï¿½ter mit updateString() - updateRow() - usw... arbeiten?

Zur besseren Vorstellung:

Die Formulareintrï¿½ge werden per POST-Methode an das Servlet ï¿½bergeben. Im Servlet sollen also die Modifikationen gemacht werden.

Was kï¿½nnte ich da am besten machen??? :shock:


----------



## sop (11. Dez 2006)

DAS WAR EINE BLï¿½DE FRAGE - ICH WEIï¿½!  ES GIBT ALSO DOCH "BLï¿½DE FRAGEN"

Ich versuch wirklich selber auf die Lï¿½sung zu kommen, jedoch dauert es manchmal etwas lï¿½nger.

Ankommende Parameter mit request() einfangen:

```
String id			      = request.getParameter("id");
String rechnungsnummer     = request.getParameter("rechnungsnummer");
String vorname 		         = request.getParameter("vorname");
```

Dann diese Parameter benutzen, um die Update()-Funktion durchzufï¿½hren.

Wichtig: PreparedStatement verwenden


```
try 
          {
              Class.forName("org.gjt.mm.mysql.Driver");
              String url = "jdbc:mysql://localhost:3306/prepaid";
              Connection con = DriverManager.getConnection(url,"root", "mpt*sven");
              

              PreparedStatement ps = con.prepareStatement("" +
              		"UPDATE kunde " +
              		"SET rechnungsnummer = '"+rechnungsnummer+"', vorname = '"+vorname+"'," +
              		"WHERE id = '"+id+"';"); 
  
              ps.executeUpdate();
             
             con.close();
            }
```


----------



## sop (12. Dez 2006)

Ich brauche Hilfe im Bezug auf das Filtern von Datenbankabfragen.

Zur Zeit denke ich das ich eine IF-Anweisung benutze, um es zu realisieren. Hier die Source:


```
sRechNr 	= request.getParameter("RechNr");
sNachname    = request.getParameter("Nach");
sPlz		   = request.getParameter("Plz");
    
    try {
      Class.forName( sDbDrv );
      cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
      st = cn.createStatement();
          
      if(sRechNr != "")
      {
      	  rs = st.executeQuery("Select * from kunde where rechnungsnummer = '"+sRechNr+"' ;");
      }      
      if (sNachname != "")
      {
	  rs = st.executeQuery("Select * from kunde where nachname = '"+sNachname+"' ;"); 
      }
      if (sPlz != "")
      {
      	  rs = st.executeQuery("Select * from kunde where plz = '"+sPlz+"' ;");
      }
      else
      {
      	  rs = st.executeQuery("Select * from kunde;");
      }
```

Sprich, ich überschreibe den Wert für das ResultSet, indem ich prüfe, ob es in den Feldern Daten gibt. Ist keine sonderlich gute Sache.

Wie kann ich es besser machen bzw. was ist die normale Vorgehensweise ?


----------



## SlaterB (12. Dez 2006)

keine Ahnung..,
wie wärs denn wu erstmal beschreibst WAS passieren soll?!

die einzige gegebene Information ist 'Filtern von Datenbankabfragen',
da verstehe ich persönlich nur Bahnhof

"ich mache irgendwas, aber meine Umsetztung geht nicht, wie gehts besser?"


----------

