1

私はここで何時間も検索してきましたが、残念ながらデータベースレコードをデータテーブルに表示する方法がわかりません。私はJSFの初心者で、現在JSFについてあまり知りませんが、単純なクラッドアプリケーションを構築していますJSFを使用してレコードを作成、削除する方法はすでに知っていますが、このレコードをデータテーブルに表示するのに問題があります。私はarraylistを作成しようとしました、私はこれのために別のクラスを作成しようとしました、それをより明確にするために、ここに私のコードがあります:

これは私の index.jsf です:

<?xml version='1.0' encoding='windows-1252'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <h:head></h:head>
        <h:body>
            Username: 
            <h:outputText value="#{ backing_index.userName }" id="Username">
                <p>
                    &nbsp;
                </p>
                <p>
                    &nbsp;
                </p>
                <p>
                    &nbsp;
                </p>
            </h:outputText>
            <p>
                RoleI.D: 
                <h:outputText value="#{backing_index.roleId}" id="RoleID"/>
            </p>
            Role Description: 
            <h:outputText  value="#{backing_index.roleDesc}" id="Description"/>

            <h:dataTable value="#{ backing_index.tableRs }" var="user" rules="rows" cellpadding="7">
                <f:facet name="header"></f:facet>
                <f:facet name="footer"></f:facet>

                <h:column>
                    <f:facet name="header">ID</f:facet>
                    #{ user.tableId }
                </h:column>

                <h:column>
                    <f:facet name="header">First Name</f:facet>
                     #{ user.tableFirstName }
                </h:column>

                <h:column>
                    <f:facet name="header">Middle Name</f:facet>
                     #{ user.tableMiddleName }
                </h:column>

                <h:column>
                    <f:facet name="header">Last Name</f:facet>
                     #{ user.tableLastName }
                </h:column>

                <h:column>
                    <f:facet name="header">Delete</f:facet>
                    <h:commandButton action="#{ backing_index.deleteAction }" value="Remove this">
                        <f:param value="Remove" name="delete" />
                    </h:commandButton>
                </h:column>

            </h:dataTable>
        </h:body>
    </html>
    <!--oracle-jdev-comment:auto-binding-backing-bean-name:backing_index-->
</f:view>

Beanのコードは次のとおりです。

package view.backing;

import javax.faces.component.html.HtmlOutputText;
import javax.faces.bean.*;
import javax.faces.context.*;
import javax.annotation.*;
import javax.faces.*;
import java.sql.*;
import java.util.*;

@RequestScoped

public class Index {

private Connection con;
private ResultSet rs;

private String userName;
private String roleId;
private String roleDesc;

//Variable of Data Table
private TableUser[] tableRs;
//End of Variable


//Start of getter and setter for Data table

public void setTableRs(Index.TableUser[] tableRs) {
    this.tableRs = tableRs;
}

public Index.TableUser[] getTableRs() {
    return tableRs;
}

//End of getter and setter


public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserName() {
    return userName;
}

public void setRoleId(String roleId) {
    this.roleId = roleId;
}

public String getRoleId() {
    return roleId;
}

public void setRoleDesc(String roleDesc) {
    this.roleDesc = roleDesc;
}

public String getRoleDesc() {
    return roleDesc;
}

@PostConstruct
public void init()throws SQLException, ClassNotFoundException{

    Class.forName("oracle.jdbc.driver.OracleDriver");
    con = DriverManager.getConnection("jdbc:oracle:thin:@localhost/XE", "JEROME", "perbert101");
    displayUserInfo();
    displayTableRecords();
}

private void displayUserInfo()throws SQLException{
    FacesContext context = FacesContext.getCurrentInstance();
    userName = (String)context.getExternalContext().getSessionMap().get("userName");
    roleId = (String)context.getExternalContext().getSessionMap().get("roleId");

    Statement state = con.createStatement();
    state.executeQuery("SELECT * FROM ROLES WHERE ID = 2");
    rs = state.getResultSet();
    while(rs.next()){
        roleDesc = rs.getString(3);
    }

}

private void displayTableRecords()throws SQLException{
    String query = "SELECT * FROM USERS";
    PreparedStatement state = con.prepareStatement(query);
    state.execute();
    rs = state.getResultSet();
    while(rs.next()){
        tableRs = new TableUser[]{new TableUser(rs.getLong(1), rs.getString(2), rs.getString(7), rs.getString(5))};

    }

}

//Table Records Store
public static class TableUser{
    long tableId;
    String tableFirstName;
    String tableMiddleName;
    String tableLastName;

    public TableUser(long tableId, String tableFirstName, String tableMiddleName, String tableLastName){
        this.tableId = tableId;
        this.tableFirstName = tableFirstName;
        this.tableMiddleName = tableMiddleName;
        this.tableLastName = tableLastName;
    }

    public void setTableId(long tableId) {
        this.tableId = tableId;
    }

    public long getTableId() {
        return tableId;
    }

    public void setTableFirstName(String tableFirstName) {
        this.tableFirstName = tableFirstName;
    }

    public String getTableFirstName() {
        return tableFirstName;
    }

    public void setTableMiddleName(String tableMiddleName) {
        this.tableMiddleName = tableMiddleName;
    }

    public String getTableMiddleName() {
        return tableMiddleName;
    }

    public void setTableLastName(String tableLastName) {
        this.tableLastName = tableLastName;
    }

    public String getTableLastName() {
        return tableLastName;
    }
}

}

エラーなどはなく、データベースの最後のレコードのみが表示されます。みんな、最も簡単な方法を知っていれば、その方法を教えてもらえますか。私はいつも、きれいで短いコードを求めています。あなたの助けは本当に大歓迎です:)

4

1 に答える 1

3

displayTableRecords() メソッドにバグがあります。while ループ内で、反復ごとに新しい TableUser 配列をインスタンス化します。実際にすべきことは、既存の配列に TableUser オブジェクトを 1 つずつ追加することです。

配列の代わりに ArrayList を使用します。

private List<TableUser> tableRs = new ArrayList<TableUser>();

public List<TableUser> getTableRs() {
    return tableRs;
}

public void setTableRs(List<TableUser> tableRs) {
    this.tableRs = tableRs;
}

private void displayTableRecords() {
    String query = "SELECT * FROM USERS";
    PreparedStatement state = con.prepareStatement(query);
    state.execute();
    rs = state.getResultSet();
    while (rs.next()) {

        tableRs.add(new TableUser(rs.getLong(1),
                rs.getString(2), rs.getString(7), rs.getString(5)));

    }
}
于 2012-11-06T08:13:02.260 に答える