日期:2014-05-20  浏览次数:20794 次

javascript如何遍历后台request传过来的List对象
最近在做基于struts2的网上书店的设计,做到分页查询这块就卡住了,设计思路如下:

1、对book表进行操作,首先将表中查询到的每一行数据进行封装成Book型的对象book,再用List.add(book)进行保存并返回List型的对象books;

2、为了避免每次分页查询都要读取表中的数据,将books用servlet中的request.setAttribute进行保存。

具体实现代码如下:
UserDAO.Java
Java code
public List<Book> readBook(String sql,List<Book> books){
        con = DatabaseDAO.getCon();
        try{
            pt = con.prepareStatement(sql);
            rs = pt.executeQuery();
            while(rs.next())
            {
                Book book = new Book();
                book.setBookId(rs.getInt("bookId"));
                book.setBookNumber(rs.getString("bookNumber"));
                book.setBookName(rs.getString("bookName"));
                book.setBookAuthor(rs.getString("bookAuthor"));
                book.setBookPress(rs.getString("bookPress"));
                book.setBookPicture(rs.getString("bookPicture"));
                book.setBookAmount(rs.getInt("bookAmount"));
                book.setBookType(rs.getString("bookType"));
                book.setBookPrice(rs.getDouble("bookPrice"));
                book.setBookRemark(rs.getString("bookRemark"));
                book.setBookSales(rs.getInt("bookSales"));
                book.setBookPublishTime(rs.getDate("bookPublishTime"));
                books.add(book);
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DatabaseDAO.closeRs(rs);
            DatabaseDAO.closePt(pt);
            DatabaseDAO.closeCon(con);
        }
        
        return books;
    }


SearchAction.java
Java code
public List<Book> search() throws Exception{
        UserDAO userDao = new UserDAO();
        List<Book> booksTemp = userDao.searchBook(book,searchType);
        if( booksTemp != null){
            books = booksTemp;
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("books", books);
            return books;
        }else{
            return null;
        }
    }


如果有更好的方法可以读取List中的数据,大家都可以提出来

------解决方案--------------------
为什么要放js里遍历啊。
直接页面里就可以遍历了呀。
Java code
 
//放在session里了
 request.[color=#FF0000]getSession()[/color].setAttribute("books", books);

------解决方案--------------------
这就是JSON,直接写可用的。
var data = [
{name:"123", age:23}.
{name:"123", age:23}
]

alert(data[0].name);


问题在于如何将List转为上面看到的JSON结构,你可以用开源包来处理:
http://json-lib.sourceforge.net/

示范代码的话,网上Google应该大把。
------解决方案--------------------
Java code
List<Book> booksTemp = userDao.searchBook(book,searchType);
response.setCharacterEncoding("utf-8");
PrintWriter write = response.getWriter();
JSONArray js = null;
js = JSONArray.fromObject(booksTemp.toArray());
write.write(js.toString());
js.clear();
write.flush();
write.close();

------解决方案--------------------
不太明白lz的意思,lz想实现分页,而且不用每次都查询数据库,跟用不用js没有关系。

只要你不重复请求数据库,就可以。
不过,问题来了。

你要将数据存储在什么范围内?

对于多线程并发访问,分页是否会出现数据不正确呢?

如果是单纯的单线程,lz可以考虑 将分页信息list做成单例模的,这个单例,大家共用。

只要有一个人进来调用了分页,那么单例中就有分页信息了。

下一个人进来的时候(包括你),在调用分页之前,先去list中查询是否有,如果有,则直接拿出,没有的话,再查询数据库。

这种思路会比较好。


不过要是多线程并发访问,你就要考虑数据一致性问题了。