目录
1.实体类
- Book.java
package com.jmh.entity;
import javax.servlet.http.HttpServletRequest;
/**
* 实体类
*/
public class Book{
private int book_id;//编号
private String book_name;//名称
private float price;//价格
private Integer sa;
public int getBook_id() {
return book_id;
}
public String getBook_name() {
return book_name;
}
public float getPrice() {
return price;
}
public void setBook_id(int book_id) {
this.book_id = book_id;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"book_id=" + book_id +
", book_name='" + book_name + '\'' +
", price=" + price +
'}';
}
public Book(int book_id, String book_name, float price) {
this.book_id = book_id;
this.book_name = book_name;
this.price = price;
}
public Book() {
}
}
2.dao类
- BookDao.java
package com.jmh.dao;
import com.jmh.base.BaseDao;
import com.jmh.entity.Book;
import com.jmh.util.CommonUtils;
import com.jmh.util.PageBean;
import com.jmh.util.StringUtils;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BookDao extends BaseDao<Book> {
public List<Book> query(Book b, PageBean pbs){
//定义基础查询语句
String sql="select book_id,book_name,price from tb_book where 1=1 ";
//判断是否符合模糊查询条件 书本名称不为空
if(StringUtils.isNotBlank(b.getBook_name())){//符合
//符合就往基础查询语句里面追加模糊查询SQL语句
sql+=" and book_name like '%"+b.getBook_name()+"%'";
}
return this.exequery(sql, pbs, new callBase<Book>() {
@Override
public List rsForeach(ResultSet rs) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException {
List<Book> books = CommonUtils.toList(rs, Book.class);
return books;
}
});
}
}
- BaseDao.java
package com.jmh.base;
import com.jmh.util.DBHelper;
import com.jmh.util.PageBean;
import java.lang.reflect.InvocationTargetException;
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 interface callBase<T>{
public List<T> rsForeach(ResultSet rs) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException;
}
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
private List<T> list;
public List<T> exequery(String sql, PageBean pb,callBase ca){
list=new ArrayList<>();
//创建连接
con= DBHelper.getConnection();
try {
//判断是否符合统计总数据量
if(null!=pb&&pb.isPageaction()){//如果对象不为空 并且要分页
ps=con.prepareCall(this.sumCount(sql));
rs=ps.executeQuery();
if(rs.next()){
pb.setTotls(rs.getInt(1));
}
//释放资源
DBHelper.close(null,ps,rs);
}
//判断是否符合分页查询
if(null!=pb&&pb.isPageaction()){//如果对象不为空 并且要分页
sql=this.pageIng(sql,pb);
}
ps=con.prepareCall(sql);
rs=ps.executeQuery();
//返回 回去
return ca.rsForeach(rs);
}catch (Exception e){
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return list;
}
/**
* 统计总数据量
* @param sql 查询语句
* @return 查询语句
*/
public String sumCount(String sql){
String sumCount=" select count(0) from ( "+sql+" ) e";
//System.out.println("总数据量==="+sumCount);
return sumCount;
}
/**
* 分页查询语句
* @param sql
* @param pb
* @return
*/
public String pageIng(String sql,PageBean pb){
String pageIng=sql+" limit "+(pb.getPage()-1)*pb.getRows()+" , "+pb.getRows();
// System.out.println("分页==="+pageIng);
return pageIng;
}
}
3.工具类(util)
- CommonUtils.java
package com.jmh.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* 获取查询全部的方法
*/
public class CommonUtils {
public static <T> List<T> toList(ResultSet rs,Class<T> ca) throws SQLException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//1.实例化集合
List<T> list=new ArrayList<T>();
//2.获取结果集、集合
ResultSetMetaData me = rs.getMetaData();
//3.获取所有属性 根据类方法
Field[] fe = ca.getDeclaredFields();
//开始遍历
while(rs.next()){
//根据类方法获取对象
T t = ca.newInstance();
//遍历结果集、集合获取列名
for (int i=0;i<me.getColumnCount();i++){
//获取列名
String colName = me.getColumnLabel(i + 1);
//遍历获取到的所有属性
for (Field f:fe) {
//获取属性名
String fName = f.getName();
//比较属性名和列明是否一致
if(colName.equals(fName)){//代表一致
//拼接成方法
String setName = "set" + fName.substring(0, 1).toUpperCase() + fName.substring(1);
//获取方法
Method meName = ca.getDeclaredMethod(setName, f.getType());//参数方法名、参数类型
//设置访问权限
meName.setAccessible(true);
//开始调用方法
Object invoke = meName.invoke(t, rs.getObject(colName));
}
}
}
//System.out.println("对象==="+t);
list.add(t);
}
return list;
}
}
- EncodingFilter.java
package com.jmh.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 中文乱码处理
*
*/
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();
}
}
}
- PageBean.java
package com.jmh.util;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
/**
* 分页工具类
* @author 蒋明辉
*
*/
public class PageBean{
private Integer page=1;//当前页码 默认为第一页
private Integer rows=10;//页大小 默认页大小为10条
private Integer totls=0;//总数据量 默认为0
private boolean pageaction=true;//判断是否要分页 默认要分页
private String url;//请求路径
private Map<String, String[]> map;//请求参数、保存请求的参数
public PageBean() {
}
public PageBean(Integer page, Integer rows, Integer totls, boolean pageaction, String url, Map<String, String[]> map) {
this.page = page;
this.rows = rows;
this.totls = totls;
this.pageaction = pageaction;
this.url = url;
this.map = map;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public void setPage(String page) {
if(null!=page){
this.page = Integer.parseInt(page);
}
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public void setRows(String rows) {
if(null!=rows){
this.rows = Integer.parseInt(rows);
}
}
public Integer getTotls() {
return totls;
}
public void setTotls(Integer totls) {
this.totls = totls;
}
public void setTotls(String totls) {
if(null!=totls){
this.totls = Integer.parseInt(totls);
}
}
public boolean isPageaction() {
return pageaction;
}
public void setPageaction(boolean pageaction) {
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String[]> getMap() {
return map;
}
public void setMap(Map<String, String[]> map) {
this.map = map;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", totls=" + totls + ", pageaction=" + pageaction
+ ", url=" + url + ", map=" + map + "]";
}
/**
* 初始化PageBase方法
*/
public void initPageBase(HttpServletRequest req){
//设置页码
this.setPage(req.getParameter("page"));
//设置页大小
this.setRows(req.getParameter("rows"));
//设置总数量
this.setTotls(req.getParameter("totls"));
//设置是否分页
this.setPageaction(Boolean.parseBoolean(req.getParameter("pageaction")));
//设置URL
this.setUrl(req.getRequestURI());
//设置map集合
this.setMap(req.getParameterMap());
}
/**
* 上一页的方法
*/
public int getPrePage(){
if(this.page==1){
return this.page;
}
return this.page-1;
}
/**
* 最大页码的方法
*/
public int getMaxPage(){
int page=this.totls/this.rows;
if(this.totls%this.rows!=0){
page++;
}
return page;
}
/**
* 下一页的方法
*/
public int getNextPage(){
int next=this.page+1;
if(this.page==getMaxPage()){
return this.page;
}
return this.page+1;
}
}
- PageTag.java
package com.jmh.util;
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.jmh.util.PageTag;
public class PageTag extends BodyTagSupport {
private PageBean pageBean;
public PageTag() {
super();
}
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.println(toHtml());
} catch (Exception e) {
throw new RuntimeException(e);
}
return super.doStartTag();
}
private String toHtml() {
//pageBean为空或者 不分页
if(null==pageBean || !pageBean.isPageaction()) {
return "";
}
StringBuilder sb = new StringBuilder();
//拼接form表单
/*<form action="${pageBean.url}" method="post" id="pageBeanForm">
<!-- 设置页码 -->
<input type="hidden" name="page"/>
<!-- 参数列表 -->
</form>*/
sb.append("<form action=\""+pageBean.getUrl()+"\" method=\"post\" id=\"pageBeanForm\">");
sb.append("<input type=\"hidden\" name=\"page\"/>");
//参数列表
Map<String, String[]> map = pageBean.getMap();
String name =null;
String[] values = null;
// bookName = '不短命' hobby="篮球" hobby="足球" page="2"
Set<Entry<String, String[]>> entrySet = map.entrySet();
for (Entry<String, String[]> entry : entrySet) {
name = entry.getKey();
if(name.equals("page")) {
continue;
}
values = entry.getValue();
for (String value : values) {
//<input type="hidden" name="bookName" valu="不短命"/>
//<input type="hidden" name="hobby" valu="篮球"/>
//<input type="hidden" name="hobby" valu="足球"/>
sb.append("<input type=\"hidden\" name=\""+name+"\" value=\""+value+"\"/>");
}
}
sb.append("</form>");
//拼接div部分
/*<div style="width:100%;text-align: right;">
第几页/总共多少页,共多少条记录
<a href="javascript:gotoPage(1)">首页</a>
<a href="javascript:gotoPage(${pageBean.getPreviousPage()})">上一页</a>
<a href="javascript:gotoPage(${pageBean.getNextPage()})">下一页</a>
<a href="javascript:gotoPage(${pageBean.getMaxPage()})">末页</a>
<input type="text" id="skipPage" style="width:30px;"/>
<a href="javascript:skipPage(${pageBean.getMaxPage()})">GO</a>
</div>*/
sb.append("<div style=\"width:100%;text-align: right;\">");
sb.append("第"+pageBean.getPage()+"页/总共"+pageBean.getMaxPage()+"页,共"+pageBean.getTotls()+"条记录 ");
//首页 上一页
if(pageBean.getPage()!=1) {
sb.append("<a href=\"javascript:gotoPage(1)\">首页</a> \r\n" +
" <a href=\"javascript:gotoPage("+pageBean.getPrePage()+")\">上一页</a> ");
}else {
sb.append("<a>首页</a> <a>上一页</a> ");
}
//末页 下一页
if(pageBean.getPage()!=pageBean.getMaxPage()) {
sb.append("<a href=\"javascript:gotoPage("+pageBean.getNextPage()+")\">下一页</a> \r\n" +
" <a href=\"javascript:gotoPage("+pageBean.getMaxPage()+")\">末页</a> ");
}else {
sb.append("<a>下一页</a> <a>末页</a> ");
}
//跳转页
sb.append("<input type=\"text\" id=\"skipPage\" style=\"width:30px;\"/> ");
sb.append("<a href=\"javascript:skipPage()\">GO</a>");
sb.append("</div>");
//拼接js
/*<script type="text/javascript">
function gotoPage(page) {
document.getElementById('pageBeanForm').page.value=page;
document.getElementById('pageBeanForm').submit();
}
function skipPage(maxPage) {
var page = document.getElementById('skipPage').value;
if(isNaN(page) || page<1 || page>maxPage){
alert("请输入1-"+maxPage+"的数字");
return false;
}
gotoPage(page);
}
</script>*/
sb.append("<script type=\"text/javascript\">\r\n" +
" function gotoPage(page) {\r\n" +
" document.getElementById('pageBeanForm').page.value=page;\r\n" +
" document.getElementById('pageBeanForm').submit();\r\n" +
" }\r\n" +
" function skipPage() {\r\n" +
" var page = document.getElementById('skipPage').value;\r\n" +
" if(isNaN(page) || page<1 || page>"+pageBean.getMaxPage()+"){\r\n" +
" alert(\"请输入1-\"+"+pageBean.getMaxPage()+"+\"的数字\");\r\n" +
" return false;\r\n" +
" }\r\n" +
" gotoPage(page);\r\n" +
" }\r\n" +
"\r\n" +
"</script>");
return sb.toString();
}
}
- StringUtils.java
package com.jmh.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);
}
}
4.Jsp页面
- indexTwo.jsp
<%--
Created by IntelliJ IDEA.
User: 蒋明辉
Date: 2022/7/1
Time: 19:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="l" uri="/zking" %>
<html>
<head>
<title>书本主页</title>
</head>
<%--编写js代码
<script type="text/javascript">
function gotopage(page) {
//获取表单编号
document.getElementById("formName").page.value=page;
//再次调用方法
document.getElementById("formName").submit();
}
//指定跳转页码
function zhiding(maxPage) {
//获取文本框的值
var sa=document.getElementById("sa").value;
console.info(sa)
//判断
if(isNaN(sa)||sa<1||sa>maxPage){
alert('请输入1-'+maxPage+'的页数');
return false;
}
//调用方法
gotopage(sa);
}
</script>--%>
<body>
<%--判断如果指定的数据为空就跳转页面--%>
<c:if test="${empty query}">
<jsp:forward page="/bookServlet.do"></jsp:forward>
</c:if>
<%--再次发出请求
<div>
<form id="formName">
<input type="hidden" name="page" />
</form>
</div>--%>
<h1>书本主页</h1>
<%--模糊查询组件--%>
<div align="center">
<form action="<%=request.getContextPath()%>/bookServlet.do" method="post">
书本名称:<input type="text" name="book_name" />
<button type="submit">查询</button>
</form>
</div>
<div align="center">
<table border="2px" width="100%">
<tr style="text-align: center">
<td>书本编号</td>
<td>书本名称</td>
<td>书本价格</td>
</tr>
<%--开始遍历--%>
<c:forEach items="${query}" var="sa">
<tr style="text-align: center">
<td>${sa.book_id}</td>
<td>${sa.book_name}</td>
<td>${sa.price}</td>
</tr>
</c:forEach>
</table>
</div>
<%--分页组件--%>
<%-- <div align="right">
<a href="#">当前第${pageBase.page}页/${pageBase.totls}条数据</a>
<a href="javascript:gotopage(1);">首页</a>
<a href="javascript:gotopage(${pageBase.prePage});">上一页</a>
<a href="javascript:gotopage(${pageBase.nextPage});">下一页</a>
<a href="javascript:gotopage(${pageBase.maxPage});">尾页</a>
<input id="sa" type="text" style="width: 50px;text-align: center" /> <a href="javascript:zhiding(${pageBase.maxPage});">跳转</a>
</div>--%>
<div>
<l:page pageBean="${pageBase}"/>
</div>
${pageBase}
</body>
</html>
效果图