2

データベースレコードをArrayListに入れるにはどうすればよいですか?jspファイルで表示したい。ただし、ArrayList内のすべてのオブジェクトの値は、選択したデータベース内の最後のレコードと同じです。

私のプロジェクトには次のコードがあります。

IPBean.java

public class IPBean {
    private String ip;
    private String userName;
    private String password;
    private int maxRetry;    

    public String getIp() {
        return ip;
    }    
    protected void setIp(String ip) {
        this.ip = ip;
    }    
    public String getUserName() {
        return userName;
    }    
    protected void setUserName(String userName) {
        this.userName = userName;
    }    
    public String getPassword() {
        return password;
    }    
    protected void setPassword(String password) {
        this.password = password;
    }    
    public int getMaxRetry() {
        return maxRetry;
    }    
    protected void setMaxRetry(int maxRetry) {
        this.maxRetry = maxRetry;
    }    
}

IPBeanMapper.java

import java.sql.*;
import java.util.ArrayList;

public class IPBeanMapper {
    public ArrayList<IPBean> getIPList() throws SQLException, ClassNotFoundException {
        ArrayList<IPBean> ipList = new ArrayList<IPBean>();
        Connection conn = null;
        conn = ConnectionTools.getConnection();
        String SQL = "SELECT * FROM LIST_IPM";
        Statement statement = conn.createStatement();
        ResultSet rs = statement.executeQuery(SQL);
        IPBean ipBean = new IPBean();

        while (rs.next()){

            ipBean.setIp(rs.getString("IP"));
            ipBean.setMaxRetry(rs.getInt("NUM_OF_RETRY"));
            ipBean.setPassword(rs.getString("PASSWORD"));
            ipBean.setUserName(rs.getString("USERNAME"));

            ipList.add(ipBean);

        }
        ConnectionTools.attemptClose(rs);
        ConnectionTools.attemptClose(statement);
        ConnectionTools.attemptClose(conn);
        System.out.print(ipList.size());
        return ipList;
    }
}

View.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" import="DSIP.*" import="java.util.ArrayList" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>DSIP.Insert</title>
</head>

<body>
<jsp:useBean id="ipList" scope="application" class="IPBeanMapper"/>
<jsp:useBean id="bean" scope="application" class="IPBean"/>
<form name="form1" method="post" action="viewServlet">
    <table width="" border="">
        <tr bgcolor="#0099FF">
            <td width="90"><div align="center">ip</div></td>
            <td width="90"><div align="center">username</div></td>
            <td width="90"><div align="center">password</div></td>
            <td width="90"><div align="center">maxRetry</div></td>
        </tr>
        <%
            ArrayList<IPBean> list;
            list = ipList.getIPList();
            for (int i = 0; i < list.size(); i++){
                bean = list.get(i);
        %>
        <tr>
            <td><input name="ip"        type="text" size="15" value="<%=list.getIp()%>"></td>
            <td><input name="userName"  type="text" size="15" value="<%=bean.getUserName()%>"></td>
            <td><input name="password"  type="text" size="15" value="<%=bean.getPassword()%>"></td>
            <td><input name="maxRetry"  type="text" size="15" value="<%=bean.getMaxRetry()%>"></td>
        </tr>
        <%
            }
        %>
    </table>
</form>
</body>
</html>

私のブラウザの結果は、実際には同じではないのに、最初と2番目のレコードが同一であることを示しています。だから、誰かが私がデータベースからの実際の記録を示すのを手伝ってください。

私の結果を見るには:http://i.stack.imgur.com/2lIM9.png

助けてくれてありがとう。

よろしくお願いします、

ファイザルリズキー

4

4 に答える 4

4

変化する

   IPBean ipBean = new IPBean(); 

    while (rs.next()){

 while (rs.next()){

 IPBean ipBean = new IPBean();

これにより、行ごとに新しいインスタンスが作成されます。これは必須です。それ以外の場合は、単一のインスタンスでデータをオーバーライドし続けます。

于 2012-06-29T08:52:53.533 に答える
2

IPBean ipBean = new IPBean();これをwhileループの中に入れる必要があります

したがって、コードは次のようになります-

IPBeanMapper.java

while (rs.next()){ 
IPBean ipBean = new IPBean();   
.
.

同じオブジェクト参照がリストに追加されるという問題。したがって、すべての初期エントリは最後のレコードと同じです。

于 2012-06-29T08:52:39.390 に答える
1

私はあなたが全体を置く必要はないと思います

ipBean bean = new IPBean();

ループに。それは悪い習慣です。宣言するだけ

ipBean ipBean;

while(rs.next()){
      bean = new ipBean();
} 
于 2012-06-29T09:01:50.767 に答える
0
    IPBean ipBean = new IPBean();

    while (rs.next()){

        ipBean.setIp(rs.getString("IP"));

行ごとに新しいインスタンスを作成する必要があります。new IPBeanループの内側を移動します。そうしないと、最後の反復で設定した値を使用して、リストに同じインスタンスが複数回表示されることになります。

于 2012-06-29T08:53:16.487 に答える