JSP和servlet的分页查询

1 介绍

由于在项目里采用的是分层的设计,所以这里包括dao,业务组件,servlet等。这里使用mysql,每种dbms的分页查询可能不一样。


2 dao

@Override
    public List<T> readByLimit(int pageNo, int countPerPage,String sortColumn,int sortType)
            throws DaoException {
        
        if(pageNo != 0 && countPerPage != 0)
        {
            Connection connection = null;
            PreparedStatement pstm = null;
            ResultSet set = null;
            
            try {
                
                connection = C3P0Util.getConnection();
                
                String sql = "select * from "+table_name;
                
                if(sortType == IGenericDao.ASC)//判断升序还是降序
                {
                    sql = sql+" order by "+sortColumn+" asc limit ?,?;";
                }
                else {
                    sql = sql+" order by "+sortColumn+" desc limit ?,?;";
                }
                
                pstm = connection.prepareStatement(sql);
                
                int start = (pageNo - 1) * countPerPage;//起始条数
                pstm.setInt(1,start);
                pstm.setInt(2, countPerPage);
                set = pstm.executeQuery();
                /**
                 * 创建对象列表
                 */
                if(set != null)
                {
                    List<T> list = new ArrayList<>();
                    Class tempType = type;
                    while(set.next())
                    {
                        Object temp = tempType.newInstance();//实例化一个类用于获取field的值
                        
                        Field[] fields = tempType.getDeclaredFields();
                        
                        for(int i=0;i<fields.length;i++)
                        {
                            fields[i].setAccessible(true);//设置field可访问
                            fields[i].set(temp, set.getObject(fields[i].getName()));//设置field的值
                        }
                        list.add((T)temp);
                    }
                    
                    return list;
                }
                throw new DaoException("Empty result");
                
            } catch (Exception e) {
                e.printStackTrace();
                throw new DaoException("Query Error");
            }
            finally{
                
                C3P0Util.close(connection, pstm, set);
            }
        }
        else {
            throw new DaoException("Arguments Error");
        }
    }


3 业务方法

@Override
    public List<News> getNewsByPage(int pageNo, int countPerPage)
            throws ServiceException {
        
        try {
            List<News> newsList = newsDao.readByLimit(pageNo, countPerPage, "publishTime", IGenericDao.DESC);
            
            return newsList;
            
        } catch (DaoException e) {
            
            e.printStackTrace();
            
            throw new ServiceException(e.getMessage());
        }
    }



4 servlet

package com.lin.news.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lin.news.domain.News;
import com.lin.news.exception.ServiceException;
import com.lin.news.service.impl.NewsServiceImpl;
import com.lin.news.service.intf.INewsService;

public class LoadAllNewsController extends HttpServlet {

    private static final long serialVersionUID = 1L;
    
    private INewsService newsService = new NewsServiceImpl();
    
    public static final int COUNT_PER_PAGE = 10;//每页显示的条数

    //@SuppressWarnings("null")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        Integer pageNo = Integer.parseInt(request.getParameter("pageNo"));//获得当前页数
        
        request.setAttribute("pageNo", pageNo);
        
        try {
            //List<News> newsList = newsService.getAllNews();
            List<News> newsList = newsService.getNewsByPage(pageNo, COUNT_PER_PAGE);
            request.setAttribute("newsList", newsList);
            
            /**
             * 得到最后一页的页数
             */
            Integer endPage = newsService.count();
            if(endPage % COUNT_PER_PAGE == 0)
            {
                endPage = endPage / COUNT_PER_PAGE;
            }
            else {
                endPage = endPage / COUNT_PER_PAGE + 1;
            }
            request.setAttribute("endPage", endPage);
            
        } catch (ServiceException e) {
            e.printStackTrace();
            
        }
        finally{
            
            request.getRequestDispatcher("/WEB-INF/admin/rootIndex.jsp").include(request, response);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        doGet(request, response);

    }

}


4 JSP

在翻页的超链接里面把当前页数作为参数传递给servlet即可。

<div class="col-md-12 column">
                <!-- 新闻列表 -->
                <c:choose>
                    <c:when test="${newsList != null && newsList.size() != 0 }">
                        <table class="table">
                            <thead>
                                <tr>
                                    <th>新闻标题</th>
                                    <th>发布时间</th>
                                    <th>城市</th>
                                    <th>分类</th>
                                    <th>编辑</th>
                                    <th>是否审核</th>
                                </tr>
                            </thead>
                            <tbody>
                                <c:forEach items="${newsList }" var="news">
                                    <c:choose>
                                        <c:when test="${news.examined == 0 }">
                                            <tr class="error">
                                        </c:when>
                                        <c:when test="${news.examined == 1 }">
                                            <tr class="success">
                                        </c:when>
                                    </c:choose>
                                    <td><a
                                        href="root/newsDescription?id=<c:out value="${news.id}"/>"><c:out
                                                value="${news.title }"></c:out></a></td>
                                    <td><fmt:formatDate value="${news.publishTime }"
                                            pattern="yyyy年MM月dd日 HH:mm:SS" /></td>
                                    <td><c:out value="${news.city }"></c:out></td>
                                    <td><c:choose>
                                            <c:when test="${news.category == 1 }">社会</c:when>
                                            <c:when test="${news.category == 2 }">国际</c:when>
                                            <c:when test="${news.category == 3 }">军事</c:when>
                                            <c:when test="${news.category == 4 }">娱乐</c:when>
                                            <c:when test="${news.category == 5 }">时尚</c:when>
                                            <c:when test="${news.category == 6 }">科技</c:when>
                                            <c:when test="${news.category == 7 }">财经</c:when>
                                            <c:when test="${news.category == 8 }">体育</c:when>
                                            <c:when test="${news.category == 9 }">旅游</c:when>
                                            <c:when test="${news.category == 10 }">美食</c:when>
                                            <c:when test="${news.category == 11 }">汽车</c:when>
                                            <c:when test="${news.category == 12 }">教育</c:when>
                                            <c:when test="${news.category == 13 }">其他</c:when>
                                        </c:choose></td>
                                    <td><a
                                        href="root/listNewsByEditorId?id=<c:out value="${news.editorId }"/>"><c:out
                                                value="${news.editor }"></c:out></a></td>
                                    <td><c:choose>
                                            <c:when test="${news.examined == 0 }">未审核</c:when>
                                            <c:otherwise>已审核</c:otherwise>
                                        </c:choose></td>
                                    </tr>
                                </c:forEach>
                            </tbody>
                        </table>
                        <hr>
                        <p align="center">

                            <a href="root/loadAllNews?pageNo=1" class="btn btn-default">第一页</a>&nbsp;&nbsp;&nbsp;<a
                                <c:if test="${pageNo == 1 }">onclick="return disabled()"</c:if>
                                href="root/loadAllNews?pageNo=<c:out value="${pageNo - 1}"/>"
                                class="btn btn-default">上一页</a>&nbsp;&nbsp;&nbsp;<a
                                <c:if test="${pageNo == endPage }">onclick="return disabled()"</c:if>
                                href="root/loadAllNews?pageNo=<c:out value="${pageNo +1}"/>"
                                class="btn btn-default">下一页</a>&nbsp;&nbsp;&nbsp;<a
                                href="root/loadAllNews?pageNo=<c:out value="${endPage }"/>"
                                class="btn btn-default">最后一页</a>
                            <script type="text/javascript">
                                function disabled() {
                                    return false
                                }
                            </script>
                        </p>
                    </c:when>
                    <c:otherwise>
                        <h3>没有新闻</h3>
                    </c:otherwise>
                </c:choose>
            </div>


5 界面

200437_xgNP_2328736.png

转载于:https://my.oschina.net/ChiLin/blog/644738

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值