1. 程式人生 > >Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分頁

Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分頁

package loaderman.fy.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;

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

import loaderman.fy.entity.Page; import loaderman.fy.service.ArticleService; import net.sf.json.JSONArray; public class ArticleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { this.doPost(request,response); }
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { try { request.setCharacterEncoding("UTF-8"); //獲取關鍵字 String keywords = request.getParameter("keywords");//培訓 if(keywords == null
|| keywords.trim().length()==0){ keywords = "培訓";//預設值 } //獲取當前頁號 String temp = request.getParameter("page");//核心 if(temp == null || temp.trim().length()==0){ temp = "1";//預設值 } //呼叫業務層 ArticleService articleService = new ArticleService(); Page page = articleService.show(keywords,Integer.parseInt(temp)); //構造Map物件 Map<String,Object> map = new LinkedHashMap<String,Object>(); map.put("total",page.getAllRecordNO()); map.put("rows",page.getArticleList()); //第三方工具將Map轉成JSON JSONArray jsonArray = JSONArray.fromObject(map); String jsonJAVA = jsonArray.toString(); //去掉二邊的[]符號 jsonJAVA = jsonJAVA.substring(1,jsonJAVA.length()-1); //以IO的流方式響應到DataGrid元件 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.write(jsonJAVA); pw.flush(); pw.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
package loaderman.fy.dao;

import java.util.ArrayList;
import java.util.List;

import loaderman.fy.entity.Article;
import loaderman.util.LuceneUtil;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

/**
 * 持久層 

 */
public class ArticleDao {
    /**
     * 根據關鍵字,獲取總記錄數
     * @return 總記錄數
     */
    public int getAllRecord(String keywords) throws Exception{
        QueryParser queryParser = new QueryParser(LuceneUtil.getVersion(),"content",LuceneUtil.getAnalyzer());
        Query query = queryParser.parse(keywords);
        IndexSearcher indexSearcher = new IndexSearcher(LuceneUtil.getDirectory());
        TopDocs topDocs = indexSearcher.search(query,2);
        //返回符合條件的真實總記錄數,不受2的影響
        return topDocs.totalHits;
        //返回符合條件的總記錄數,受2的影響
        //return topDocs.scoreDocs.length;
    }
    /**
     * 根據關鍵字,批量查詢記錄
     * @param start 從第幾條記錄的索引號開始查詢,索引號從0開始
     * @param size  最多查詢幾條記錄,不滿足最多數目時,以實際為準
     * @return 集合
     */
    public List<Article> findAll(String keywords,int start,int size) throws Exception{
        List<Article> articleList = new ArrayList<Article>();

        QueryParser queryParser = new QueryParser(LuceneUtil.getVersion(),"content",LuceneUtil.getAnalyzer());
        Query query = queryParser.parse(keywords);
        IndexSearcher indexSearcher = new IndexSearcher(LuceneUtil.getDirectory());
        TopDocs topDocs = indexSearcher.search(query,100);
        //小技巧
        int middle = Math.min(start+size,topDocs.totalHits);
        for(int i=start;i<middle;i++){
            ScoreDoc scoreDoc = topDocs.scoreDocs[i];
            int no = scoreDoc.doc;
            Document document = indexSearcher.doc(no);
            Article article = (Article) LuceneUtil.document2javabean(document,Article.class);
            articleList.add(article);
        }

        return articleList;
    }





    public static void main(String[] args) throws Exception{
        ArticleDao dao = new ArticleDao();
        System.out.println(dao.getAllRecord("培訓"));

        System.out.println("------------------------------");

        System.out.println("第一頁");
        List<Article> list = dao.findAll("培訓",0,2);
        for(Article a : list){
            System.out.println(a);
        }
        System.out.println("第二頁");
        list = dao.findAll("培訓",2,2);
        for(Article a : list){
            System.out.println(a);
        }
        System.out.println("第三頁");
        list = dao.findAll("培訓",4,2);
        for(Article a : list){
            System.out.println(a);
        }
        System.out.println("第四頁");
        list = dao.findAll("培訓",6,2);
        for(Article a : list){
            System.out.println(a);
        }
    }
}
package loaderman.fy.entity;

/**
 * 文章
 */
public class Article {
    private Integer id;//編號
    private String title;//標題
    private String content;//內容
    public Article(){}
    public Article(Integer id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    @Override
    public String toString() {
        return "編號:" + id+"\n標題:" + title + "\n內容:" + content;
    }
}
package loaderman.fy.entity;

import java.util.ArrayList;
import java.util.List;

/**
 * 用於Article的分頁類
 */
public class Page {
    private Integer currPageNO;//當前頁號OK
    private Integer perPageSize = 2;//每頁顯示記錄數,預設為2條OK
    private Integer allRecordNO;//總記錄數OK
    private Integer allPageNO;//總頁數OK
    private List<Article> articleList = new ArrayList<Article>();//內容OK
    public Page(){}
    public Integer getCurrPageNO() {
        return currPageNO;
    }
    public void setCurrPageNO(Integer currPageNO) {
        this.currPageNO = currPageNO;
    }
    public Integer getPerPageSize() {
        return perPageSize;
    }
    public void setPerPageSize(Integer perPageSize) {
        this.perPageSize = perPageSize;
    }
    public Integer getAllRecordNO() {
        return allRecordNO;
    }
    public void setAllRecordNO(Integer allRecordNO) {
        this.allRecordNO = allRecordNO;
    }
    public Integer getAllPageNO() {
        return allPageNO;
    }
    public void setAllPageNO(Integer allPageNO) {
        this.allPageNO = allPageNO;
    }
    public List<Article> getArticleList() {
        return articleList;
    }
    public void setArticleList(List<Article> articleList) {
        this.articleList = articleList;
    }
}
package loaderman.fy.service;

import loaderman.fy.dao.ArticleDao;
import loaderman.fy.entity.Article;
import loaderman.fy.entity.Page;

import java.util.List;

/**
 * 業務層
 */
public class ArticleService {
    //持久層
    private ArticleDao articleDao = new ArticleDao();
    /**
     * 根據關鍵字和頁號,查詢內容
     */
    public Page show(String keywords,int currPageNO) throws Exception{
        Page page = new Page();

        //封裝當前頁號
        page.setCurrPageNO(currPageNO);

        //封裝總記錄數
        int allRecordNO = articleDao.getAllRecord(keywords);
        page.setAllRecordNO(allRecordNO);

        //封裝總頁數
        int allPageNO = 0;
        if(page.getAllRecordNO() % page.getPerPageSize() == 0){
            allPageNO = page.getAllRecordNO() / page.getPerPageSize();
        }else{
            allPageNO = page.getAllRecordNO() / page.getPerPageSize() + 1;
        }
        page.setAllPageNO(allPageNO);

        //封裝內容
        int size = page.getPerPageSize();
        int start = (page.getCurrPageNO()-1) * size;
        List<Article> articleList = articleDao.findAll(keywords,start,size);
        page.setArticleList(articleList);

        return page;
    }







    //測試
    public static void main(String[] args) throws Exception{
        ArticleService test = new ArticleService();
        Page page = test.show("培訓",4);

        System.out.println(page.getCurrPageNO());
        System.out.println(page.getPerPageSize());
        System.out.println(page.getAllRecordNO());
        System.out.println(page.getAllPageNO());
        for(Article a : page.getArticleList()){
            System.out.println(a);
        }
    }
}
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>使用Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分頁</title>
    <!-- 引入css檔案,無順序 -->
    <link rel="stylesheet" href="themes/icon.css" type="text/css"></link>
    <link rel="stylesheet" href="themes/default/easyui.css" type="text/css"></link>
      <!-- 引入js檔案,有順序 -->
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/easyui-lang-zh_CN.js"></script>
  </head>
  <body>


    <!-- 輸入區 -->
    <form id="myformID">
        輸入關鍵字:<input type="text" value="" id="keywordID"/>
        <input type="button" value="站內搜尋" id="findID"/>
    </form>
    <script type="text/javascript">
        //定位"站內搜尋"按鈕
        $("#findID").click(function(){
            //獲取關鍵字
            var keyword = $("#keywordID").val();
            //去空格
            keyword = $.trim(keyword);
            //判斷
            if(keyword.length == 0){
                //提示
                alert("請輸入關鍵字!!!");
                //清空文字框的內容
                $("#keywordID").val("");
                //定位於輸入關鍵字文字框
                $("#keywordID").focus();
            }else{
                //非同步傳送請求到伺服器
                //load表示方法名
                //"keywords"表示需要傳送的的引數名,後臺收:request.getParameter("keywords")
                //keyword表示引數值
                $("#dg").datagrid("load",{    
                    "keywords" : keyword
                });  
            }
        });
    </script>
    
    

    <!-- 顯示區 -->
    <table id="dg"></table>
    <script type="text/javascript">
        $("#dg").datagrid({
            url : "${pageContext.request.contextPath}/ArticleServlet?time="+new Date().getTime(),
            columns :  [[    
                                {field:'id',title:'編號',width:100},    
                                {field:'title',title:'標題',width:100},    
                                {field:'content',title:'內容',width:100}
                        ]],
            fitColumns : true,
            singleSelect : true,
            pagination : true,
            pageSize : 2,
            pageList : [2]            
        });
    </script>
    
  </body>
</html>