繁体   English   中英

JSF DataTable不显示数据库

[英]JSF DataTable not displaying database

我遇到了一种方法,可以在网站上的数据库中显示数据。 但是,我遵循了一个示例,即创建一个Bean,在要显示的页面上创建一个数据表,但是当我运行网站时,它仅打印出Bean的字符串。 我该如何纠正?

index.xhtml

 <h:dataTable value="#{addressBean.addresses}" var="address" rowClasses="oddRows,evenRows" headerClass="header" styleClass="table" cellpadding="5" cellspacing="0"> <h:column> <f:facet name="header">First Name</f:facet> #{address.FIRSTNAME} </h:column> <h:column> <f:facet name="header">Last Name</f:facet> #{address.LASTNAME} </h:column> <h:column> <f:facet name="header">Street</f:facet> #{address.STREET} </h:column> <h:column> <f:facet name="header">City</f:facet> #{address.CITY} </h:column> <h:column> <f:facet name="header">State</f:facet> #{address.STATE} </h:column> <h:column> <f:facet name="header">Zip code</f:facet> #{address.ZIP} </h:column> </h:dataTable> 

AddressBean.java

 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.annotation.Resource; import javax.faces.bean.ManagedBean; import javax.sql.DataSource; import javax.sql.rowset.CachedRowSet; @ ManagedBean(name = "addressBean") public class AddressBean { // instance variables that represent one address private String firstName; private String lastName; private String street; private String city; private String state; private String zipcode; // allow the server to inject the DataSource @ Resource(name = "jdbc/addressbook") DataSource dataSource; // get the first name public String getFirstName() { return firstName; } // end method getFirstName // set the first name public void setFirstName(String firstName) { this.firstName = firstName; } // end method setFirstName // get the last name public String getLastName() { return lastName; } // end method getLastName // set the last name public void setLastName(String lastName) { this.lastName = lastName; } // end method setLastName // get the street public String getStreet() { return street; } // end method getStreet // set the street public void setStreet(String street) { this.street = street; } // end method setStreet // get the city public String getCity() { return city; } // end method getCity // set the city public void setCity(String city) { this.city = city; } // end method setCity // get the state public String getState() { return state; } // end method getState // set the state public void setState(String state) { this.state = state; } // end method setState // get the zipcode public String getZipcode() { return zipcode; } // end method getZipcode // set the zipcode public void setZipcode(String zipcode) { this.zipcode = zipcode; } // end method setZipcode // save a new address book entry public String save() throws SQLException { // check whether dataSource was injected by the server if (dataSource == null) throw new SQLException("Unable to obtain DataSource"); // obtain a connection from the connection pool Connection connection = dataSource.getConnection(); // check whether connection was successful if (connection == null) throw new SQLException("Unable to connect to DataSource"); try { // create a PreparedStatement to insert a new address book entry PreparedStatement addEntry = connection.prepareStatement("INSERT INTO ADDRESSES " + "(FIRSTNAME,LASTNAME,STREET,CITY,STATE,ZIP)" + "VALUES ( ?, ?, ?, ?, ?, ? )"); // specify the PreparedStatement's arguments addEntry.setString(1, getFirstName()); addEntry.setString(2, getLastName()); addEntry.setString(3, getStreet()); addEntry.setString(4, getCity()); addEntry.setString(5, getState()); addEntry.setString(6, getZipcode()); addEntry.executeUpdate(); // insert the entry return "index"; // go back to index.xhtml page } // end try finally { connection.close(); // return this connection to pool } // end finally } // end method save // return a ResultSet of entries public ResultSet getAddresses() throws SQLException { // check whether dataSource was injected by the server if (dataSource == null) throw new SQLException("Unable to obtain DataSource"); // obtain a connection from the connection pool Connection connection = dataSource.getConnection(); // check whether connection was successful if (connection == null) throw new SQLException("Unable to connect to DataSource"); try { // create a PreparedStatement to insert a new address book entry PreparedStatement getAddresses = connection.prepareStatement( "SELECT FIRSTNAME, LASTNAME, STREET, CITY, STATE, ZIP " + "FROM ADDRESSES ORDER BY LASTNAME, FIRSTNAME"); CachedRowSet rowSet = new com.sun.rowset.CachedRowSetImpl(); rowSet.populate(getAddresses.executeQuery()); return rowSet; } // end try finally { connection.close(); // return this connection to pool } // end finally } // end method getAddresses } // end class AddressBean 

数据库SQL

 DROP TABLE Addresses; CREATE TABLE Addresses ( AddressID INT NOT NULL GENERATED ALWAYS AS IDENTITY, FirstName VARCHAR (30) NOT NULL, LastName VARCHAR (30) NOT NULL, Street VARCHAR (150) NOT NULL, City VARCHAR (30) NOT NULL, State VARCHAR (2) NOT NULL, Zip VARCHAR (5) NOT NULL, PRIMARY KEY (AddressID) ); INSERT INTO Addresses (FirstName,LastName,Street,City,State,Zip) VALUES ('Bob','Green','5 Bay St.','San Francisco','CA','94133'), ('Liz','White','100 5th Ave.','New York','NY','10011'), ('Mike','Brown','3600 Delmar Blvd.','St. Louis','MO','63108'), ('Mary','Green','300 Massachusetts Ave.','Boston','MA','02115'), ('John','Gray','500 South St.','Philadelphia','PA','19147'), ('Meg','Gold','1200 Stout St.','Denver','CO','80204'), ('James','Blue','1000 Harbor Ave.','Seattle','WA','98116'), ('Sue','Black','1000 Michigan Ave.','Chicago','IL','60605'); 

首先,我将创建一个新的托管bean,它可能是@ViewScoped ,它具有一个AddressBean对象列表(不要忘记getter / setter):

private ArrayList <AddressBean> addresses = new ArrayList <AddressBean>();

然后,我将把您的getAddresses()方法移到这个新bean上并对其进行更改,以使其遍历查询的ResultSet ,创建AddressBean对象,然后将它们添加到地址ArrayList 然后,我将在新的“ View Bean”的构造函数中对此getAddresses()方法进行调用,以便在实例化Bean时从数据库中加载地址。

注意:因此,有一个具有getters / setter的AddressBean托管bean,然后有另一个“ View Bean”,后者调用该方法来加载数据库记录并将AddressBean对象存储在ArrayList 以及使用数据库,Java和Web级别(数据访问层,业务层和UI Bean层等)之间的集成层来构造项目的方法。

然后,您在xhtml中的数据表将从以下位置更改:

<h:dataTable value="#{addressBean.addresses}" var="address" rowClasses="oddRows,evenRows" headerClass="header" styleClass="table" cellpadding="5" cellspacing="0">

至:

<h:dataTable value="**#{addressViewBean.addresses}**" var="address" rowClasses="oddRows,evenRows" headerClass="header" styleClass="table" cellpadding="5" cellspacing="0">

编辑:为了回应您的评论,您可以执行以下操作:

声明一个带有上述“ View bean”顶部的getter / setter的AddressBean对象:

private AddressBean addressBean;

然后在您的连接到数据库并加载记录的view bean方法中,执行以下操作。

while(rowSet.next())
{
    addressBean= new AddressBean(rowSet.getString("FirstName"), rowSet.getString("LastName"), rowSet.getString("Street"), rowSet.getString("City"), rowSet.getString("State"), rowSet.getString(("Zip"));
    addresses.add(addressBean);
}

将上面的代码放在

 rowSet.populate(getAddresses.executeQuery());

并将返回类型更改为void。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM