# <h:dataTable> doppelte ausgabe



## purzel (20. Apr 2010)

Hallo Community,

ich habe (mal wieder) ein Problem! Und zwar verwende ich den <h:dataTable>-Tag und soweit funktioniert auch alles, es wird alles aus der Datenbank als Tabelle augeben. Nun ist aber mein Problem das die Ausgabe doppelt erscheint, also so z.B.:

------------+
ID+Username|
-------------
 1 + user1    |
-------------
 2 + user2    |
-------------
 1 + user1    |
-------------
 2 + user2    |
-------------

Weiss da jemand Rat wo evtl. der Fehler liegen könnte? ???:L

Code:

Tabelle.xhtml

```
<h:dataTable value="${UsersList.userslist}" var="user" border="0">
    <h:column>
        <f:facet name="header">
            <f:verbatim>ID</f:verbatim>
        </f:facet>
        <h:outputText value="#{user.id}" escape="false"></h:outputText>
    </h:column>
    <h:column>
        <f:facet name="header">
            <f:verbatim>Username</f:verbatim>
        </f:facet>
        <h:outputText value="#{user.username}" escape="false"></h:outputText>
    </h:column>
</h:dataTable>
```

Userlist.java

```
public class userslist {
    /**
     * Datenbank
     */
    final String db_driver = "com.mysql.jdbc.Driver";
    final String db_url = "jdbc:mysql://localhost:****/****";
    final String db_username = "****";
    final String db_password = "****";

    private List userslist = new ArrayList();

    @SuppressWarnings("unchecked")
    public List getUserslist() {
        try{
            Class.forName(db_driver);
            try{
                Connection db = DriverManager.getConnection(db_url, db_username, db_password);

                String selectStatement = "SELECT id, username FROM users";
                PreparedStatement prepStmt = db.prepareStatement(selectStatement);
                ResultSet rs = prepStmt.executeQuery();

                while(rs.next()) {
                    userslist.add(new users(rs.getInt("id"), rs.getString("username")));
                }
                rs.close();
            } catch(Exception db_error) {
                System.out.println(db_error);
            }
        } catch(Exception db_driver_error) {
            System.out.println(db_driver_error);
        }
        return userslist;
    }
}
```

Users.java

```
public class users {
    int id;
    String username;

    public users(int id, String username) {
        this.id = id;
        this.username = username;
    }

    public int getid() {
        return id;
    }

    public String getusername() {
        return username;
    }
}
```


----------



## JanHH (27. Apr 2010)

Wenn ich sowas seh, weiss ich wieder warum ich seam benutze ;-). Um den Fehler zu finden würd ich mir mal das ResultSet per System.out.println anzeigen lassen, um zu schauen, ob das wenigstens so aussieht wie man es erwarten würde.

Ansonsten find ich die Benutzung von f:verbatim zur Ausgabe von Texten ziemlich schräg, und die Tatsache dass der schliessende Schrägstrich bei hutputText nicht direkt im Tag drin ist (also <hutputText value="Hallo Welt" />). Fällt mir nur so auf grad.


----------



## purzel (1. Mai 2010)

JanHH hat gesagt.:


> Wenn ich sowas seh, weiss ich wieder warum ich seam benutze ;-). Um den Fehler zu finden würd ich mir mal das ResultSet per System.out.println anzeigen lassen, um zu schauen, ob das wenigstens so aussieht wie man es erwarten würde.



Ist Seam ein Web-Framework? Noch nie davon gehört. Und bei der Ausgabe des ResultSet kommt nichts!



JanHH hat gesagt.:


> Ansonsten find ich die Benutzung von f:verbatim zur Ausgabe von Texten ziemlich schräg, und die Tatsache dass der schliessende Schrägstrich bei hutputText nicht direkt im Tag drin ist (also <hutputText value="Hallo Welt" />). Fällt mir nur so auf grad.



Was spricht dagegen? Gibt es gute Gründe, wäre nett wenn Du sie mir nennen könntest.


----------



## JanHH (4. Mai 2010)

Ne spricht nichts dagegen, ist nur irgendwie unnötig lang.

seam ist ein Framework, welches andere Frameworks integriert (daher der Name, sozusagen eine nahtlose Integration). Seam beinhaltet standardmässig JSF 1.2, JPA 1.0, EJB 3.0 und noch viele andere nette Dinge wiel mail und pdf und JBoss rools / Rollen-/Rechtevergabe und integriert das alles auf sehr harmonische Art und weise. Das noch verbunden mit einem sehr leistungsfähigen DI-Container. Äusserst empfehlenswert (bzw. wenn man einmal mit hatte will man nie mehr ohne ;-) ).


----------



## purzel (4. Mai 2010)

Danke für den Tipp! Werde es mal antesten, hoffe natürlich dass das funktioniert und nicht wie die anderen zahllosen Versuche andere Frameworks zum laufen zu bringen 

--------------------

€dit: Durch einen Workaround konnte ich die Tabelle richtig hinbekommen, leider ist es lästig dafür jedesmal diesen Workaround anzuwenden :/

Ich habe einfach als Getter die Anzahl Zeilen ausgelesen und mit rows="anzahlZeilen" gesetzt. Funktioniert zwar ist aber nicht sehr schön und aufwendig!

--------------------

Aber das mit dem Framework werde ich auf jeden Fall mal angehen da ich einige zusätzliche Features brauche die JSF2.0 nicht bietet


----------



## JanHH (5. Mai 2010)

An Deinem Code sieht man ja auch, dass Du gar kein JPA benutzt.. also noch ziemlicher Einarbeitungsbedarf, oder? seam ist nicht gerade ohne.. also wenn mans einmal verstanden hat, ist es wunderbar, aber man muss ziemlich viele Vorkenntnisse haben.


----------



## purzel (5. Mai 2010)

JanHH hat gesagt.:


> An Deinem Code sieht man ja auch, dass Du gar kein JPA benutzt.. also noch ziemlicher Einarbeitungsbedarf, oder?



Ich habe ja nicht behauptet dass ich Profi dadrin bin 

PS: was ist JPA ???:L


----------



## JanHH (6. Mai 2010)

JPA ist der java-Standard für "ORM", objekt-relationales Mapping. Eine bekannte Implementation davon ist Hibernate. Dabei hilft ein Framework, java-Klassen (die sog. Entites) auf Datenbanktabellen abzubilden, ohne dass man sich mit SQL herumschlagen muss. Annotationen im Quelltext enthalten dabei die notwendigen Meta-Informationen. Als Beispiel die Klasse "UserBean":


```
@Entity
public class UserBean
{
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private long id;

   private String name, passwd;
    
   ... getter, setter..
}
```

Ein Objekt dieser Klasse speichert man ganz einfach mit "entityManager.persist(myUserBean);" in der Datenbank. Deine Funktion getUserList sähe so aus:


```
public List<UserBean> getUserList()
{
   Query q=entityManager.createQuery("from UserBean");
   return q.getResultList();
}
```


----------



## purzel (6. Mai 2010)

JanHH hat gesagt.:


> JPA ist der java-Standard für "ORM", objekt-relationales Mapping.



Ok, das hört sich interessant an, werde ich mir später zu gemüte führen, jetzt arbeite ich erstmal mit den Grundlagen die ich habe und festige diese


----------

