Veröffentlicht 13. April 20178 j Hallo zusammen, ich möchte meine JSF Seite mir Daten aus der Datenbank füllen. Dazu habe ich folgenden Code geschrieben. Wenn ich die .xhtml Seite ausführe bekomme ich nur den Text aus den facet tags. Mache ich etwas falsch? Ich benutze Eclipse, Tomcat 8.5, Maven, jdbc driver und XAMPP für den MySQL Server. Welche Möglichkeit/Debugging gibt es um auf dem MySQL Server nachzuschauen ob überhaupt auf die Datenbank zugegriffen wurde ? .xhtml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>JSF 2.0 Hello World</title> </h:head> <h:body> <h1>JSF 2.0 + JDBC Example</h1> <h:dataTable value="#{testuser.testuser()}" var="c"> <h:column> <f:facet name="header"> ID_Hardware </f:facet> <h:outputText value="#{c.id_Hardware}"/> </h:column> <h:column> <f:facet name="header"> Color </f:facet> <h:outputText value ="#{c.Color}"/> </h:column> <h:column> <f:facet name="header"> Format </f:facet> <h:outputText value ="#{c.Format}"/> </h:column> <h:column> <f:facet name="header"> HypAS </f:facet> <h:outputText value ="#{c.HyPAS}"/> </h:column> <h:column> <f:facet name="header"> id_fw_release </f:facet> <h:outputText value ="#{c.id_fw_release}"/> </h:column> <h:column> <f:facet name="header"> PPM </f:facet> <h:outputText value ="#{c.PPM}"/> </h:column> <h:column> <f:facet name="header"> id_type </f:facet> <h:outputText value ="#{c.id_type}"/> </h:column> <h:column> <f:facet name="header"> Launch_Date </f:facet> <h:outputText value ="#{c.Launch_Date}"/> </h:column> <h:column> <f:facet name="header"> End_of_Sale </f:facet> <h:outputText value ="#{c.End_of_Sale}"/> </h:column> <h:column> <f:facet name="header"> End_of_support </f:facet> <h:outputText value ="#{c.end_of_support}"/> </h:column> <h:column> <f:facet name="header"> Link </f:facet> <h:outputText value ="#{c.link}"/> </h:column> </h:dataTable> </h:body> </html> The testuser.java(bean) package jsfexampl; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.ManagedBean; import javax.enterprise.context.SessionScoped; import jsfexampl.DBM; @ManagedBean("testuser") @SessionScoped public class testuser implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int id_Hardware; private int Color; private String Format; private int HyPAS; private int id_fw_release; private int PPM; private int id_type; private Date Launch_Date; private Date End_of_Sale; private Date end_of_support; private String link; private static String db_table = "hardware"; public testuser(){ } public testuser(int id_Hardware,int Color, String Format, int HyPAS,int id_fw_release,int PPM,int id_type, Date Launch_Date, Date End_of_Sale, Date end_of_support, String link) { super(); this.id_Hardware = id_Hardware; this.Color = Color; this.Format = Format; this.HyPAS = HyPAS; this.id_fw_release = id_fw_release; this.PPM = PPM; this.id_type = id_type; this.Launch_Date = Launch_Date; this.End_of_Sale = End_of_Sale; this.end_of_support = end_of_support; this.link = link; } public int getId_Hardware() { return id_Hardware; } public void setId_Hardware(int id_Hardware) { this.id_Hardware = id_Hardware; } public int getColor() { return Color; } public void setColor(int color) { Color = color; } public String getFormat() { return Format; } public void setFormat(String format) { Format = format; } public int getHyPAS() { return HyPAS; } public void setHyPAS(int hyPAS) { HyPAS = hyPAS; } public int getId_fw_release() { return id_fw_release; } public void setId_fw_release(int id_fw_release) { this.id_fw_release = id_fw_release; } public int getPPM() { return PPM; } public void setPPM(int pPM) { PPM = pPM; } public int getId_type() { return id_type; } public void setId_type(int id_type) { this.id_type = id_type; } public Date getLaunch_Date() { return Launch_Date; } public void setLaunch_Date(Date launch_Date) { Launch_Date = launch_Date; } public Date getEnd_of_Sale() { return End_of_Sale; } public void setEnd_of_Sale(Date end_of_Sale) { End_of_Sale = end_of_Sale; } public Date getEnd_of_support() { return end_of_support; } public void setEnd_of_support(Date end_of_support) { this.end_of_support = end_of_support; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } //Array output public List<testuser> getList(DBM dbm, String cid, boolean close) throws Exception{ List<testuser> list = new ArrayList<testuser>(); PreparedStatement preState = null; ResultSet resultSet = null; try { if( dbm == null ){ dbm = new DBM(); } String sql = "SELECT * FROM "+db_table; preState = dbm.initConnection().prepareStatement(sql); preState.setString(1, cid); resultSet = preState.executeQuery(); while (resultSet.next()) { list.add( new testuser(resultSet.getInt(1),resultSet.getInt(2), resultSet.getString(3),resultSet.getInt(4),resultSet.getInt(5), resultSet.getInt(6),resultSet.getInt(7),resultSet.getDate(8), resultSet.getDate(9),resultSet.getDate(10),resultSet.getString(11)) ); } }catch (Exception e) { e.printStackTrace(); }finally{ if( preState != null ) preState.close(); if( close && dbm.connection != null ) dbm.connection.close(); } return list; } } DBM.java (Controller): package jsfexampl; import java.io.Serializable; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.regex.Pattern; import javax.faces.context.FacesContext; public class DBM implements Serializable { private static final long serialVersionUID = 9204275723046653468L; private String db_server = ""; private String db_user = ""; private String db_password = ""; private String db_driver = ""; public Connection connection = null; public DBM() throws Exception { init(); } private void init()throws Exception{ FacesContext fc = FacesContext.getCurrentInstance(); db_server = fc.getExternalContext().getInitParameter("DB-SERVER"); db_user = fc.getExternalContext().getInitParameter("DB-USER"); db_password = fc.getExternalContext().getInitParameter("DB-PASSWORD"); db_driver = fc.getExternalContext().getInitParameter("JDBC-DRIVER"); Class.forName(db_driver); } public Connection initConnection() throws Exception{ if( this.connection == null ){ this.connection = DriverManager.getConnection(db_server, db_user, db_password); this.connection.setAutoCommit(false); }else if( this.connection.isClosed() ){ this.connection = null; this.connection = DriverManager.getConnection(db_server, db_user, db_password); this.connection.setAutoCommit(false); } return this.connection; } public void closeConnection(){ try { if( this.connection != null ){ this.connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public void commitConnection(){ try { if( this.connection != null && !this.connection.isClosed() ){ this.connection.commit(); } } catch (SQLException e) { e.printStackTrace(); } } }
13. April 20178 j Setz doch mal einen Breakpoint auf das resultSet, dann siehst du, ob überhaupt etwas zurückgeliefert wurde. Mich wundert es, dass du Xampp für die Java Entwicklung nutzt, den Tomcat kannst du dir doch auch einfach downloaden, entpacken und in der IDE einbinden? Bin nicht sicher, wie das in Java ist, aber bei PHP hatte der Xampp Apache manchmal ein paar Macken...
13. April 20178 j Tomcat habe ich in Eclipse eingebunden. Über XAMPP lasse ich nur den MySQL Server laufen
13. April 20178 j Wofür brauchst du XAMPP, wenn du nur einen MySQL Server brauchst? Ich würde auch MariaDB nehmen anstatt MySQL. Davon abgesehen, dass ich den Quellcode doch recht gruselig finde, verstehe ich jetzt nicht, wo dein Problem liegt. Gut, ich kenne mich auch nicht mit JSF aus, aber du wirst ja wohl in der Lage sein, den Code zu debuggen und dann kannst du ja den Code Schritt-für-Schritt durchgehen und schauen, wo was schiefläuft. Bearbeitet 13. April 20178 j von Whiz-zarD
19. April 20178 j Ja ich bin dabei zu debuggen. Inwiefern findest du den Quellcode gruselig? Ich bin eigentlich Systemintegrator und arbeite mich in die Programmierung erst neu ein.
19. April 20178 j Was mir spontan auffällt ist die Methode getList(). Du reichst als Parameter eine Instanz von der Klasse DBM rein. Wenn die Instanz aber Null ist, erzeugst du eine: if( dbm == null ){ dbm = new DBM(); } Wozu? Das zeigt, dass du DBM als Parameter gar nicht benötigst. Du könntest den Parameter wegnehmen und es würde trotzdem laufen. Das zeigt, dass du ein Problem mit Abhängigkeiten hast, denn die Frage, die ich mir stelle ist, wieso weiß die Klasse TestUser so viel von der Datenbank? TestUser sollte eigentlich nur eine "dumme" Klasse sein (Stichwort POJO) und ein Service/Repository holt dir die Objekte. Auch der folgende Code in der selben Methode finde ich gruselig: while (resultSet.next()) { list.add( new testuser(resultSet.getInt(1),resultSet.getInt(2), resultSet.getString(3),resultSet.getInt(4),resultSet.getInt(5), resultSet.getInt(6),resultSet.getInt(7),resultSet.getDate(8), resultSet.getDate(9),resultSet.getDate(10),resultSet.getString(11)) ); } Das bedeutet, dass die Spaltenreihenfolge in der Datenbank exakt eingehalten werden muss. Kommt mal eine Spalte hinzu oder wird entfernt, muss dem Entwickler auch klar sein, dass er diesen Code anpassen muss. Ansonsten kommt es zu Fehlern. Gängige O/R-Mapper mappen auf Basis des Spaltennamens und nicht an der Anordnung der Spalten. Der Konstruktor von DBM ist abhängig von der Klasse FacesContext: public DBM() throws Exception { init(); } private void init()throws Exception{ FacesContext fc = FacesContext.getCurrentInstance(); db_server = fc.getExternalContext().getInitParameter("DB-SERVER"); db_user = fc.getExternalContext().getInitParameter("DB-USER"); db_password = fc.getExternalContext().getInitParameter("DB-PASSWORD"); db_driver = fc.getExternalContext().getInitParameter("JDBC-DRIVER"); Class.forName(db_driver); } D.h. die Klasse kann also nur im JSF-Kontext instanziiert werden. Entwickelst du dann eine Konsolenanwendung, musst du die Klasse quasi neu implementieren, weil FacesContext nicht bekannt ist. Also hast du auch hier wieder ein Abhängigkeitenproblem. Da gibt es noch mehr zu erzählen, aber das sind wohl die gravierendsten Punkte.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.