1

我正在使用 JSP、JSTL、Servlets 和 JavaBeans 编写一个网站。

在我的代码的某个时刻,我试图使用对象的 ArrayList,并且发生了一件奇怪的事情:当我添加第一个对象时它很好,当我添加第二个对象时它在第二个位置添加它,但是index(0) 处的对象与 index(1) 处的对象获得相同的值。

也许问题出在

ArrayList<Article> articleList = new ArrayList<Article>();
Article newArticle = new Article();

由于 articleList 是 Article 类的 ArrayList。

有人可以指出我做错了什么吗?

下面是我的代码:

public ArrayList<Article> getArticles()
{
    baseIO mySql = new baseIO();
    ArrayList<Article> articleList = new ArrayList<Article>();
    int articleId = 0;

    try
    {
        String sql =
            "select * from jsp_blog_article order by article_id Desc Limit 3";
        con = (Connection)mySql.getConnection();
        pstmt = (PreparedStatement) con.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        while (rs.next()) {
            Article newArticle = new Article();
            newArticle.setArticleAuthor(rs.getString("article_name"));
            newArticle.setArticleBody(rs.getString("article_body"));
            newArticle.setArticleAuthor(rs.getString("article_author"));
            newArticle.setArticleDate(rs.getString("article_date"));
            articleId = Integer.parseInt(rs.getString("article_id"));
            newArticle.setArticleId(String.valueOf(articleId));
            newArticle.setArticleComments(this.getCommentsNum(articleId));
            articleList.add(newArticle);
        }
        con.close();
        pstmt.close();
    }
    catch(Exception e)
    {
        return null;
    }

    return articleList;
}

和文章类

package objects;

import java.io.Serializable;

public class Article implements Serializable{
    private String articleName;
    private String articleBody;
    private String articleAuthor;
    private String articleComments;
    private String articleDate;
    private String articleId;

    public Article()
    {

    }

    // all the getters and setters in place, but it is too long
    // so i am not going to post them in forum

}
4

5 回答 5

1

您正在调用 newArticle.setArticleAuthor 两次...我知道这不是您的列表问题的一部分,但这是一个观察结果。

于 2009-06-06T03:41:00.960 回答
1

我会尝试这种方式,看看它有什么作用。

int x = 0;
while (rs.next()) {
    articleList.add(new Article());
    articleList.get(x).setArticleName(rs.getString("article_name"));
    articleList.get(x).setArticleBody(rs.getString("article_body"));
    articleList.get(x).setArticleAuthor(rs.getString("article_author"));
    articleList.get(x).setArticleDate(rs.getString("article_date"));
    articleList.get(x).setArticleId(rs.getString("article_id"));
    articleList.get(x).setArticleComments(this.getCommentsNum(articleId));
    x++;
}
于 2009-06-06T03:46:35.143 回答
1

应该根据其他注释清理代码,但从功能上讲,它应该可以工作。

这就是我认为正在发生的事情。

您的代码中有以下两行:

newArticle.setArticleAuthor(rs.getString("article_name"));
newArticle.setArticleAuthor(rs.getString("article_author"));

并且没有相应的调用:

newArticle.setArticleName(rs.getString("article_name"));

这意味着您的对象没有指定文章名称(即使指定了作者)。我敢打赌,在显示以某种方式合并具有相同名称的文章的列表之前,您正在执行某种处理。

作为调试的一般方法,我建议您模拟您的代码,以便您可以在调试器中运行它并查看实际发生的情况(现在,您的系统有很多活动部件,您很难磨练在实际问题上)。

在当前情况下,这就像在 Web 容器之外运行一个方法一样简单,并使用调试器查看列表中返回的对象。您会发现列表中的对象确实是独立的对象 - 只是具有相同的 articleName 属性。

于 2009-06-06T14:07:58.760 回答
0

代码看起来不错,您如何显示使您认为两个索引处具有相同值的列表?也许您的问题在于该代码。

于 2009-06-06T04:17:37.993 回答
0

您是否在阅读文章的同时将文章添加到数据库?我认为,根据您的存储引擎,您可能会在更新过程中遇到阅读问题。

于 2009-06-06T04:24:49.883 回答