JSF 2.0 Formular Parameter übergeben

Masterpurzel

Mitglied
Hallo Community,

ich würde gerne auf meiner Seite einen Parameter im Formular mit übergeben. Folgenden Ansatz habe ich schon versucht, bin aber dran gescheitert:

user_edit.xhtml
Code:
<h:form id="user_edit_form">
    <h:panelGrid id="grid" columns="2">
        <h:outputLabel value="Userid" for="userid"></h:outputLabel>
        <h:inputText id="userid" value="${User_bearbeiten.userid}"></h:inputText>
        <h:outputLabel value="Username" for="username"></h:outputLabel>
        <h:inputText id="username" value="${User_bearbeiten.username}"></h:inputText>
        <h:commandLink value="Speichern" action="${User_bearbeiten.write_data}">
            <f:param name="uid" value="${User_bearbeiten.userid}"></f:param>
        </h:commandLink>
    </h:panelGrid>
</h:form>

Wenn ich nun mit der Maus über den Link fahre wird er korrekt angezeigt:

http://www.meineseite.de/user_edit.jsf?uid=3

Beim Aufruf wird allerdings die seite

http://www.meineseite.de/user_edit.jsf

aufgerufen.

Dadurch erhalte ich dann eine SQL-Exception da der Parameter uid fehlt!

Wer hat einen Tipp für mich?

LG Masterpurzel
 
Mein Problem habe ich inzwischen beseitigen können, hier für die es interessiert:

ich habe ein hidden-Feld hinzugefügt und den dazugehörigen getter und setter erstellt!
Code:
<h:inputHidden id="uid" value="${User_bearbeiten.userid}"></h:inputHidden>

nur noch eine Frage:

warum funktioniert das:
Code:
public String write_data() throws ClassNotFoundException, SQLException {
        //try{
            Class.forName(db_driver);
            //try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);

                String updateStatement = "UPDATE users SET username = '"+username+"' WHERE "+uid+" LIMIT 1";
                System.out.println("sql: " + updateStatement);
                PreparedStatement prepStmt = db.prepareStatement(updateStatement);
                //prepStmt.setString(1, username);
                //prepStmt.setString(2, uid);
                java.sql.Statement stmt = db.createStatement();
                boolean execute = stmt.execute(updateStatement);
                //stmt.executeUpdate(updateStatement);
                db.close();
            //} catch(Exception db_error) {
                //System.out.println(db_error);
            //}
        //} catch(Exception db_driver_error) {
            //System.out.println(db_driver_error);
        //}
                if(execute == true) {
                    return "success";
                } else {
                    return "fail";
                }

    }

und das nicht:
Code:
public String write_data() throws ClassNotFoundException, SQLException {
        //try{
            Class.forName(db_driver);
            //try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);

                String updateStatement = "UPDATE users SET username = ? WHERE ? LIMIT 1";
                System.out.println("sql: " + updateStatement);
                PreparedStatement prepStmt = db.prepareStatement(updateStatement);
                prepStmt.setString(1, username);
                prepStmt.setString(2, uid);
                java.sql.Statement stmt = db.createStatement();
                boolean execute = stmt.execute(updateStatement);
                //stmt.executeUpdate(updateStatement);
                db.close();
            //} catch(Exception db_error) {
                //System.out.println(db_error);
            //}
        //} catch(Exception db_driver_error) {
            //System.out.println(db_driver_error);
        //}
                if(execute == true) {
                    return "success";
                } else {
                    return "fail";
                }

    }

siehe UpdateStatement-String!! - erhalte bei Version 2 immer ein SQLException!
 
erhalte bei Version 2 immer ein SQLException!

Und wie gnau lautet die? Im Allgemeinen steht in solchen Exceptions doch genau drin, was im Code nicht stimmt!

Mir scheint, als würdest du da ein Prepared Statement definieren und dessen Werte setzen, aber anschließend ein "normales" Statement ausführen, das fataler Weise die '?' für das preparierte Statement mitbekommen hat...

mfg,

RoCMe
 
Und wie gnau lautet die? Im Allgemeinen steht in solchen Exceptions doch genau drin, was im Code nicht stimmt!

folgendes steht drin:

javax.servlet.ServletException: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? WHERE id = ? LIMIT 1' at line 1

Mir scheint, als würdest du da ein Prepared Statement definieren und dessen Werte setzen, aber anschließend ein "normales" Statement ausführen, das fataler Weise die '?' für das preparierte Statement mitbekommen hat...

mfg,

RoCMe

Hast du ein Bespiel für ein PreparedStatement? Was genau muss ich denn dort einsetzen?

PreparedStatement prepStmt = db.prepareStatement(updateStatement);
prepStmt.setString(1, username);
prepStmt.setString(2, uid);
java.sql.Statement stmt = db.createStatement();
boolean execute = stmt.execute(updateStatement);
 
Zuletzt bearbeitet:
Hi!

Ich kommentiere mal ganz ausführlich deinen Code:

Java:
String updateStatement = "UPDATE users SET username = ? WHERE ? LIMIT 1";
                System.out.println("sql: " + updateStatement);
//ein neues Prepared Statemten erzeugen
                PreparedStatement prepStmt = db.prepareStatement(updateStatement);
//die 'Platzhalter' in diesem Statement 'befüllen'
                prepStmt.setString(1, username);
                prepStmt.setString(2, uid);
//jetzt müsste man dieses statement eigentlich nur noch ausführen (prepStmt.execute() oder so ähnlich).
//stattdessen erzeugst du ein neues Statement und steckst deine Abfrage mit den Fragezeichen rein 
                java.sql.Statement stmt = db.createStatement();
//wenn du das jetzt ausführst, fängt die DB an zu jammern. Eine ID '?' kennt sie nicht!
                boolean execute = stmt.execute(updateStatement);
                //stmt.executeUpdate(updateStatement);
                db.close();

Prepared Statements sind eine wirklich tolle Erfindung. Die Abfrage wird einmal mit Platzhaltern anstelle der richtigen Werte erstellt. Anschließend kannst du mit setInt(), setString() usw. diese Platzhalter füllen und die Abfrage ausführen.

Gruß,

RoCMe
 
Zurück