timo: variable aus klasse ausgeben

hallo alle zusammen,

ich bin absoluter anfänger was jsp betrifft und habe ein problem, bei dem ich nicht mehr weiter komme.

ich habe eine klasse, die ich mit <@ page import="werte.class" %>
in eine jsp datei importiere.
in der klasse gibt es eine methode, die mir ein array zurückgibt.
(klasse funktioniert, eclipse getestet)

jetzt möchte ich in mitten meiner html-tags das array ausgeben, was ich mit folgendem befehl versuche:

<%= array[1] %>

dies funktioniert aber nicht.

hier mal ein ausschnitt meiner jsp datei:

<html>
<head>
<title></title>
</head>
<body>
<@ page import="werte.class" %>

<table><td><%= out.println.array[1] %></td><td><%= out.println.array[1] %></td><td><%= out.println.array[1] %></td></table>

</body>

.......

ich weiß nicht was der fehler ist und hoffe ihr könnt mir weiterhelfen!

gruß timo

</html>

  1. Hallo timo,

    jetzt möchte ich in mitten meiner html-tags das array ausgeben, was ich mit folgendem befehl versuche:

    <%= array[1] %>

    dies funktioniert aber nicht.

    Ich verstehe nicht, wie Du auf die Syntax kommst. Stellen wir uns vor, Deine Methode heißt holeArray() (Deine Klasse heißt ja offensichtlich 'werte' und ich gehe davon aus, dass es eine statische Methode ist). Wenn Du das Array dann ausgeben willst (sofern es jetzt mal ein String-Array ist), dann wirst Du am ehesten sowas in der Art machen wollen (wenn Du das ganze Array ausgeben willst, so wie ich Dich verstanden habe):

    <table>
    <%
      String[] meinArray = werte.holeArray ();
      for (int i = 0; i < meinArray.length; i++) {
    %>
      <tr>
         <td><%= meinArray[i] %>
      </tr>
    <%
      }
    %>
    </table>

    Aber nachdem mir nicht so ganz klar wird, was Du genau erreichen willst, weil Deine bisherigen Versuche mir irgendwie extrem abstrus erscheinen, kann ich auch vollkommen daneben liegeben, bei dem, was Du suchst.

    Wenn das Dir also nicht weiterhilft, erkläre doch mal etwas genauer, was Du eigentlich machen willst.

    Viele Grüße,
    Christian

    1. Hallo,

      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 in der Variablen werte in der JSP seite geschrieben. und hier haperts!
      Zurückgegeben wird ein Array.

      Tomcat-Verzeichnis:
      Die Klasse liegt unter Root/classes/Status

      Bitte um Hilfe!! Ich bin JSP-neuling
      Vielen Dank im Voraus.

      Gruß

      bevor ichs vergesse, meine klasse sieht in etwa so aus:

      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[i] = rs.getString(2);
      }
      }
      catch(SQLException e)
      {
      System.err.println("Error");
      e.printStackTrace();
      }
      return werte;
      }
      }

      1. 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

        1. hallo christian, deine erläuterung ist großartig, jetzt hats auch funktioniert! vielen dank!
          gruß timo