# Daten aus DB auslesen in ein formular (JSP)



## Rouven50 (6. Jun 2012)

hey - ich habe eine settings.jsp datei in der ich aus einem formular daten in eine datenbank speicher (das klappt alles wunderbar) nur jetzt stehe ich vor dem problem wie ich den datensatz wieder aus der tabelle in das forumlar bekomme ..weil es nur einen datensatz gibt in der tabelle und der soll immer angezeigt werden in dem formular wenn ich zb die settings.jsp öffne..dann soll also in den input feldern die aktuellen werte stehen die in der datenbank eingelesen wurden.. hier ist mal die jsp datei:


```
<jsp:directive.include file="header.jsp" />

<div id="main">

	<h1>Settings &raquo; bearbeiten</h1>

	<%
		//die daten aus den input-feldern auffangen
		String firma = request.getParameter("FIRMA");
		String url = request.getParameter("URL");
		String sprache = request.getParameter("SPRACHE");
		String logo = request.getParameter("LOGO");
		String standardlogo = request.getParameter("STANDARDLOGO");

		//wenn auf speichern geklickt wurde - db verbindung erstellen + einlesen
		if (request.getParameter("submit") != null) {

			//fuegt die daten in die datenbank
			MySQLConnection.insertDataSettings(firma, url, sprache, logo,
					standardlogo);
	%>
	<!-- mitteilen das erfolgreich gespeichert wurde  -->
	<div class='save_infoscreen_win'>Settings erfolgreich
		ge&auml;ndert</div>
	<%
		}

		//werte aus db auslesen und in variable speichern
	%>

	<form action="settings.jsp" method="get" enctype="multipart/form-data">

		<div id="logo_upload">
			<p>
				Logo ausw&auml;hlen:<br /> <input type="file" name="LOGO" size="45"
					value="" />
			</p>
			<p>
				<%
					//ueberprueft ob die checkbox gecheckt ist
					if ("on".equals("on")) {
				%>
				<input class="checkbox" type="checkbox" name="STANDARDLOGO"
					value="on" checked />Als Standardlogo f&uuml;r alle Infoscreens
				verwenden
				<%
					} else {
				%>
				<input class="checkbox" type="checkbox" name="STANDARDLOGO"
					value="on" />Als Standardlogo f&uuml;r alle Infoscreens verwenden
				<%
					}
				%>
			</p>
		</div>

		<div id="settings">
			<p>
				Unternehmen:<br /> <input class="input_text" name="FIRMA"
					type="text" value="<%%>" />
			</p>
			<p>
				URL:<br /> <input class="input_text" name="URL" type="text"
					value="" />
			</p>
			<p>
				Sprache:<br /> <input class="input_text" name="SPRACHE" type="text"
					value="" />
			</p>

			<button type="submit" name="submit" type="button">Speichern</button>

		</div>
	</form>
	<jsp:directive.include file="footer.jsp" />
</div>

</body>
</html>
```

so sieht meine methode aus die den datensatz ausliest die in einer java datei liegt:


```
public static void printDataSettings() throws InstantiationException, IllegalAccessException {
		conn = getInstance();

		if (conn != null) {
			// Anfrage-Statement erzeugen.
			Statement query;
			try {
				query = conn.createStatement();

				// Ergebnistabelle erzeugen und abholen.
				String sql = "SELECT FIRMA, URL, SPRACHE, LOGO, STANDARDLOGO FROM settings WHERE ID = 1";
				ResultSet result = query.executeQuery(sql);
				
				

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
```

nun ist die frage wie ich an die werte komme und mir die in der jsp anzeigen lassen kann .. also zb. value="<%result.getString("FIRMA");%>" aber so funktioniert das nicht

wäre euch echt sehr dankbar für tipps


----------



## HimBromBeere (6. Jun 2012)

```
result
```
 ist ja nur in deiner JAVA-Datei bekannt. Gib diesen Wert doch einfach durch die methode zurück und ruf sie in der JSP auf.


```
public ResultSet getResult(...) {
    // ... do some stuff here
    return result;
}
```


```
<% import DeineKlasse; %>
<% result = new DeineKlasse.getResults(...);
...
%>
```


----------



## Rouven50 (6. Jun 2012)

hey danke schonmal  nur ich habe probleme die methode in der html zu importieren - meine java datei sieht nun wie folgt aus:

```
public ResultSet printDataSettings() throws InstantiationException,
			IllegalAccessException {
		conn = getInstance();

		if (conn != null) {
			// Anfrage-Statement erzeugen.
			Statement query;
			try {
				query = conn.createStatement();

				// fragt die daten ab
				String sql = "SELECT FIRMA, URL, SPRACHE, LOGO, STANDARDLOGO FROM settings WHERE ID = 1";
				ResultSet result = query.executeQuery(sql);
				return result;

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
```

dann habe ich in der html die java datei importiert die sich im package datenbank befindet

```
<%@ page import="datenbank.*"%>
```

und dann will ich das ergebnis der methode importieren 

```
result = new MySQLConnection.printDataSettings();
```
nur da bekomme ich folgenden fehler: syntax error on token "import", invalid expression 

habe ich was falsch gemacht bzw falsch importiert? aber eig müsste das doch so richtig sein.. auf die anderen methoden aus der java datei kann ich auch zugreifen (sind allerdings public static void.. methoden)

mfg


----------



## Rouven50 (7. Jun 2012)

das funktioniert ebenfalls nicht 

```
ResultSet result = MySQLConnection.getDataSettings();
```

bekomme dann folgenden error:



```
HTTP ERROR 500

Problem accessing /info2screen/settings.jsp. Reason:

    PWC6033: Unable to compile class for JSP

PWC6197: An error occurred at line: 26 in the jsp file: /settings.jsp
PWC6199: Generated servlet error:
The method getDataSettings() is undefined for the type MySQLConnection
```


ich weiß echt nicht wie ich die ResultSet methode vernünftig einbinden kann - im internet stehen auch nur beispiele wo die direkt in der methode per system.out.print die werte ausgeben aber halt nicht in eine jsp übergeben

mfg


----------



## HimBromBeere (7. Jun 2012)

Sollte auch so heißen:

```
<% @page import = mayPackage.MyClass %>
```

Ist aber ein Weilchen her, dass ich mit JSP rumgemacht hab, müsste mich in die Syntax auch erst mal reinbeißen.


----------



## Rouven50 (7. Jun 2012)

ja genau - das habe ich ja mit dem 

```
<%@ page import="datenbank.*"%>
```
gelöst - da werden ja dann alle classen importiert die in dem package sind..das funktioniert auch.. nur das problem ist jetzt ich weiß nicht wie ich die werte richtig in die html speicher

```
ResultSet result = MySQLConnection.getDataSettings();
```

funktioniert irgendwie nicht - dann bekomme ich einen 500 error - ich glaube das ist entscheidend The method getDataSettings() is undefined for the type MySQLConnection ..nur ich weiß nicht was ich falsch mache.. die getDataSettings befindet sich in der MySQLConnection.java


----------



## HimBromBeere (7. Jun 2012)

> die getDataSettings befindet sich in der MySQLConnection.java


Mag ja sein, aber sie ist wahrscheinlich nicht statisch. Zeug am besten mal die zegehörige JAVA-Klasse, dann können wir das besser beurteilen.


----------



## Rouven50 (7. Jun 2012)

hey hier ist die MySQLConnection.java

```
package datenbank;

import java.sql.*;

public class MySQLConnection {

	private static Connection conn = null;

	// Hostname
	private static String dbHost = "***";

	// Port -- Standard: 3306
	private static String dbPort = "3310";

	// Datenbankname
	private static String database = "usr_web7_3";

	// Datenbankuser
	private static String dbUser = "***";

	// Datenbankpasswort
	private static String dbPassword = "****";
	
	private MySQLConnection() throws InstantiationException,
			IllegalAccessException {
		try {

			// Datenbanktreiber für ODBC Schnittstellen laden.
			// Für verschiedene ODBC-Datenbanken muss dieser Treiber
			// nur einmal geladen werden.
			Class.forName("com.mysql.jdbc.Driver").newInstance();

			// Verbindung zur ODBC-Datenbank 'usr_web7_3' herstellen.
			// Es wird die JDBC-ODBC-Brücke verwendet.
			conn = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":"
					+ dbPort + "/" + database + "?" + "user=" + dbUser + "&"
					+ "password=" + dbPassword);
		} catch (ClassNotFoundException e) {
			System.out.println("Treiber nicht gefunden");
		} catch (SQLException e) {
			System.out.println("Connect nicht moeglich");
		}
	}

	private static Connection getInstance() throws InstantiationException,
			IllegalAccessException {
		if (conn == null)
			new MySQLConnection();
		return conn;
	}

	public static void insertDataSettings(String firma, String url,
			String sprache, String logo, String standardlogo)
			throws InstantiationException, IllegalAccessException {
		conn = getInstance();

		if (conn != null) {
			// Anfrage-Statement erzeugen.
			Statement query;
			try {
				query = conn.createStatement();

				// Daten einlesen
				String sql = "UPDATE settings SET FIRMA = '" + firma
						+ "', URL = '" + url + "', SPRACHE = '" + sprache
						+ "', LOGO = '" + logo + "', STANDARDLOGO = '"
						+ standardlogo + "' WHERE ID = 1";

				/*
				 * String sql =
				 * "INSERT INTO settings(FIRMA, URL, SPRACHE, LOGO, STANDARDLOGO) VALUES('"
				 * + firma + "', '" + url + "', '" + sprache + "', '" + logo +
				 * "', '" + standardlogo + "')";
				 */
				query.executeUpdate(sql);

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static ResultSet getDataSettings() throws InstantiationException,
			IllegalAccessException {
		conn = getInstance();
		if (conn != null) {
			// Anfrage-Statement erzeugen.
			Statement query;
			try {
				query = conn.createStatement();

				// fragt die daten ab
				String sql = "SELECT FIRMA, URL, SPRACHE, LOGO, STANDARDLOGO FROM settings WHERE ID = 1";
				return query.executeQuery(sql);
				
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}
```


----------



## HimBromBeere (7. Jun 2012)

Ich weiß schon, was ich an JSP nicht mag, einfach viel zu unübersichtlich. Wie auch immer, ich finde erstmal nichts Dramatisches. Ist die Klasse denn überhaupt auf dem Server vorhanden (also bereits kompiliert worden)?


----------



## Rouven50 (7. Jun 2012)

ja starte ja local mit jetty - und habe die klasse vorher kompiliert (sprich in eclipse oben auf den grünen pfeil gedrückt)
so habe ich das jetzt auch mal versucht :

```
value="<% MySQLConnection.getDataSettings().getString("FIRMA"); %>"
```
- aber bekomme dann folgenden fehler: Before start of result set


gibt es denn noch eine andere möglichkeit die werte auszulesen - ohne die methode in der java datei - evtl direkt in der jsp? finde auch nirgends im internet beispiele wie man werte aus einer datenbank zurück in ein formular liest..nur das http://www.java-forum.org/web-tier/63036-problem-resultset.html ..habe das auch mal mit dem array versucht - aber ohne erfolg


----------



## SlaterB (7. Jun 2012)

aus einem ResultSet kannst du nicht direkt etwas auslesen, das wäre in einem normalen Java-Programm nicht anders,
erst next() aufrufen,

getDataSettings() wird nun gefunden? immerhin

--------

generell wäre es sauberer, jeden Request erst in ein Servlet zu übergeben, eine saubere normale Java-Klasse,
dort alle Daten laden die nötig sind, als Request-Attribute ablegen, Connections schließen falls nötig usw.,
und dann die JSP nur die fertigen Daten aus dem Request anzeigen lassen


----------



## Rouven50 (7. Jun 2012)

hey die werte werden jetzt in der jsp ausgegeben - daaanke euch beiden=) es gibt nur noch ein problem - wie bekomme ich da sim input angezeigt? habe das jetzt so gemacht (wird nicht im input angezeigt aber das system.out wird in der console mit dem richtigen wert angezeigt) - nur halt noch nicht im input feld


```
<input class="input_text" name="FIRMA" type="text" value="
<%while(result.next()){
	String firma_value = result.getString(1);
	System.out.println(firma_value); 	
} %>" />
```


----------



## SlaterB (7. Jun 2012)

keinerlei Informierung vorher zu Tutorials, JSPs die das schon machen?

einfach nur out geht vielleicht..

Web Server Java -- Servlets and JSP - O'Reilly Media


----------



## Rouven50 (7. Jun 2012)

tausend dank=) es geht nun alles - super !!! danke  nun kann ich weiter arbeiten


----------

