通用分頁jsp頁面顯示


  

注:本章內容都是在上一篇文章 通用分頁后台顯示:https://www.cnblogs.com/ly-0919/p/11058942.html  的基礎上進行改進,所以有許多的類都在上一篇,

         帶來不便請諒解!!!

 

通用分頁的核心   

  .將上一次查詢請求再發一次,只不過改變了頁碼。

 

本章重點:

   1、改造上次PageBean里 的內容;

   2、頁面展示
   3、創建控制層  servlet
   4、自定義分頁標簽

   5、助手類信息

 

1、補全后的PageBean:

package com.yuan.util;

import java.util.HashMap;
import java.util.Map;

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

/**
 * 分頁工具類
 *
 */
public class PageBean {

    private int page = 1;// 頁碼

    private int rows = 10;// 頁大小

    private int total = 0;// 總記錄數

    private boolean pagination = true;// 是否分頁

    private Map<String, String[]>  paMap = new HashMap<>();
    
    private String url;
    
    public void setRequest(HttpServletRequest req) {
        Map<String, String[]> parameterMap = req.getParameterMap();
        StringBuffer url = req.getRequestURL();
        //保存上一次請求所攜帶的參數
        this.setPaMap(req.getParameterMap());
        this.setUrl(req.getRequestURL().toString());
        
        //在jsp頁面來控制是否分頁
//        this.setPagination(req.getParameter("pagination"));
        //在jsp頁面控制一頁展示多少條信息
//        this.setRows(req.getParameter("rows"));
        this.setPage(req.getParameter("page"));
    }
    
    //setPage重載
    private void setPage(String page) {
        this.page = StringUtils.isNotBlank(page) ? Integer.valueOf(page):this.page;
        
    }

    //setPagination重載
    public void setPagination(String pagination) {
        this.pagination = StringUtils.isNotBlank(pagination) ? !"false".equals(pagination):this.pagination;
        
    }

    //setRows重載
    public void setRows(String rows) {
        this.rows = StringUtils.isNotBlank(rows)?Integer.valueOf(rows):this.rows;
        
    }

    public Map<String, String[]> getPaMap() {
        return paMap;
    }

    public void setPaMap(Map<String, String[]> paMap) {
        this.paMap = paMap;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public PageBean() {
        super();
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }

    public boolean isPagination() {
        return pagination;
    }

    public void setPagination(boolean pagination) {
        this.pagination = pagination;
    }

    /**
     * 獲得起始記錄的下標
     * 
     * @return
     */
    public int getStartIndex() {
        return (this.page - 1) * this.rows;
    }

    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    }

    /**
     * 獲取最大頁碼數
     * @return
     */
    public int getMaxPage() {
        
        return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows+1;
    }
    
    /**
     * 下一頁
     * @return
     */
    public int getNexPage() {
        
        return this.page < this.getMaxPage() ? this.page+1 : this.page;
    }
    
    /**
     * 上一頁
     * @return
     */
    public int getPreviousPage() {
        
        return this.page > 1 ? this.page-1 : this.page; 
    }
    
}

2、jsp頁面展示,分頁代碼插入到了控制層的Servlet里面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page isELIgnored="false"%>  <!-- 中途遇到EL表達式(${})失效,插入此代碼解決 -->
    <%@taglib prefix="z" uri="/yuan" %>  <!-- 導入自定義標簽庫使用自定義的分頁標簽 -->
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${empty bookList }">
<jsp:forward page="bookServlet.action"></jsp:forward>
</c:if>
<h2>小說目錄</h2>
    <br>
    <form action="${pageContext.request.contextPath}/bookServlet.action"
        method="post">
        書名:<input type="text" name="bname"> <input type="submit"
            value="確定">
            <input type="hidden" name="pagination" value="false">
            <input type="hidden" name="rows" value="20">
    </form>
    <table border="1" width="100%">
        <tr>
            <td>編號</td>
            <td>名稱</td>
            <td>價格</td>
        </tr>
        <c:forEach items="${bookList }" var="s">
            <tr>
                <td>${s.bid }</td>
                <td>${s.bname }</td>
                <td>${s.price}</td>
            </tr>
            </c:forEach>
    </table>
    <z:Page pageBean="${pageBean }"></z:Page>
    
</body>
</html>

3、創建控制層Servlet

package com.web;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

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

import com.yuan.dao.BookDao;
import com.yuan.entity.Book;
import com.yuan.util.PageBean;

public class BookServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private BookDao bookDao = new BookDao();
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String bname = req.getParameter("bname");
        Book book = new Book();
        book.setBname(bname);
        
//        
        PageBean bean = new PageBean();
        try {
            bean.setRequest(req);
            List<Book> list = this.bookDao.list(book,bean);
            req.setAttribute("bookList", list);
            req.setAttribute("pageBean", bean);
            req.getRequestDispatcher("/BookList.jsp").forward(req, resp);
        } catch (InstantiationException | IllegalAccessException | SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}

附:web.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app id="WebApp_ID">
    <display-name>Test_pagebean</display-name>
    
    <servlet>
      <servlet-name>bookServlet</servlet-name>
      <servlet-class>com.web.BookServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>bookServlet</servlet-name>
      <url-pattern>/bookServlet.action</url-pattern>
    </servlet-mapping>
    
</web-app>

4、自定義分頁標簽

package com.tag;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import com.yuan.util.PageBean;

public class PageTag extends BodyTagSupport {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private PageBean pageBean;

    public PageBean getPageBean() {
        return pageBean;
    }

    public void setPageBean(PageBean pageBean) {
        this.pageBean = pageBean;
    }
    
    @Override
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.print(toHTML());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return super.doStartTag();
    }

    private String toHTML() {
        StringBuilder sb= new StringBuilder();
        
        //拼接下一次發送請求所要提交的隱藏的form表單
        sb.append("<form id='pageBeanForm' action='"+pageBean.getUrl()+"' method='post'>");
        sb.append("<input type='hidden' name='page'>");
        
        Map<String, String[]> paMap = pageBean.getPaMap();
        if(paMap != null && paMap.size()>0) {
            Set<Entry<String, String[]>> entrySet = paMap.entrySet();
            for (Entry<String, String[]> entry : entrySet) {
                //上一次請求可能攜帶頁碼name=page的參數,但是改參數在前面已經單獨賦值,
                //因為上一次請求是第一頁的數據,下一次可能是第二頁,一位這前后請求page對應的值是不一樣的,需要單獨賦值
                
                if(!"page".equals(entry.getKey())) {
                for(String val:entry.getValue()) {
                    sb.append("<input type='hidden' name='"+entry.getKey()+"' value='"+val+"'>");
                    
                }
              }
            }
        }
        
        sb.append("</form>");
        
        
        //拼接分頁條
        sb.append("<div style='text-align: right; font-size: 12px;'>");
        sb.append("每頁"+pageBean.getRows()+"條,共"+pageBean.getTotal()+"條,第"+pageBean.getPage()+"頁,共"+pageBean.getMaxPage()+"頁&nbsp;&nbsp;<a  ");
        sb.append(" href='javascript:gotoPage(1)'>首頁</a>&nbsp;&nbsp;<a");
        sb.append(" href='javascript:gotoPage("+pageBean.getPreviousPage()+")'>上一頁</a>&nbsp;&nbsp;<a");
        sb.append(" href='javascript:gotoPage("+pageBean.getNexPage()+")'>下一頁</a>&nbsp;&nbsp;<a");
        sb.append(" href='javascript:gotoPage("+pageBean.getMaxPage()+")'>尾頁</a>&nbsp;&nbsp;<input type='text'");
        sb.append(" id='skipPage'");
        sb.append(" style='text-align: center; font-size: 12px; width: 50px;'>&nbsp;&nbsp;<a");
        sb.append(" href='javascript:skipPage()'>Go</a>");
        sb.append("</div>");
        //拼接分頁所需要的js代碼
        sb.append("<script type='text/javascript'>");
        sb.append(" function gotoPage(page) {");
        sb.append(" document.getElementById('pageBeanForm').page.value = page;");
        sb.append(" document.getElementById('pageBeanForm').submit();");
        sb.append(" }");
        sb.append(" function skipPage() {");
        sb.append(" var page = document.getElementById('skipPage').value;");
        sb.append(" if(!page || isNaN(page) || parseInt(page)<1 || parseInt(page)>"+pageBean.getMaxPage()+"){");
        sb.append(" alert('請輸入1~N的數字');");
        sb.append(" return;");
        sb.append(" }");
        sb.append(" gotoPage(page);");
        sb.append(" }");
        sb.append(" </script>");
        
        return sb.toString();
    }
    
}

   .注意在append拼接時需要注意空格

   將自定義標簽的類配到tld文件中

 

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 標簽庫描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <!-- 代表標簽庫的版本號 -->
    <tlib-version>1.0</tlib-version>
    <!-- 代表jsp的版本 -->
    <jsp-version>1.2</jsp-version>
    <!-- 你的標簽庫的簡稱 -->
    <short-name>test</short-name>
    <!-- 你標簽庫的引用uri -->
    <uri>/zking</uri>

    <!-- 1自定義分頁標簽 -->
    <tag>
      <name>Page</name>  //標簽庫中的標簽名
      <tag-class>com.tag.PageTag</tag-class>//標簽的助手類全路徑名
      <body-content>JSP</body-content>
      <attribute>
         <name>pageBean</name>//標簽屬性名   在配置的時候必須與助手類的屬性一致
         <required>true</required>//該屬性是否必填
         <rtexprvalue>true</rtexprvalue>//是否支持表達式(EL)
      </attribute>
    </tag>


    </taglib>

 

5、助手類信息

StringUtils :  

package com.yuan.util;

public class StringUtils {
    // 私有的構造方法,保護此類不能在外部實例化
    private StringUtils() {
    }

    /**
     * 如果字符串等於null或去空格后等於"",則返回true,否則返回false
     * 
     * @param s
     * @return
     */
    public static boolean isBlank(String s) {
        boolean b = false;
        if (null == s || s.trim().equals("")) {
            b = true;
        }
        return b;
    }
    
    /**
     * 如果字符串不等於null或去空格后不等於"",則返回true,否則返回false
     * 
     * @param s
     * @return
     */
    public static boolean isNotBlank(String s) {
        return !isBlank(s);
    }

}

EncodingFiter :

package com.yuan.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 中文亂碼處理
 * 
 */
@WebFilter(urlPatterns=("/*"))
public class EncodingFiter implements Filter {

    private String encoding = "UTF-8";// 默認字符集

    public EncodingFiter() {
        super();
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        // 中文處理必須放到 chain.doFilter(request, response)方法前面
        res.setContentType("text/html;charset=" + this.encoding);
        if (req.getMethod().equalsIgnoreCase("post")) {
            req.setCharacterEncoding(this.encoding);
        } else {
            Map map = req.getParameterMap();// 保存所有參數名=參數值(數組)的Map集合
            Set set = map.keySet();// 取出所有參數名
            Iterator it = set.iterator();
            while (it.hasNext()) {
                String name = (String) it.next();
                String[] values = (String[]) map.get(name);// 取出參數值[注:參數值為一個數組]
                for (int i = 0; i < values.length; i++) {
                    values[i] = new String(values[i].getBytes("ISO-8859-1"),
                            this.encoding);
                }
            }
        }

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        String s = filterConfig.getInitParameter("encoding");// 讀取web.xml文件中配置的字符集
        if (null != s && !s.trim().equals("")) {
            this.encoding = s.trim();
        }
    }

}

 

 jsp頁面顯示(首頁):

下一頁:

尾頁:

上一頁:

跳轉:

 

如需要對另一個數據庫表的信息進行分頁,需修改dao層查詢的語句,新建實體類;還有就是新建一個servlet和jsp頁面。

完善上一篇后台顯示對比的另一個實體類;

新建servlet和jsp頁面。

jsp頁面代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page isELIgnored="false"%>
    <%@taglib prefix="z" uri="/yuan" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h2>小說目錄</h2>
    <br>
    <form action="/BlogServlet"
        method="post">
        書名:<input type="text" name="bookName"> <input type="submit"
            value="確定">
            <input type="hidden" name="pagination" value="false">
            <input type="hidden" name="rows" value="20">
    </form>
    <table border="1" width="100%">
        <tr>
            <td>編號</td>
            <td>名稱</td>
        </tr>
        <c:forEach items="${blogList }" var="s">
            <tr>
                <td>${s.id }</td>
                <td>${s.bookName }</td>
            </tr>
            </c:forEach>
    </table>
    <z:Page pageBean="${pageBean }"></z:Page>
    
    
    
    
    
</body>
</html>

控制層Servlet:

package com.web;

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

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

import com.yuan.dao.BlogDao;
import com.yuan.entity.Bookxyj;
import com.yuan.util.PageBean;

@WebServlet("/BlogServlet")
public class BlogServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private BlogDao blogDao = new BlogDao();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Bookxyj xyj = new Bookxyj();
        xyj.setBookName(req.getParameter("bookName"));
        PageBean pageBean = new PageBean();
        try {
            pageBean.setRequest(req);
            List<Bookxyj> list = this.blogDao.list(xyj, pageBean);
            req.setAttribute("blogList", list);
            req.setAttribute("pageBean", pageBean);
            req.getRequestDispatcher("/blogList.jsp").forward(req, resp);
        } catch (InstantiationException | IllegalAccessException | SQLException e) {
            
            e.printStackTrace();
        }
        super.doPost(req, resp);
    }
    
}

 

謝謝觀看!!!上一篇地址  https://www.cnblogs.com/ly-0919/p/11058942.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM