【问题标题】:unable to add object into arraylist无法将对象添加到数组列表中
【发布时间】:2012-10-30 16:59:04
【问题描述】:

我正在尝试将一个对象添加到会话中存储的 ArrayList 中。

对象似乎没有被添加。

请检查我下面的代码,并为此建议我一个正确的答案。

在调试时,我的调试器会一直运行到此代码 books.add(book);,然后它会跳过剩余的代码。我知道问题出在books.add(book); 。书籍详情未添加到我的数组列表中books。

AddBookToSession.java

    public class AddBookToSession extends ActionSupport {
         Bookdetails book=new Bookdetails();
            List<Bookdetails> books = new ArrayList<Bookdetails>();

            BookdetailsDAO dao = new BookdetailsDAO(); 
      Map session = ActionContext.getContext().getSession();

        public String execute()
        { 
            HttpServletRequest request = ServletActionContext.getRequest();  
            String bookid = request.getParameter("bid");    
            books = (List) session.get( BillTransactionBooksConstants.BOK ); 
          for(int i=1;i<=1;i++)
        {
          book = dao.listBookDetailsById(Integer.parseInt(bookid));    
          books.add(book); //problem is here obj book is not adding into books list

          books = new ArrayList<Bookdetails>();

          System.out.println("---------------Bookid-"+book); 
        }
        ....................
                ...............

struts.xml

        <package name="testwithrowselect" extends="struts-default" >  
                    <action name="InsertbooksToSession" class="v.esoft.actions.booktransaction.AddBookToSession">
                        <result name="success">/jspHomepage/bookstransaction/shortBill.jsp</result>  
                    </action>
         </package>

【问题讨论】:

  • 看起来错误在下一行:books = new ArrayList&lt;Bookdetails&gt;();。
  • 另外,这两行没有意义:session.put(BillTransactionBooksConstants.BOK, books ); books = (List) session.get( BillTransactionBooksConstants.BOK );。您创建一个新的List&lt;Bookdetails&gt;,将其保存在会话中并检索它。您如何期望仍然拥有第一个列表?
  • @LuiggiMendoza 有了这两行,我将列表添加到我的会话中以创建客户账单.. 此链接中的更多详细信息 (stackoverflow.com/questions/13320293/…)
  • 虽然这个问题与 struts 2 无关,但请花一些时间来了解使用框架的更好方法。
  • @AshutoshSingh 您不需要将列表添加回会话,因为如果您更新其中一个对象(包含列表和列表的会话属性)都指向相同的内存位置他们另一个同时更新。

标签: java list struts2 arraylist


【解决方案1】:

您向会话添加一个新的空列表:

for (int i = 1; i <= 1; i++) {
    book = dao.listBookDetailsById(Integer.parseInt(bookid));    
    books.add(book);
    books = new ArrayList<Bookdetails>(); // <-- Now it's a new, empty list?!
}
session.put(BillTransactionBooksConstants.BOK, books);

也就是说,您的操作代码应该看起来更接近这个(未经测试):

public class AddBookToSession extends ActionSupport implements SessionAware {

    private Integer bid;
    private Map<String, Object> session;

    private BookdetailsDAO dao = new BookdetailsDAO(); 

    public String execute() { 
        BookDetails book = dao.listBookDetailsById(Integer.parseInt(bookid));
        if (book != null) {
            List<Bookdetails> books = sessionBooks();
            books.add(book);
        }

        return SUCCESS;
    } 

    private List<Bookdetails> sessionBooks() {
        List<Bookdetails> books = (List) session.get(BillTransactionBooksConstants.BOK);
        if (books == null) {
            books = new ArrayList<BookDetails>();
            session.put(BillTransactionBooksConstants.BOK, books);
        }
        return books;
    }

    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    public Integer getBid() {
        return this.bid;
    }

    public void setBid(Integer bid) {
        this.bid = bid;
    }
}

请注意,像这样实例化书籍 DAO 可能会使测试变得比必要的更困难。

【讨论】:

  • 我测试了这段代码没问题。但是我需要getter setter才能将书籍列表设置到我的jsp页面中,然后只有我可以将添加的迭代列表显示到我的jsp中。我怎样才能在这门课上做getter setter?
  • 列表大小正确 -> .... if (book != null) { List&lt;Bookdetails&gt; books = sessionBooks(); HttpServletRequest request = ServletActionContext.getRequest(); books.add(book); System.out.println("books size"+books.size()); } return SUCCESS;}
  • @AshutoshSingh 如何创建吸气剂?通过创建一个吸气剂。你不需要二传手。只需将 books 设为操作属性而不是方法属性即可。
  • 或者告诉我如何使用 struts2 标签在 jsp 中显示我的会话列表。例如。我想显示我在会话中添加的具有此名称的列表 -BillTransactionBooksConstants.BOK-
  • 你告诉我“让书籍成为动作属性而不是方法属性”。这是什么意思?请详细解释一下
猜你喜欢
  • 1970-01-01
  • 2013-09-03
  • 2012-08-02
  • 2020-11-21
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多