Christian Seiler: variable aus klasse ausgeben

Beitrag lesen

Hallo,

Da bei Dir offensichtlich einige Verwirrungen auftreten, mache ich hier mal ein einfaches Beispiel, das bei mir funktioniert (zwar Resin und nicht Tomcat, aber das sollte egal sein), das Du dann um die Datenbankabfragefunktionalität erweitern kannst:

Folgendes Dateisystemlayout:

* test.jsp: Die JSP-Datei
 * WEB-INF/
   * classes/
     * Status/
       * werte.class
       * werte.java [wird aber nicht mehr benötigt nach dem Kompilieren]

Die Datei test.jsp sieht bei mir so aus:

<%@ page pageEncoding="UTF-8" %>  
<%@ page contentType="text/html" %>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
<title>Status</title>  
</head>  
<body>  
<% [code lang=java]String[] meineWerte = new Status.werte().holeData();
~~~ %>  
<ul>  
<% `for (int i = 0; i < meineWerte.length; i++) {`{:.language-java} %>  
  <li><%= `meineWerte[i]`{:.language-java} %></li>  
<% `}`{:.language-java} %>  
</ul>  
</body>  
</html>[/code]  
  
Erstens: Da Du sowieso über absolute Angaben auf die Klasse werte Zugreifst, brauchst Du nichts aus Status importieren, Du kannst da immer direkt zugreifen (import Status.\* wäre nur sinnvoll, falls Du new werte ().holeData () schreiben wolltest). Zweitens: Damit keine Verwirrungen bestehen, nenne ich lokale Variablen NICHT so wie Klassennamen (übrigens: Java-Konvention ist, Klassennamen großzuschreiben). Drittens: Ich alloziere innerhalb des JSPs keinen Array für die Variable meineWerte (so wie ich sie hier genannt habe), weil das absolut unnötig ist, das wird schon in der Klasse selbst gemacht.  
  
Ich weiß nicht, wo Du normalerweise Klassen ablegst (evtl. ist Dein Tomcat auch anders konfiguriert als ich es erwarte - ich kenne Tomcat nicht besonders - oder Du meinst mit »Root« nicht das Webroot, sondern etwas anderes, was ich bloß nicht kenne), aber innerhalb von "Web Applications" legt man Klassen in der Regel in einem Verzeichnis namens WEB-INF/classes ab. Daher liegt bei mir die Klasse »werte.java« in einem Verzeichnis WEB-INF/classes/Status.  
  
Der Inhalt ist:  
  
~~~java
package Status;  
  
public class werte {  
  public String[] holeData () {  
    String[] rueckgabeWerte = new String[2];  
    werte[0] = "Hallo Welt!";  
    werte[1] = "Ende des Internets!";  
  
    return rueckgabeWerte;  
  }  
}

Wichtig sind hier zwei Dinge:

  1. package Status;

Das deklariert, dass die Klasse "werte" zum Paket "Status" gehört. Das ist wichtig, denn wenn Du das weglässt, dann wird ein Laden der Klasse "Status.werte" fehlschlagen, da der Compiler dort nur die Klasse "werte" vorfindet!

  1. Alles, was die Klasse benötigt, wird INNERHALB der Methode alloziert, d.h. das new String[2] findet innerhalb der Methode statt und es wird KEINE Klassenvariable verwendet.

Was vielleicht noch im Hinblick auf Deinen Code relevant wäre:

Du machst in Deinem Code ja sowas wie

... = new String[4];

und dann befüllst Du das in der Schleife, die die Datenbank ausliest. Das ist aber denkbar schlecht, denn was ist, wenn es mehr als 4 Einträge gibt?

Daher wäre folgender Code sinnvoller (schematisch), der die Collections-Klassen nutzt anstelle von Arrays, die eine feste Größe haben:

import java.util.Vector;  
  
....  
  
Vector<String> datenbankWerte = new Vector<String>;  
  
....  
  
// in der schleife statt werte[i] = ...  
datenbankWerte.add (...);  
  
...  
  
// am ende der funktion  
// Konvertiere den Vector in einen normalen Array  
return (String[]) datebankWerte.toArray (new String[0]);

(Das new String[0] ist notwendig, damit toArray() den Datentyp des Rückgabewerts kennt.)

[Wenn noch kein Java 1.5 zur Verfügung steht, muss bei Vector das <String> immer weggelassen werden.]

Alternativ kannst Du natürlich auch gerne die Collections-Klasse selbst als Rückgabewert nutzen und dann mit einem Iterator durch die Elemente durchgehst, um sie auszugeben.

Und allgemein ist es für die Zukunft SEHR hilfreich, wenn Du nicht einfach ssagst "ES GEHT NICHT", sondern eine komplette Fehlermeldung angibst, die Dein Problem illustriert.

Viele Grüße,
Christian