Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Methodenaufruf!!! Aber was ist falsch?

Empfohlene Antworten

Veröffentlicht

Hallo zusammen!

ich habe eine JSP seite, importiere mir eine Java-Klasse und möchte dann eine Methode abfahren. Es funktioniert aber nicht.

Was ist falsch?

JSP-Seite:

<HTML>

<head>

<title>Status</title>

</head>

<body>

<%@ page import="Status.*;" %>

<%! String[] werte = new String[4]; %>

<% werte = new Status.werte().holeData() %>

*** Ausgabe ***

</body>

</HTML>

In der Java-Klasse wird ein SQL-Statement ausgeführt was mir aus einer DB Daten zurückgibt. Diese werden dann ja der Variablen werte in der JSP seite gegeben. Zurückgegeben wird ein Array.

Tomcat-Verzeichnis:

Die Klasse liegt unter Root/classes/Status

Fehlermeldung:

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 8 in the jsp file: /status.jsp

Generated servlet error:

The method daten() is undefined for the type werte

Bitte um Hilfe!! Ich bin JSP-neuling

Vielen Dank im Voraus.

Gruß

Sacklzement

new Status.werte().holeData()
Angenommen, Du willst eine neue Instanz der Klasse Status erzeugen, dann mal besser:
Status s = new Status();
Du willst auf diese neue Instanz die Methode werte() aufrufen?
s.werte();
Da Du keinerlei Infos gibst, wie die Klasse Status aussieht, kann man nur raten. Es könnte jedoch sein, dass in der Klasse Status die static Methode
public static Object werte() { ...}
definiert wurde. Dann lautet der Aufruf:
Status.werte();

import java.sql.*;

public class werte

{

String Query;

ResultSet rs;

String[] werte = new String[4];

public String[] holeData()

{

Query = "SELECT * FROM POR_Buchungsdatum";

rs = new Portal.cls_connect().select(Query);

try

{

int i = -1;

while(rs.next())

{

i = i + 1;

werte = rs.getString(2);

}

}

catch(SQLException e)

{

System.err.println("Error");

e.printStackTrace();

}

return werte;

}

}

Hi,

ok also du hast ne Klasse "Werte" in dieser die Funktion holeData()

Dann sollte der Aufruf so ausschauen:

Werte w = Werte();

w.holeData()

Frage zur Klasse Werte.

Du hast dir dort ein StringArray mit der länge 4 definiert.

Bist du dir sicher das in deiner Tabelle immer nur 4 Datensätze drin sind?

Ich würd dafür eine List verwenden.

List werte = new ArrayList();

Mit java 1.5, falls ihr das verwendet, geht das auch Typsicher.

Dein logging im Fehlerfall würd ich auch nochmal überdenken.

Habt ihr nicht vielleicht schon eine Bibliothek die ihr für´s logging verwendet wird? z.B log4j

Ausserdem solltest du überdenken ob du die Methode nicht lieber mit einer Exception abbrechen lässt in so einem Fall (RuntimeException werfen oder NotFoundException wenn´s nicht so schlimm ist... je nachdem halt).

Ich denk da kannst du noch bisschen was optimieren.

- brauchst du die definierten Variablen als Instanzvariablen

- evtl. solltest du auf dem Resultset in nem finally close() aufrufen

... kannst ja mal drüber nachdenken.

Gruß Moha

Hallo,

hat funktioniert. Aber ich bekomme gleich das nächste Problem.

Er kann keine Verbindung zur DB herstellen. Laut Logfile des Tomcat´s bekomme ich eine NullPointerException mit der begründung das er den Datenquellennamen nicht findet, da kein Standardtreiber angegeben ist.

Wenn ich die Klasse im Eclipse laufen lasse bekommen ich die daten so wie es sein soll. Die Datenbank ist in der ODBC-Verbindung in der Verwaltung eingetragen.

Code:

Statement command;

Connection conn;

puplic void connect()

{

try

{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

conn = DriverManager.getConnection("jdbc:odbc:TDC");

System.out.println("Connected to DB");

command = conn.createStatement();

}

catch(SQLException se)

{

System.out.println(se);

se.printStackTrace();

}

}

Wenn ich die Klasse im Eclipse laufen lasse bekommen ich die daten so wie es sein soll. Die Datenbank ist in der ODBC-Verbindung in der Verwaltung eingetragen.

hast du eine benutzer- oder system-DSN angelegt?

s'Amstel

Hatte eine Benutzer-DSN, habe dieses jetzt auf System-DSN geändert. Es funktioniert aber trotzdem nicht.

Was habe ich noch für möglichkeiten dieses Problem zu lösen?

welches RDBMS steht denn dahinter bzw. welcher datenbankreiber ist denn der system-DSN zugewiesen?

s'Amstel

Als treiber ist der Microsoft Access-Treiber(*.mdb) in der version 4.00.6019.00 ausgewählt.

Laut Logfile des Tomcat´s bekomme ich eine NullPointerException mit der begründung das er den Datenquellennamen nicht findet, da kein Standardtreiber angegeben ist.

das heisst dann also "data source not found and no default driver specified".

ist das sicher eine NullPointerException und keine SQLException?

welche version von MDAC ist auf dem system installiert?

überprüfe auch, ob der Jet-ODBC-treiber korrekt installiert wurde.

s'Amstel

MDAC??? Jet-ODBC??? Bin leider in der Javawelt ein noob und weiß auch jetzt auch nicht wo ich das alles finde!

Laut logfile ist es eine NullPointerException, was auch wieder logisch ist da er den Treiber für die DB nicht finden kann!

Wäre super wenn du mir sagen kannst wo ich nachsehen soll.

Gruß

Sacklzement

mein angesprochenes MDAC hat mit Java erstmal garnix zu tun; wenn du aber auf eine MS-Access datenbank zugreifst, benötigst du einen entsprechenden treiber, welcher allerdings üblicherweise mit windows schon mitgeliefert wird.

die angesprochene fehlermeldung, dass der treiber nicht gefunden werden kann, legt nahe, dass unter gewissen umständen nicht darauf zugegriffen werden kann.

konkret sind das MSJET35.DLL (Jet 3.5) bzw. MSJET40.DLL (Jet 4.0), ODBCJT32.DLL (Jet ODBC treiber) diese (und u.u. noch andere für den treiber wichtigen dateien) sollten im SystemRoot\System32 vorhanden sein.

s'Amstel

Hallo,

unter Windows/System32 finde ich die MSJET40.dll und die ODBCJT32.dll!! Sind beide vorhanden.

Hallo,

JSP-Seite läuft warum weiß ich auch nicht!

Hab ein neues System aufgesetzt und das ganze nochmal kompiliert. Jetzt läuft diese.

Vielen Dank

Gruß

Sacklzement

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.