一、改造pagebean
改造pagebean所需条件
需要新增变量保存上一次查询条件
== private Map<String, String[]> parameterMap=new HashMap<String, String[]>();==
需要新增变量保存上一次请求地址:
private String url;http://localhost:80/yzp/stu/
需要添加方法:获取最大页的页码
public int maxPage() {
return this.total%this.rows==0 ?
this.total/this.rows
:this.total/this.rows+1;
}
需要添加方法:获取下一页的页码
public int previousPage() {
return this.page > 1 ? this.page -1 : this.page;
}
需要添加方法:获取上一页的页码
public int nextPage() {
return this.page < this.maxPage() ?
this.page+1 : this.page ;
}
需要新增方法:初始化pagebean
public void setRequest(HttpServletRequest req) {
this.setPage(req.getParameter("page"));
this.setRows(req.getParameter("rows"));
this.setPageination(req.getParameter("pagination"));
this.setUrl(req.getRequestURL().toString());
this.setParameterMap(req.getParameterMap());
}
二、分页的自定义标签
在tld文件里面写一个page分页的tag标签
<tag>
<name>page</name>
<tag-class>com.yzp.tag.PageTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>pagebean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
然后写助手类
package com.yzp.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.yzp.util.PageBean;
/**
* pagetag助手类
* @author 易泽鹏
*
* 2022年6月24日下午12:46:50
*/
public class PageTag extends BodyTagSupport{
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 (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.doStartTag();
}
private String toHTML() {
StringBuffer sb = new StringBuffer();
//隐藏的from表单,作用保存上一次查询条件
sb.append("<form action='"+pagebean.getUrl()+"' id='pageBeanForm' method='post'>");
sb.append("<input type='hidden' name='page' value=''>");
Map<String, String[]> parameterMap = pagebean.getParameterMap();
if(parameterMap!=null&¶meterMap.size()>0) {
Set<Entry<String,String[]>> entrySet = parameterMap.entrySet();
for (Entry<String, String[]> entry : entrySet) {
String key = entry.getKey();//name/likes/page/rows
String[] values = entry.getValue();
if(!"page".equals(key)) {
for (String value : values) {
sb.append("<input type='hidden' name='"+key+"' value='"+value+"'>");
}
}
}
}
sb.append("</form>");
//分页条
sb.append("<ul class='pagination justify-content-center'>");
sb.append(" <li class='page-item "+(pagebean.getPage()==1?"disabled":"")+"' ><a class='page-link'");
sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
sb.append(" <li class='page-item "+(pagebean.getPage()==1?"disabled":"")+"'><a class='page-link'");
sb.append(" href='javascript:gotoPage("+pagebean.previousPage()+")'><</a></li>");
sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pagebean.getPage()+"</a></li>");
sb.append(" <li class='page-item "+(pagebean.getPage()==pagebean.maxPage()?"disabled": "")+"'><a class='page-link' href='javascript:gotoPage("+pagebean.nextPage()+")'>></a></li>");
sb.append(" <li class='page-item "+(pagebean.getPage()==pagebean.maxPage()?"disabled": "")+"'><a class='page-link' href='javascript:gotoPage("+pagebean.maxPage()+")'>尾页</a></li>");
sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
sb.append(" <li class='page-item go'><a class='page-link'");
sb.append(" 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");
sb.append(" || parseInt(page) > "+pagebean.maxPage()+") {");
sb.append(" alert('请输入1~"+pagebean.maxPage()+"的数字');");
sb.append(" return;");
sb.append(" }");
sb.append(" gotoPage(page);");
sb.append(" }");
sb.append("</script>");
return sb.toString();
}
}
三、servlet
写一个servlet用来存值和转发jsp界面
package com.yzpservlet;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
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.yzp.dao.StuDao;
import com.yzp.entity.Stu;
import com.yzp.util.PageBean;
/**
*
* @author 易泽鹏
*
* 2022年6月24日下午12:47:48
*/
@WebServlet("/stu/search")
public class StuServlet extends HttpServlet {
@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 {
// req.getParameter("name");
// req.getParameterValues("likes");
// <input name="aa" value="">
// Map<String, String[]> parameterMap = req.getParameterMap();// name/likes
PageBean pagebean = new PageBean();
//存值
pagebean.setRequest(req);
// 调用学生dao
StuDao stuDao = new StuDao();
Stu stu = new Stu();
//拿到模糊查询的条件
stu.setSname(req.getParameter("sname"));
try {
//调用模糊查询得到学生集合
List<Stu> stus = stuDao.list2(stu, pagebean);
//将拿到的学生集合存到req
req.setAttribute("stus", stus);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
req.setAttribute("pagebean", pagebean);
//转发到学生主界面
req.getRequestDispatcher("/stulist.jsp").forward(req, resp);
}
}
四、jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://com.yizepeng.886" prefix="y"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">
<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>
<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 }/stu/search" method="post">
<div class="form-group mb-2">
<input type="text" class="form-control-plaintext" name="bname"
placeholder="请输入学生名称">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
</form>
<table class="table table-striped bg-success">
<thead>
<tr>
<th scope="col">学生编号</th>
<th scope="col">学生姓名</th>
<th scope="col">班级编号</th>
<th scope="col">教员编号</th>
<th scope="col">爱好编号</th>
</tr>
</thead>
<tbody>
<c:forEach items="${stus }" var="s">
<tr>
<td>${s.sid }</td>
<td>${s.sname}</td>
<td>${s.bid }</td>
<td>${s.jid }</td>
<td>${s.hid }</td>
</tr>
</c:forEach>
</tbody>
</table>
<y:page pagebean="${pagebean }"></y:page>
</body>
</html>
五、处理中文乱码
package com.yzp.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;
/**
* 中文乱码处理
* @author 易泽鹏
*
* 2022年6月22日上午8:40:00
*/
@WebFilter("/stu/*")
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();
}
}
}