通用分页1.

通用分页核心思路:
将上一次查询请求再发一次,只不过页码变了

1. PageBean
分页三要素
page 页码 视图层传递过来
rows 页大小 视图层传递过来
total 总记录数 后台查出来

pagination 是否分页 视图层传递过来

2. 后台
2.1 entity
2.2 dao
第一次查满足条件的总记录数
第二次查指定页码并满足条件的记录
二次查询的条件要一致
2.3 控制层
Servlet

3. 视图层
PageTag

如何将上一次查询请求再发一次
String contextPath = req.getContextPath();//根目录
String url = req.getServletPath();//请求的地址
req.getRequestURL() //获取请求全路径
Map<String, String[]> parameterMap = req.getParameterMap();//获得请求中的所有参数

注1:不能将分页表单嵌套到其它表单中,否则不能提交表单!!!
不能将分页表单嵌套到其它表单中,否则不能提交表单!!!
不能将分页表单嵌套到其它表单中,否则不能提交表单!!!

4. junit
java单元测试/白盒测试
setUp
tearDown
测试用例

具体思路:
1、补全servlet
2、页面展示
3、分页重要参数(page、rows、是否分页、上一次请求、上一次的表单参数)
4、自定义分页标签

5、案例
所需要导入的jar包

所需要建的包和类还有tid文件


Basdao.java(共性部分)
package com.chendongyang.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BaseDao<T> {
    public List<T> executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, Exception{
        List<T> list=new ArrayList<>();    
        Connection con = DBAccess.getConnection();
        PreparedStatement pst = null;
        ResultSet rs = null;
        if(pageBean!=null &&pageBean.isPagination()) {
//            分页---》列表需求
//            查询出符合条件的总记录数
            String countSql=getCountSql(sql);
            pst = con.prepareStatement(countSql);
            rs = pst.executeQuery();
            if(rs.next()) {
                pageBean.setTotal(rs.getObject(1).toString());//85
            }
//            展示想要看到的数据,就比如说第3页的十条数据
            String pageSql= getPageSql(sql,pageBean);
            pst = con.prepareStatement(pageSql);
            rs = pst.executeQuery();
        }else {
//            不分页--》下拉需求
            pst = con.prepareStatement(sql);
            rs = pst.executeQuery();
        }
        
        while(rs.next()) {
//            list.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
            /**
             * Book b=new Book();
             * b.setBid(rs.getInt("bid"));
             * b.setBname(rs.getString("bname"));
             * b.setPrice(rs.getFloar("price"));
             * list.add(b);
             * 
             * 实例化了一个对象
             * 给这一个空对象的每一个属性赋值
             * 将赋值完的对象添加到list集合中返回
             */
            T t=(T) clz.newInstance();
            for (Field f : clz.getDeclaredFields()) {
                f.setAccessible(true);
                f.set(t, rs.getObject(f.getName()));
            }
            list.add(t);
        }
        DBAccess.close(con, pst, rs);
        return list;
    }
    private String getPageSql(String sql, PageBean pageBean) {
        // TODO Auto-generated method stub
        return sql+ " limit "+pageBean.getStartIndex()+","+pageBean.getRows();
    }
    /**
     * select * from t_mvc_book where true and bname like '%圣墟%'
     * countSql=select count(1) from(select * from t_mvc_book where true and bname like '%圣墟%') b;
     * pageSql=select * from t_mvc_book where true and bname like '%圣墟%' limit 4,4
     */

    private String getCountSql(String sql) {
        // TODO Auto-generated method stub
        return "select count(1) from("+sql+")t";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
DBAccess.java
package com.chendongyang.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 提供了一组获得或关闭数据库对象的方法
 * 
 */
public class DBAccess {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;

    static {// 静态块执行一次,加载 驱动一次
        try {
            InputStream is = DBAccess.class
                    .getResourceAsStream("config.properties");

            Properties properties = new Properties();
            properties.load(is);

            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("pwd");

            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 获得数据连接对象
     * 
     * @return
     */
    public static Connection getConnection() {
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public static void close(ResultSet rs) {
        if (null != rs) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

    public static void close(Statement stmt) {
        if (null != stmt) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

    public static void close(Connection conn) {
        if (null != conn) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        close(rs);
        close(stmt);
        close(conn);
    }

    public static boolean isOracle() {
        return "oracle.jdbc.driver.OracleDriver".equals(driver);
    }

    public static boolean isSQLServer() {
        return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
    }
    
    public static boolean isMysql() {
        return "com.mysql.jdbc.Driver".equals(driver);
    }

    public static void main(String[] args) {
        Connection conn = DBAccess.getConnection();
        DBAccess.close(conn);
        System.out.println("isOracle:" + isOracle());
        System.out.println("isSQLServer:" + isSQLServer());
        System.out.println("isMysql:" + isMysql());
        System.out.println("数据库连接(关闭)成功");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
EncodingFilter.java
package com.chendongyang.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(filterName="encodingFilter",urlPatterns="*.action")
public class EncodingFilter implements Filter {

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

    public EncodingFilter() {
        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();
        }
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
PageBean .java(分页助手实体类)
package com.chendongyang.util;

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

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 String url;//请求地址
    
    //上一次查询所携带的查询条件
    private Map<String, String[]> map=new HashMap<String, String[]>();//请求参数集合
    
//    对pageBean进行初始化
    public void setRequest(HttpServletRequest req) {
        //初始化jsp页面传剃过来的当前页
        this.setPage(req.getParameter("page"));
        //初始化jsp页面传剃过来的页大小
        this.setRows(req.getParameter("rows"));
        //初始化jsp页面传剃过来的是否分页
        this.setPagination(req.getParameter("pagination"));
        //保留上一次的查询请求
        this.setUrl(req.getRequestURI().toString());
        //保留上一次的查询条件
        this.setMap(req.getParameterMap());
    }
    
    

    private void setPagination(String pagination) {
        //只有填写了false字符串 才不代表分页
        this.setPagination(!"false".equals(pagination));
    }
    public void setPage(String page) {
        if(StringUtils.isNotBlank(page))
            this.setPage(Integer.valueOf(page));
    }
    
    private void setRows(String rows) {
        if(StringUtils.isNotBlank(rows))
            this.setRows(Integer.valueOf(rows));
    }
    
    public Map<String, String[]> getMap() {
        return map;
    }

    public void setMap(Map<String, String[]> map) {
        this.map = map;
    }
    
    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 + "]";
    }
//上一页
    public int getPrevPage() {
        return this.page > 1 ? this.page-1 : this.page;
    }
//下一页
    public int getNextPage() {
        return this.page < this.getMaxPage() ? this.page +1 : this.page;
    }
//最大页
    public int getMaxPage() {
        return this.total % this.rows == 0 ? this.total /this.rows : (this.total /this.rows)+1;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
StringUtils.java
package com.chendongyang.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);
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
config.properties(数据库连接配置文件)
#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=123


#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=123


#sql2000
#driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:microsoft:sqlserver://localhost:1433;databaseName=unit6DB
#user=sa
#pwd=888888


#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://47.100.191.44:3307/db_die?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=123456


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
注:db_die 自己数据库名
47.100.191.44:3307 数据库主机名
pwd:数据库登录密码

book.java 实体类
package com.chendongyang.entity;

public class Book {
    private int bid;
    private String bname;
    private float price;
    public int getBid() {
        return bid;
    }
    public void setBid(int bid) {
        this.bid = bid;
    }
    public String getBname() {
        return bname;
    }
    public void setBname(String bname) {
        this.bname = bname;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public Book() {}
    public Book(int bid, String bname, float price) {
        this.bid = bid;
        this.bname = bname;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
    }
    
    
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
BookDao.java(分页实现)
package com.chendongyang.dao;
import java.sql.SQLException;
import java.util.List;
import com.chendongyang.entity.Book;
import com.chendongyang.util.BaseDao;
import com.chendongyang.util.PageBean;
import com.chendongyang.util.StringUtils;

public class BookDao extends BaseDao<Book>{
    //之前完成查询需求  
    /*public List<Book> list(Book book,PageBean pageBean) throws SQLException{
        List<Book> list=new ArrayList<>();
        String sql="select * from t_mvc_book where true ";
        String bname = book.getBname();
        if(StringUtils.isNotBlank(bname)) {
            sql += " and bname like '%"+bname+"%'";
        }
        Connection con = DBAccess.getConnection();
        PreparedStatement pst = con.prepareStatement(sql);
        ResultSet rs = pst.executeQuery();
        while(rs.next()) {
            list.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
        }
        DBAccess.close(con, pst, rs);
        return list;
    }*/
    //通过反射改装后的通用分页 现阶段完成的查询需求
    public List<Book> list(Book book,PageBean pageBean) throws SQLException, Exception{
        String sql="select * from t_mvc_book where true ";
        String bname = book.getBname();
        if(StringUtils.isNotBlank(bname)) {
            sql += " and bname like '%"+bname+"%'";
        }
        return super.executeQuery(sql, Book.class, pageBean);
    }
    
    public static void main(String[] args) throws Exception {
        BookDao bookDao=new BookDao();
        Book book=new Book();
//        book.setBname("完美世界");
        PageBean pageBean=new PageBean();
        pageBean.setPagination(true);
        pageBean.setPage(2);
//        pageBean.setPagination(false);
        List<Book> list = bookDao.list(book, pageBean);
        for (Book b : list) {
            System.out.println(b);
        }
        System.out.println(pageBean);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
PageTag .java 表单的拼接
package com.chendongyang.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.chendongyang.util.PageBean;

public class PageTag extends BodyTagSupport{
    private static final long serialVersionUID = 2637657750260403576L;
    
    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表单的html拼接
        sb.append("<form id='pageBeanForm' action='"+pageBean.getUrl()+"' method='post'>");
//        查第几页的数据
        sb.append("<input type='hidden' name='page'>");
        Map<String, String[]> map = pageBean.getMap();
        if(map.size()>0) {
            Set<Entry<String, String[]>> entrySet = map.entrySet();
            for (Entry<String, String[]> entry : entrySet) {
                if(!"page".equals(entry.getKey())) {
                    for (String val:entry.getValue()) {
                        sb.append("<input type='hidden' value='"+val+"' name='"+entry.getKey()+"'>");
                    }
                }
            }
        }
        sb.append("</form>");
//        默认展示前面4页,当前页,后面5页
        int page=pageBean.getPage();
        int max=pageBean.getMaxPage();
        int before=page > 4 ? 4 : page-1;
        int after = 10-1-before;
        after = max-page > after ? after : max-page;
        //控制上一页的点击按钮
        boolean startFlag= page < 2;
//        控制下一页的点击按钮
        boolean endFlag=page == max;
//      拼接分页条
      sb.append("<ul class='pagination'>");
      sb.append("<li class='page-item "+(startFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage(1)'>首页</a></li>");
      sb.append("<li class='page-item "+(startFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getPrevPage()+")'>&lt;</a></li>");

//      代表了当前页的前4页
      for (int i = before; i > 0 ; i--) {
          sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage("+(page-i)+")'>"+(page-i)+"</a></li>");
      }

      sb.append("<li class='page-item active'><a class='page-link' href='javascript:gotoPage("+pageBean.getPage()+")'>"+pageBean.getPage()+"</a></li>");

//      代表了当前页的后5页
      for (int i = 1; i <= after; i++) {
          sb.append("<li class='page-item'><a class='page-link' href='javascript:gotoPage("+(page+i)+")'>"+(page+i)+"</a></li>");
      }

      sb.append("<li class='page-item "+(endFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getNextPage()+")'>&gt;</a></li>");
      sb.append("<li class='page-item "+(endFlag ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.getMaxPage()+")'>尾页</a></li>");
      sb.append("<li class='page-item go-input'><b>到第</b><input class='page-link' type='text' id='skipPage' name='' /><b>页</b></li>");
      sb.append("<li class='page-item go'><a class='page-link' href='javascript:skipPage()'>确定</a></li>");
      sb.append("<li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
      sb.append("</ul>");

//      拼接分页的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) > "+max+") {");
      sb.append("alert('请输入1~N的数字');");
      sb.append("return;");
      sb.append("}");
      sb.append("gotoPage(page);");
      sb.append("}");
      sb.append("</script>");
        return sb.toString();

    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
BookAction .java(前后端连接)
package com.chendongyang.web;

import java.io.IOException;
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.chendongyang.dao.BookDao;
import com.chendongyang.entity.Book;
import com.chendongyang.util.PageBean;
@WebServlet(name="book",urlPatterns="/book.action")
public class BookAction extends HttpServlet{
    private static final long serialVersionUID = -3597185260382805288L;
    
    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 {
        Book book=new Book();
        book.setBname(req.getParameter("bname"));
        PageBean pageBean=new PageBean();
        pageBean.setPagination(true);
        pageBean.setRequest(req);
        try {
            List<Book> list = this.bookDao.list(book, pageBean);
            req.setAttribute("bookList", list);
            req.setAttribute("pageBean", pageBean);
            req.getRequestDispatcher("/bookList.jsp").forward(req, resp);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
tid文件(自定义pagebean标签)
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>d</short-name>
  <uri>/chendongyang</uri>

  <tag>
    <name>page</name>
    <tag-class>com.chendongyang.tag.PageTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>pageBean</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

  

</taglib>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
jsp界面–bookList
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib prefix="d" uri="/chendongyang" %>
<!DOCTYPE html>
<html>
<head>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<meta charset="UTF-8">
<title>书籍列表</title>
<style type="text/css">
    
    .page-item input {
    padding: 0;
    width: 40px;
    height: 100%;
    text-align: center;
    margin: 0 6px;
}

.page-item input,
.page-item b {
    line-height: 38px;
    float: left;
    font-weight: 400;
}

.page-item.go-input {
    margin: 0 10px;
}
</style>
</head>
<body>
<form class="form-inline" action="${pageContext.request.contextPath }/book.action" method="post">
  <div class="form-group mb-2">
  <input type="text" class="form-control-plaintext" id="bname" placeholder="请输入书籍名称">
  </div>
  <button type="submit" class="btn btn-primary mb-2">查询</button>
</form>

<table class="table table-striped">
  <thead>
    <tr>
      <th scope="col">书籍id</th>
      <th scope="col">书籍名称</th>
      <th scope="col">价格</th>
    </tr>
  </thead>
  <tbody>
  <c:forEach var="b" items="${bookList }">
    <tr>
      <td>${b.bid }</td>
      <td>${b.bname }</td>
      <td>${b.price }</td>
    </tr>
   </c:forEach>
  </tbody>
</table>
    
    <c:if test="${empty pageBean }">
        <jsp:forward page="book.action"></jsp:forward>
    </c:if>
    
     <d:page pageBean="${pageBean }"></d:page>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值