JSF Merkwürdiges Verhalten einer Bean

purzel

Bekanntes Mitglied
Hallo,

ich habe ein Problem und weiß keinen Rat mehr. Wenn ich in einer Methode eine Variable fülle und dann per [DUKE]System.out.println(rows);[/DUKE] ausgebe, dann erhalte ich den Wert in
Code:
rows
. Wenn ich ihn allerdings per
Code:
return rows;
ausgeben lassen will (zum weiterverarbeiten), dann kommt da nix mehr raus 🙁

Java:
public int count() {
        try{
            Class.forName(db_driver);
            try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);
                if(search_item.equals("1")) {
                    String rowStatement = "SELECT id, inhalt FROM news WHERE inhalt LIKE ?";
                    PreparedStatement row_prepStmt = db.prepareStatement(rowStatement);
                    row_prepStmt.setString(1, "%" + search_value + "%");
                    ResultSet row_rs = row_prepStmt.executeQuery();
                    row_rs.next();
                    row_rs.last();
                    rows = row_rs.getRow();
                    System.err.println("News: " + rows);
                    row_rs.close();
                } else if(search_item.equals("2")) {
                    String rowStatement = "SELECT id, username FROM users WHERE username LIKE ?";
                    PreparedStatement row_prepStmt = db.prepareStatement(rowStatement);
                    row_prepStmt.setString(1, "%" + search_value + "%");
                    ResultSet row_rs = row_prepStmt.executeQuery();
                    row_rs.next();
                    row_rs.last();
                    rows = row_rs.getRow();
                    System.err.println("User: " + rows);
                    row_rs.close();
                }
                db.close();
            } catch(Exception db_error) {
                System.out.println(db_error);
            }
        } catch(Exception db_driver_error) {
            System.out.println(db_driver_error);
        }
        return rows;
    }

bei Zeile 24 zum Beispiel kommt 2 raus, bei
Code:
count()
kommt 0 raus ???:L

Wer kann mir einen Tipp geben, was ich falsch mache?

Achja fast vergessen: Das ganze wird in einer JSF-Seite aufgerufen!

LG

Purzel
 
Also, bei mir(in Eclipse) compiliert Dein Code nicht.

Und das liegt daran, dass rows nicht bekannt ist. Du musst natürlich rows definieren!

Java:
	public int count() {
        int rows;
		try{
            Class.forName(db_driver);
            // Dein weiterer Code
 
rows habe ich so definiert:

Java:
public class suche {
int rows;
...
public int count() {
...
}
}

falls mehr Code erwünscht ist, poste ich dann natürlich!
 
Ja, mehr Code wäre hilfreich. Vlt ist der Fehler ja woanders.


gesamte Klasse:
Java:
package de.pcpowerplay.frontend.suche;

import java.io.IOException;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author purzel
 */
public class suche implements Serializable {
    /**
     * Datenbank
     */
    final String db_driver = "com.mysql.jdbc.Driver";
    final String db_url = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/pcpowerplay";
    final String db_username = "yyyyyyyyyy";
    final String db_password = "zzzzzzzzzz";

    String search_value;
    String search_item;
    int first;
    int rows;
    int rows_per_site = 15;
    int site = 1;
    ResultSet rs;

    HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();

    public String getSearch_value() {
        return search_value;
    }

    public void setSearch_value(String search_value) {
        this.search_value = search_value;
    }

    public String getSearch_item() {
        return search_item;
    }

    public void setSearch_item(String search_item) {
        this.search_item = search_item;
    }

    public void doSearching() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map requestMap = context.getExternalContext().getRequestParameterMap();
        try {
            //FacesContext.getCurrentInstance().getExternalContext().redirect("suche.faces?item=" + search_item + "&value=" + search_value);
            FacesContext.getCurrentInstance().getExternalContext().redirect("suche.faces");
        } catch (IOException ex) {
            Logger.getLogger(suche.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int count() {
        try{
            Class.forName(db_driver);
            try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);
                if(search_item.equals("1")) {
                    String rowStatement = "SELECT id, inhalt FROM news WHERE inhalt LIKE ?";
                    PreparedStatement row_prepStmt = db.prepareStatement(rowStatement);
                    row_prepStmt.setString(1, "%" + search_value + "%");
                    ResultSet row_rs = row_prepStmt.executeQuery();
                    row_rs.next();
                    row_rs.last();
                    rows = row_rs.getRow();
                    System.err.println("News: " + rows);
                    row_rs.close();
                } else if(search_item.equals("2")) {
                    String rowStatement = "SELECT id, username FROM users WHERE username LIKE ?";
                    PreparedStatement row_prepStmt = db.prepareStatement(rowStatement);
                    row_prepStmt.setString(1, "%" + search_value + "%");
                    ResultSet row_rs = row_prepStmt.executeQuery();
                    row_rs.next();
                    row_rs.last();
                    rows = row_rs.getRow();
                    System.err.println("User: " + rows);
                    row_rs.close();
                }
                db.close();
            } catch(Exception db_error) {
                System.out.println(db_error);
            }
        } catch(Exception db_driver_error) {
            System.out.println(db_driver_error);
        }
        return rows;
    }

    private suche_spalten[] suche = new suche_spalten[count()];

    public suche_spalten[] getSearch() {
        int i = 0;
        try{
            Class.forName(db_driver);
            try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);
                if(search_item.equals("1")) {
                    String selectStatement = "SELECT id, titel, inhalt FROM news WHERE inhalt LIKE ?";
                    PreparedStatement select_prepStmt = db.prepareStatement(selectStatement);
                    select_prepStmt.setString(1, "%" + search_value + "%");
                    rs = select_prepStmt.executeQuery();
                    while(rs.next()) {
                        suche[i] = new suche_spalten(rs.getInt("id"), rs.getString("titel"), rs.getString("inhalt"));
                        i++;
                    }
                } else if(search_item.equals("2")) {
                    String selectStatement = "SELECT id, username FROM users WHERE username LIKE ?";
                    PreparedStatement select_prepStmt = db.prepareStatement(selectStatement);
                    select_prepStmt.setString(1, "%" + search_value + "%");
                    rs = select_prepStmt.executeQuery();
                    while(rs.next()) {
                        suche[i] = new suche_spalten(rs.getInt("id"), rs.getString("username"));
                        i++;
                    }
                }
                rs.close();
                db.close();
            } catch (Exception db_error) {
                System.out.println(db_error);
            }
        } catch(Exception db_driver_error) {
            System.out.println(db_driver_error);
        }
        return suche;
    }

    public String weiter() {
        first = first + rows_per_site;
        site++;
        if(first > count()) {
            first = count() - rows_per_site;
        }
        return null;
    }

    public String zurueck() {
        first = first - rows_per_site;
        site--;
        if(first < 0) {
            first = 0;
            site = 1;
        }
        return null;
    }

    public boolean getWeiterVisible() {
        if(first + rows_per_site > count()) {
            return false;
        } else {
            return true;
        }
    }

    public boolean getZurueckVisible() {
        if(first <= 0) {
            return false;
        } else {
            return true;
        }
    }

    public int getSeite() {
        return site;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getFirst() {
        return first;
    }
}
 
Du solltest dir wirklich mal die Namensconvention von Java angucken.
Was mir auffällt:
[JAVA=103]private suche_spalten[] suche = new suche_spalten[count()];[/code]
Da initialisierst du direkt beim Erstellen der Instanz dein Array, noch bevor du irgendeinen Suchstring übergeben hast.
Ansonsten pack den Code mit Debugausgaben voll und schau was wirklich passiert und wo was warum mit welchen Parameter aufgerufen wird.
 
Du solltest dir wirklich mal die Namensconvention von Java angucken.
Was mir auffällt:
[JAVA=103]private suche_spalten[] suche = new suche_spalten[count()];[/code]
Da initialisierst du direkt beim Erstellen der Instanz dein Array, noch bevor du irgendeinen Suchstring übergeben hast.
Ansonsten pack den Code mit Debugausgaben voll und schau was wirklich passiert und wo was warum mit welchen Parameter aufgerufen wird.

Schau mal in
Code:
count()
, da wird der Suchstring bereits verwendet!

Eine Debugausgabe ist zum Beispiel dieses
Code:
System.err.println("User: " + rows);
 
Zuletzt bearbeitet:
Mal eine Frage nebenbei:

Ist es relevant dass das Bean-Scope "application" ist, oder hat es damit nix zu tun?

[XML]
<managed-bean>
<managed-bean-name>Suche__frontend</managed-bean-name>
<managed-bean-class>de.pcpowerplay.frontend.suche.suche</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
[/XML]

PS:

als Debug-Ausgabe erhalte ich in der Konsole folgende Ausgaben:

java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0

mit
Code:
System.out.prinln();
:

java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
User: 2
java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
 
Zuletzt bearbeitet:
Das ist eine Debugausgabe mit einem Informationsgehalt von 0.
Mach das so, dass aus der Ausgabe ersichtlich ist, was wann warum aufgerufen wird und was die Werte der Variablen zu diesem Zeitpunkt sind.
 
Ich bin jetzt einen Schritt weiter, allerdings weiß ich nicht die Ursache:

wenn ich
Code:
suche_spalten[] suche = new suche_spalten[count()];
ausführe bekomme ich bei [DUKE]count()[/DUKE] IMMER "0" raus. Wenn ich allerdings INNERHALB von
Code:
public suche_spalten[] getSearch() {}
[DUKE]count()[/DUKE] aufrufe funktioniert es, da bekomme ich in meinem Fall "2" raus. Was könnte die Ursache dafür sein? ???:L
 
Das habe ich doch schon oben geschrieben: die Methode count() darfst du erst aufrufen, nachdem du
Code:
search_item
gesetzt hast.
 

Neue Themen


Zurück
Oben