想使用s2sh实现分页功能,相关代码如下:
index.jsp代码
<a href="pageuser.action">显示更多...</a>
struts.xml配置
<action name="pageuser" class="UserAction" method="PageUser">
     <result name="success">listView.jsp</result>
</action>
applicationContext.xml配置
<bean id="UserAction" class="action.UserAction" scope="prototype">
    <property name="userManager" ref="userManager"></property>
</bean>
<bean id="userManager" class="service.impl.UserManagerImpl">
    <property name="userDao" ref="userDao"></property>
</bean>
<bean id="daoTemplate" abstract="true">
     <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="userDao" parent="daoTemplate" class="dao.impl.UserDaoImpl"/>
<bean id="pageDao" parent="daoTemplate" class="dao.impl.PageDaoImpl"/>
UserAction.java配置
import service.UserManager;  
import common.Page;
public class UserAction extends ActionSupport implements ModelDriven<User>
{
        private int pageNo;//第几页
        private Page page;//包含分页信息的bean 
                private UserManager userManager;
        ......pageNo和page的getter和setter方法......
        public void setUserManager(UserManager userManager) 
        {
             this.userManager = userManager; 
        }
        public String PageUser()
        {
            this.page = userManager.queryForPage(2,1);
            return SUCCESS;
        }
                ......
}Page.java代码
public class Page 
{   
    private int firstPage;//首页
    private int previewPage;//上一页
    private int nextPage;//下一页 
    private int endPage;//尾页
    private int currentPage;//当前页
    private int totalPage;//总页面数   
    private int pageSize;//每页记录数 
    private int resultRows;//总记录数
    private int startRowid;//页面开始记录号
    
    private boolean isFirstPage;//是否为第一页 
    private boolean isLastPage;//是否为最后一页 
    private boolean hasPreviewPage;//是否有前一页 
    private boolean hasNextPage;//是否有下一页 
    
        @SuppressWarnings("unchecked")
        private List list;
    
    public void init()
    {
        this.firstPage = 1;
        this.endPage = this.totalPage; 
        
        this.isFirstPage = isFirstPage();
        this.isLastPage = isLastPage();
        this.hasPreviewPage = HasPreviewPage();
        this.hasNextPage = HasNextPage();
        
        if(this.isFirstPage){this.firstPage = 1 ;}
        if(this.isLastPage){this.endPage = this.totalPage;}
        if(this.hasPreviewPage){this.previewPage = currentPage - 1;
        }else{this.previewPage = this.firstPage;}
        if(this.hasNextPage){
                this.nextPage = this.firstPage + 1 ;
        }else{this.nextPage = this.endPage;}  
    }   
     
        public boolean isFirstPage() {return currentPage == 1;} 
        public boolean isLastPage() {return currentPage == totalPage;}
        public boolean HasPreviewPage() {return currentPage != 1;} 
        public boolean HasNextPage() {return currentPage != totalPage;} 
    
    public void first(){   
        this.currentPage = 1;   
    }   
       
    public void next(){   
        if(this.currentPage+1 > this.endPage){   
            this.currentPage = this.endPage;   
        }else{   
            this.currentPage++;   
        }   
    }   
       
    public void previous(){   
        if(this.currentPage -1 < 1){   
            this.currentPage = 1;   
        }else{   
            this.currentPage--;   
        }   
    }   
       
    public void end(){   
        this.currentPage = this.endPage;   
    }   
       
    public void inputPageIndex(int inputPageIndex){   
        this.currentPage = inputPageIndex;   
    }   
       
    public void direct(String directPage){   
        if("first".equals(directPage)){   
            this.first();   
        }   
           
        if("next".equals(directPage)){   
            this.next();   
        }   
           
        if("previous".equals(directPage)){   
            this.previous();   
        }   
           
        if("end".equals(directPage)){   
            this.end();   
        }   
    }    
    
    //参数的setter和getter
    public int getFirstPage() {   
        return firstPage;   
    }   
    public void setFirstPage(int firstPage) {   
        this.firstPage = firstPage;   
    }   
  
    public int getPreviewPage() {   
        if(currentPage==1){   
            previewPage=currentPage;   
        }else{   
            previewPage=currentPage-1;   
        }   
        return previewPage;   
    }
    public void setPreviewPage(int previewPage) {   
        this.previewPage = previewPage;   
    }       public int getNextPage() {   
        if(currentPage==totalPage){   
            nextPage=currentPage;   
        }else{   
            nextPage=currentPage+1;   
        }   
        return nextPage;   
    }   
    public void setNextPage(int nextPage) {   
        this.nextPage = nextPage;   
    }   
    
    public int getEndPage() {   
        return endPage;   
    }
    public void setEndPage(int endPage) {   
        this.endPage = endPage;   
    } 
    
    public int getCurrentPage() { 
            if(currentPage<=0){currentPage = 1;}
            if(currentPage>this.totalPage){currentPage = this.totalPage;}
        return currentPage;   
    }
    public void setCurrentPage(int currentPage) {
            if(currentPage<=0){currentPage = 1;}
            if(currentPage>this.totalPage){currentPage = this.totalPage;}
        this.currentPage = currentPage;
    }       public int getTotalPage() {
        if(resultRows%pageSize==0){   
            totalPage=resultRows/pageSize;   
        }else{   
            totalPage=resultRows/pageSize+1;   
        }   
        return totalPage;   
    }
    public void setTotalPage(int totalPage) {   
        this.totalPage = totalPage;   
    }   
  
    public int getPageSize() {   
        return pageSize;   
    }
    public void setPageSize(int pageSize) {   
        this.pageSize = pageSize;   
    }  
    
    public int getResultRows() {   
        return resultRows;   
    }
    public void setResultRows(int resultRows) {   
        this.resultRows = resultRows;   
    }   
    
    public int getStartRowid() {
            startRowid = pageSize*(currentPage-1);  
        return startRowid;
    }
    public void setStartRowid(int startRowid) { 
        this.startRowid = startRowid;   
    } 
    
    @SuppressWarnings("unchecked")
        public List getList() {   
        return list;   
    }
    @SuppressWarnings("unchecked")
        public void setList(List list) {   
        this.list = list;   
    }  
      
}  UserManagerImpl代码
public class UserManagerImpl implements UserManager 
{
     private UserDao userDao;
     public void setUserDao(UserDao userDao) {
           this.userDao = userDao; 
    }
    public Page queryForPage(int pageRecNum,int pageNo){ 
               Page pageBe = new Page();
               pageBe.setResultRows(userDao.pageForUserCount());
               pageBe.setPageSize(pageRecNum);
               pageBe.setCurrentPage(pageNo);
               pageBe.init(); 
               List<User> listus = userDao.pageForUser(pageBe.getStartRowid(),pageBe.getPageSize());
               pageBe.setList(listus);
               return pageBe; 
        }
......
}UserDao.java主要代码
        @SuppressWarnings("unchecked")
        public List<User> pageForUser(Integer offset, Integer pageSize)
        {
                String hql = "from User";
                return (List<User>)pageDao.findByPage(hql,offset,pageSize);
        }
        public int pageForUserCount()
        {
                String hql = "from User";
                return pageDao.getAllRowCount(hql);
        }
PageDao.java主要代码
   /**offset第一条记录索引pageSize 每页需要显示的记录数*/
    @SuppressWarnings("unchecked")
    public List findByPage(final String hql,final int offset, final int pageSize)
    {
           List list = getHibernateTemplate().executeFind(new HibernateCallback()
            {
                public Object doInHibernate(Session session) throws HibernateException, SQLException
                {
                    List result = session.createQuery(hql)
                                         .setFirstResult(offset)
                                         .setMaxResults(pageSize)
                                         .list();
                    return result;
                }
            });
        return list;
    }
    /**根据hql查询所有记录数*/
    public int getAllRowCount(String hql)
     {
            return getHibernateTemplate().find(hql).size();
     } User.java主要代码(对应xml文件到数据表中)
               ...
        private int id;
        private String username;
        private String password;
               ...listView.jsp主要代码:
<s:iterator value="page.list" var="usr"> 
      <s:property value="usr.username"/>
</s:iterator> 
<hr/>
    共<s:property value="page.resultRows"/> 条记录 
    共<s:property value="page.totalPage"/> 页 
    当前第<s:property value="page.currentPage"/>页<br/> 
     
    <s:if test="%{page.currentPage == 1}"> 
      第一页 上一页 
    </s:if> 
    <s:else> 
      <a href="pageuser.action?page=1">第一页</a> 
      <a href="pageuser.action?page=<s:property value="%{page.currentPage-1}"/>">上一页</a> 
    </s:else> 
    <s:if test="%{page.currentPage != page.totalPage}"> 
      <a href="pageuser.action?page=<s:property value="%{page.currentPage+1}"/>">下一页</a> 
      <a href="pageuser.action?page=<s:property value="page.totalPage"/>">最后一页</a> 
    </s:if> 
    <s:else> 
      下一页 最后一页 
    </s:else>
错误提示:
java.lang.NullPointerException 
    dao.impl.UserDaoImpl.pageForUserCount(UserDaoImpl.java:91)
    错误就是指向:return pageDao.getAllRowCount(hql);这句
我该如何修正错误?

解决方案 »

  1.   

    不知道你的pageDao是否注入了?
      

  2.   

    pageDao 为null...是没注入或者注入错了
      

  3.   

    已经注入了呀
    在applicationContext.xml中有
    <bean id="pageDao" parent="daoTemplate" class="dao.impl.PageDaoImpl"/>PageDaoImpl主要代码为:package dao.impl;
    import dao.PageDao;import java.util.List;
    import java.sql.SQLException;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.springframework.orm.hibernate3.HibernateCallback;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class PageDaoImpl extends HibernateDaoSupport implements PageDao
    {
       /**offset第一条记录索引pageSize 每页需要显示的记录数*/
        @SuppressWarnings("unchecked")
        public List findByPage(final String hql,final int offset, final int pageSize)
        {
               List list = getHibernateTemplate().executeFind(new HibernateCallback()
                {
                    public Object doInHibernate(Session session) throws HibernateException, SQLException
                    {
                        List result = session.createQuery(hql)
                                             .setFirstResult(offset)
                                             .setMaxResults(pageSize)
                                             .list();
                        return result;
                    }
                });
            return list;
        }
        .......
    }
      

  4.   

    在PageDaoImpl.java中还有这个方法,上面忘了加上
        /**根据hql查询所有记录数*/
        public int getAllRowCount(String hql)
         {
         return getHibernateTemplate().find(hql).size();
         } 
      

  5.   

    public int getAllRowCount(String hql)
      {
      return getHibernateTemplate().find(hql).size();
      }  
    中的getHibernateTemplate().find(hql)返回的list应该为null吧
      

  6.   

    在方法public int getAllRowCount(String hql)设置个断点 debug单步调试一下。public int getAllRowCount(String hql)
      {
       List list=getHibernateTemplate().find(hql);
       if(list!=null){
          return list.size();
       }
       return 0;
      }   
      

  7.   

    看看调用pageDao的类是否添加了pageDao的setter方法