JSF DataTable不显示数据库

时间:2015-03-18 08:50:46

标签: java jsf

我遇到了一种方法,我可以在网站上显示数据库中的数据。但是,我遵循了一个例子,即创建一个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>
&#13;
&#13;
&#13;

AddressBean.java

&#13;
&#13;
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
&#13;
&#13;
&#13;

数据库SQL

&#13;
&#13;
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');
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

首先,我会创建一个新的托管bean,可能是@ViewScoped,其中包含AddressBean个对象列表(不要忘记getter / setter):

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

然后我会将你的getAddresses()方法移动到这个新bean并进行更改,以便迭代查询的ResultSet,创建AddressBean个对象,然后将它们添加到地址中ArrayList。然后,我将在新的&#34; View Bean&#34;的构造函数中调用此getAddresses()方法。以便在实例化bean时加载数据库中的地址。

注意:所以有一个AddressBean托管bean带有getter / setter,然后是另一个&#34; View Bean&#34;它调用方法来加载数据库记录并将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">

编辑:在回复您的评论时,您可以执行以下操作:

在前面提到的&#34; View bean&#34;:

的顶部用getter / setter声明一个AddressBean对象
private AddressBean addressBean;

然后在你的视图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。