通用分页【下】(将分页封装成标签)

news2024/12/27 12:07:42

目录

一、debug调试

1、什么是debug调试?

2、debug调试步骤

3、实践

二、分页的核心

三、优化

分页工具类

编写servlet

 jsp代码页面:

分页工具类PageBean完整代码 

四、分页标签

jsp代码

编写标签

tld文件

助手类

改写servlet

解析:

编码问题


一、debug调试

1、什么是debug调试?

调试(debugging)是指在软件开发过程中,通过识别、定位和解决程序错误或问题的过程。调试的目的是找出代码中的错误、异常或不正常的行为,并修复它们,以确保程序能够按照预期的方式运行。

调试是一个重要的开发技巧,可以帮助开发人员理解程序的执行过程、找出错误的原因,并从中学习和改进。调试通常包括以下步骤:

  1. 识别问题:在程序产生错误或不正常行为时,首先需要确认问题的存在,并尽可能准确地描述问题的性质和触发方式。
  2. 定位问题:确定问题的发生位置,即问题引发的具体代码行或功能模块。可以通过观察错误消息、日志、异常堆栈跟踪等信息来定位问题。
  3. 分析原因:深入分析问题,找出导致问题的原因。这可能涉及到检查变量值、代码逻辑、输入数据、函数调用等方面的信息。
  4. 修复问题:根据分析结果,采取适当的措施修复问题。这可能包括修改代码、修正数据输入、重新设计算法等。
  5. 验证修复:在修改代码之后,重新运行程序以验证修复是否成功。使用测试数据和场景进行测试,并确保程序现在能够正常执行。

调试可以使用不同的工具和技术来辅助,例如打印输出、日志记录、调试器(debugger)等。调试是开发过程中不可或缺的一部分,可以帮助开发人员提高代码质量、加快解决问题的速度,并优化程序的性能和可靠性。

2、debug调试步骤

调试(debugging)是指在软件开发过程中,通过识别、定位和解决程序错误或问题的过程。调试的目的是找出代码中的错误、异常或不正常的行为,并修复它们,以确保程序能够按照预期的方式运行。

调试是一个重要的开发技巧,可以帮助开发人员理解程序的执行过程、找出错误的原因,并从中学习和改进。调试通常包括以下步骤:

  1. 识别问题:在程序产生错误或不正常行为时,首先需要确认问题的存在,并尽可能准确地描述问题的性质和触发方式。
  2. 定位问题:确定问题的发生位置,即问题引发的具体代码行或功能模块。可以通过观察错误消息、日志、异常堆栈跟踪等信息来定位问题。
  3. 分析原因:深入分析问题,找出导致问题的原因。这可能涉及到检查变量值、代码逻辑、输入数据、函数调用等方面的信息。
  4. 修复问题:根据分析结果,采取适当的措施修复问题。这可能包括修改代码、修正数据输入、重新设计算法等。
  5. 验证修复:在修改代码之后,重新运行程序以验证修复是否成功。使用测试数据和场景进行测试,并确保程序现在能够正常执行。

调试可以使用不同的工具和技术来辅助,例如打印输出、日志记录、调试器(debugger)等。调试是开发过程中不可或缺的一部分,可以帮助开发人员提高代码质量、加快解决问题的速度,并优化程序的性能和可靠性。

3、实践

1)debug启动项目

 

2)在调试的地方使用断点

这里会有一个小钥匙

 

你在你的浏览器重新加载

 

我们回到运行的界面,可以看到debug的窗口

 

鼠标放在上面可以看到结果,我们点击键盘里的F6可以查看下一步

 禁用debug断点

 

中间还有些是省略的,大家可以查相关资料


二、分页的核心

 

  • 当我们在第次搜索的里面搜索你想要的东西的时候,后台分页拿到:bname=XXX、page=1、rows=100、pagintion=true(可传可不传,但是不分页下拉框需求时必须传入false)

  • 我们第次查询(下一页)只是页码进行改变:bname=XXX、page=2、rows=100、pagintion=true(可传可不传,但是不分页下拉框需求时必须传入false)

  • 我们第次查询(尾页)相比第二次只是页码进行改变,其他都不变:bname=XXX、page=2、rows=100、pagintion=true(可传可不传,但是不分页下拉框需求时必须传入false)

【总结】相比上一次的查询,我们只是页码进行了一个改变,其他的查询都不会改变

三、优化

优化pageBean

增加一个属性url,保留上一次发送请求的地址。

增加一个属性pareMap,保留上一次发送请求携带的参数。

req.getParameterMap();

增加一个最大页的方法。

增加一个下一页的方法。

增加一个上一页的方法。

初始化pagebean的方法。

分页工具类

在这之前我们先要找到我们的代码应该放在上面位置,以便我们更好的去编写我们的代码

 

我们需要在PageBean增加以上的属性和方法

	// 上一次查询的url
	private String url;
	// 上一次查询所携带的查询条件
	private Map<String, String[]> parameterMap = new HashMap<String, String[]>();

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

	/**
	 * 对pagebean进行初始化
	 * 
	 * @param req
	 */
	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.getRequestURL().toString());
		// 保留上一次的查询条件
		this.setParameterMap(req.getParameterMap());
	}

    private void setPagination(String pagination) {
		// 只有填写了false字符串,才代表不分页

		if (StringUtils.isNotBlank(pagination))
		this.setPagination(!"false".equals(pagination));
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}

	// 上一页
	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;
	}

编写servlet

package com.tgq.servlet;

import java.io.IOException;
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.tgq.util.PageBean;

/**
 * 分页的Servlet
 */
@WebServlet("/PageServlet")
public class PageServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	@SuppressWarnings("unused")
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String bname = request.getParameter("bname");
		// map包含了浏览器传递到后台的所有参数的键值对
		Map<String, String[]> map = request.getParameterMap();
		// 浏览器请求地址
		String url = request.getRequestURI().toString();

		request.getRequestDispatcher("index.jsp").forward(request, response);

	}

}

因为我们在PageBean增加了方法,所以我们servlet也进行了一定的变化

package com.tgq.servlet;

import java.io.IOException;
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.tgq.util.PageBean;

/**
 * 分页的Servlet
 */
@WebServlet("/PageServlet")
public class PageServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	@SuppressWarnings("unused")
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// String bname = request.getParameter("bname");
		// // map包含了浏览器传递到后台的所有参数的键值对
		// Map<String, String[]> map = request.getParameterMap();
		// // 浏览器请求地址
		// String url = request.getRequestURI().toString();

		PageBean pb = new PageBean();
		pb.setRequest(request);

		request.setAttribute("pb", pb);
		request.getRequestDispatcher("index.jsp").forward(request, response);

	}

}

我们运行debug可以看到

 jsp代码页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>书籍列表</title>
</head>
<body>
	${pageBean}
</body>
</html>

输出结果:

分页工具类PageBean完整代码 

package com.tgq.util;

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

import javax.servlet.http.HttpServletRequest;

/**
 * 分页工具类
 * 
 * @author tgq
 *
 */
public class PageBean {

	private int page = 1;// 页码

	private int rows = 10;// 页大小

	private int total = 0;// 总记录数

	// 上一次查询的url
	private String url;
	// 上一次查询所携带的查询条件
	private Map<String, String[]> parameterMap = new HashMap<String, String[]>();

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

	/**
	 * 对pagebean进行初始化
	 * 
	 * @param req
	 */
	public void setRequest(HttpServletRequest req) {
		// 初始化jsp页面传递过来的当前页
		this.setPage(req.getParameter("page"));
		// 初始化jsp页面传递过来的页大小
		this.setRows(req.getParameter("rows"));
		// 初始化jsp页面传递过来是否分页
		this.setPagination(req.getParameter("pagination"));
		// 保留上一次的url查询请求
		this.setUrl(req.getRequestURL().toString());
		// 保留上一次的查询条件/参数
		this.setParameterMap(req.getParameterMap());
	}

	private void setPagination(String pagination) {
		// 只有填写了false字符串,才代表不分页
		if (StringUtils.isNotBlank(pagination))
			this.setPagination(!"false".equals(pagination));
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}

	// 上一页
	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;
	}

	public String getUrl() {
		return url;
	}

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

	public Map<String, String[]> getParameterMap() {
		return parameterMap;
	}

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

	private void setRows(String rows) {
		if (StringUtils.isNotBlank(rows))
			this.setRows(Integer.valueOf(rows));
	}

	private void setPage(String page) {
		if (StringUtils.isNotBlank(page))
			this.setPage(Integer.valueOf(page));
	}

	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;
	}

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

}

四、分页标签

分页代码:我们需要

HTML        分页条

JS

form

我们需要利用标签

<t:page pageBean="${pageBean}" ></pageBean>

tld

助手类

jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!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 }/book.action" 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">书籍ID</th>
				<th scope="col">书籍名</th>
				<th scope="col">价格</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>1</td>
				<td>圣墟第1章</td>
				<td>1</td>
			</tr>
			<tr>
				<td>1</td>
				<td>圣墟第1章</td>
				<td>1</td>
			</tr>

		</tbody>
	</table>
	
	<form action="" id="pageBeanForm" method="post">
		<input type="hidden" name="page">
	</form>zzz
	<ul class="pagination justify-content-center">
		<li class="page-item"><a class="page-link"
			href='javascript:gotoPage(1)'>首页</a></li>
		<li class="page-item"><a class="page-link"
			href='javascript:gotoPage(1)'>&lt;</a></li>
		<li class="page-item"><a class="page-link" href="#">1</a></li>
		<li class="page-item"><a class="page-link" href="#">2</a></li>
		<li class="page-item active"><a class="page-link" href="#">3</a></li>
		<li class="page-item disabled"><a class="page-link" href="#">&gt;</a></li>
		<li class="page-item disabled"><a class="page-link" href="#">尾页</a></li>
		<li class="page-item go-input"><b>到第</b><input class="page-link"
			type="text" id="skipPage" name="" /><b>页</b></li>
		<li class="page-item go"><a class="page-link"
			href="javascript:skipPage()">确定</a></li>
		<li class="page-item"><b>共666条</b></li>
	</ul>

	<script type='text/javascript'>
		function gotoPage(page) {
			document.getElementById('pageBeanForm').page.value = page;
			document.getElementById('pageBeanForm').submit();
		}

		function skipPage() {
			var page = document.getElementById('skipPage').value;
			if (!page || isNaN(page) || parseInt(page) < 1
					|| parseInt(page) > 1122) {
				alert('请输入1~N的数字');
				return;
			}
			gotoPage(page);
		}
	</script>

</body>
</html>

编写标签

tld文件
 

<?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>t</short-name>
	<!-- 路径 -->
	<uri>http://jsp.tgq.cn</uri>

	<tag>
		<!-- 标签库名 -->
		<name>page</name>
		<!-- 对应的助手类 -->
		<tag-class>com.tgq.tag.PageTag</tag-class>
		<!-- 代表JSP标签 -->
		<body-content>JSP</body-content>
		<attribute>
			<!-- 自定义JSP标签的属性名称 -->
			<name>pageBean</name>
			<!-- 该属性是否必填 -->
			<required>true</required>
			<!-- 该属性值是否支持表达式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

</taglib>

助手类

package com.tgq.tag;

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

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

import com.tgq.util.PageBean;

/**
 * 
 * @author tgq
 *
 */
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 {
		return SKIP_BODY;
	}
}

我们要做的是把

<ul class="pagination justify-content-center">
		<li class="page-item"><a class="page-link"
			href='javascript:gotoPage(1)'>首页</a></li>
		<li class="page-item"><a class="page-link"
			href='javascript:gotoPage(1)'>&lt;</a></li>
		<li class="page-item"><a class="page-link" href="#">1</a></li>
		<li class="page-item"><a class="page-link" href="#">2</a></li>
		<li class="page-item active"><a class="page-link" href="#">3</a></li>
		<li class="page-item disabled"><a class="page-link" href="#">&gt;</a></li>
		<li class="page-item disabled"><a class="page-link" href="#">尾页</a></li>
		<li class="page-item go-input"><b>到第</b><input class="page-link"
			type="text" id="skipPage" name="" /><b>页</b></li>
		<li class="page-item go"><a class="page-link"
			href="javascript:skipPage()">确定</a></li>
		<li class="page-item"><b>共666条</b></li>
	</ul>

替换成标签

<t:page pageBean="${pageBean }"></t:page>

所以我们要在助手类进行一个拼接,拼接我们就要编写一个方法

@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SKIP_BODY;
	}

	private String toHTML() {
		StringBuilder sb = new StringBuilder();

		// 这里拼接的是一个上一次发送的请求以及携带的参数,唯一改变的就是页码
		sb.append("<form id='pageBeanForm' action='" + pageBean.getUrl() + "' method='post'>");
		/* sb.append("<input type='hidden' name='methodName' value='list'>"); */
		sb.append("<input type='hidden' name='page'>");
		// 重要设置拼接操作,将上一次请求参数携带到下一次
		Map<String, String[]> paMap = pageBean.getParameterMap();
		if (paMap != null && paMap.size() > 0) {
			Set<Map.Entry<String, String[]>> entrySet = paMap.entrySet();
			for (Map.Entry<String, String[]> entry : entrySet) {
				for (String val : entry.getValue()) {
					if (!"page".equals(entry.getKey())) {
						sb.append("<input type='hidden' name='" + entry.getKey() + "' value='" + val + "'>");
					}
				}
			}
		}
		sb.append("</form>");

		int page = pageBean.getPage();// 当前页
		int max = pageBean.getMaxPage();// 最大页
		int before = page > 4 ? 4 : page - 1;// 前面有几页,当前页显示前面显示几页,默认显示4页
		// 一共显示10页
		int after = 10 - 1 - before;// 后面的页数
		// 后面还有几页,必须后面还有5页才显示
		after = page + after > max ? max - page : after;
		// disabled
		boolean startFlag = page == 1;
		boolean endFlag = max == page;

		// 拼接分页条
		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();
	}

改写servlet

我们把之前的servlet进行一个修改;完整版的servlet

package com.tgq.servlet;

import java.io.IOException;
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.tgq.dao.BookDao;
import com.tgq.entity.Book;
import com.tgq.util.PageBean;

/**
 * 分页的Servlet
 */
@WebServlet("/book.action")
public class PageServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	@SuppressWarnings("unused")
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//修改前
		// String bname = request.getParameter("bname");
		// // map包含了浏览器传递到后台的所有参数的键值对
		// Map<String, String[]> map = request.getParameterMap();
		// // 浏览器请求地址
		// String url = request.getRequestURI().toString();
//修改后
		PageBean pageBean = new PageBean();
		pageBean.setRequest(request);

		// 查找我们的书籍
		BookDao bookDao = new BookDao();
		Book book = new Book();
        //获取到书籍的名称
		book.setBname(request.getParameter("bname"));
		try {
    //调用查询的方法
			List<Book> list = bookDao.list2(book, pageBean);
    //利用setAttribute保存
			request.setAttribute("list", list);
		} catch (Exception e) {
			e.printStackTrace();
		}
    //利用setAttribute保存
		request.setAttribute("pageBean", pageBean);
    //跳转到页面
		request.getRequestDispatcher("index.jsp").forward(request, response);

	}

}

运行结果:

解析:

在助手类的这行代码,是我们需要理解的

        int page = pageBean.getPage();// 当前页
		int max = pageBean.getMaxPage();// 最大页
		int before = page > 4 ? 4 : page - 1;// 前面有几页,当前页显示前面显示几页,默认显示4页
		// 一共显示10页
		int after = 10 - 1 - before;// 后面的页数
		// 后面还有几页,必须后面还有5页才显示
		after = page + after > max ? max - page : after;

 

编码问题

如果我们出搜索我们想要的就会出现一个乱码,这时候就需要用到过滤器来设置一个编码的问题

注意@WebFilter("*.action")这里的后缀必须要和我们的servlet@WebServlet("/book.action")后缀一样

package com.tgq.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;
import javax.xml.ws.WebFault;

/**
 * 中文乱码处理
 * 
 */
@WebFilter("*.action")
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();
		}
	}

}

 更改编码后我们去搜索我们想要的结果就不会出现乱码了

 

希望对你们有用!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Let's Learn .NET - Web 开发实战

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun Lets Learn .NET 系列 “Lets Learn .NET” 是面向全球的 .NET 初学者学习系列&#xff0c;旨在通过不同语言&#xff0c;帮助不同地区的开发者掌握最新的 .NET 开发知识与技能。 7月2日&#xff0c;“…

【文件传输FTP】网络杂谈(4)之文件传输协议FTP详解

涉及知识点 什么是 FTP&#xff0c;FTP的概念&#xff0c;FTP客户端程序cuteFTP&#xff0c;FTP客户程序浏览器&#xff0c;FTP的客户程序。深入了解FTP技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章…

Tips--解决SquareLine Studio create页面中只有desktop选项

解决SquareLine Studio create页面中只有desktop选项 前言问题解决方法方法1方法2 前言 LVGL是一个强大的GUI框架&#xff0c;很多电子爱好者使用很多。SquareLine Studio是针对LVGL的一款非常强大的图形化设计平台&#xff0c;大大缩减了UI设计的时间。 问题 但是很多小伙…

(二十三)专题地图编制——布局设置

专题地图编制——布局设置 ArcMap地图模板是一种事先设计好的地图样式和布局&#xff0c;可以用于快速创建具有一致性和专业外观的地图。在ArcMap中&#xff0c;可以通过在地图窗口中创建新地图或导入现有地图的方式来使用地图模板。地图模板通常包括基础地图数据、图例、标签…

使用 Jetpack Compose 构建 Switch

欢迎来到这篇关于如何使用 Jetpack Compose 构建 Switch&#xff08;开关&#xff09;的博客。Jetpack Compose 是 Google 的现代 UI 工具包&#xff0c;主要用于构建 Android 界面。它以声明式的方式简化了 UI 的开发。 一、什么是 Switch&#xff1f; 在 Android 中&#xf…

HOT27-合并两个有序链表

leetcode原题链接&#xff1a;合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1…

React修改Antd组件的样式

修改默认的antd组件&#xff0c;需要使用global import React, { useState, useEffect } from react; import { Tabs, Rate, Steps } from antd; import styles from ./index.less;const Index (props) >{return (<div className{styles.class_steps}><Stepsprog…

ATA-2161高压放大器在微流控技术细胞分选中的应用

高压放大器是一种专业的电子测试设备&#xff0c;用于将低电压信号放大为高电压信号。它在许多领域中被广泛应用&#xff0c;就例如微流控领域。今天我们就给大家分享一下ATA-2161高压放大器在微流控技术细胞分选中的应用。 本次实验我们会用到ATA-2161高压放大器、示波器、信号…

4、Redis7 十大数据类型总结与十大常见应用场景

一、缓存 作为Key-Value形态的内存数据库&#xff0c;Redis 最先会被想到的应用场景便是作为数据缓存。目前这几乎是所有中大型网站都在用的必杀技&#xff0c;合理的利用缓存不仅能够提升网站访问速度&#xff0c;还能大大降低数据库的压力&#xff0c;而使用 Redis 缓存数据也…

SpringSecurity认证流程详解和代码实现

一、常见的登录校验流程 常见的登录&#xff0c;主要就是要做认证和授权。 从上面可以看到&#xff0c;登录校验的过程&#xff08;认证&#xff09;&#xff0c;主要就是围绕一个包含了用户信息的token来进行的。 至于授权的流程&#xff0c;也是由SpringSecurity来完成&…

访问PHP网页提示:将您重定向的次数过多,提示 301

访问PHP网页提示&#xff1a;将您重定向的次数过多,提示 301 chrome 浏览器 访问PHP网页提示&#xff1a;将您重定向的次数过多,提示 301 chrome 浏览器 去 chrome 浏览器设置&#xff0c;如下图 chrome://net-internals/#hsts

高性能计算培训价格 零基础入门 从入门到精通

大模型一出&#xff0c;各类企业的各类“模型”竞赛般的亮家伙&#xff0c;算力时代抢先到来。2023年4月超算互联网的正式部署&#xff0c;标志着&#xff0c;很快&#xff0c;越来越多的应用都需要巨大的计算资源。 这给传统的计算机体系结构带来了巨大的挑战&#xff0c;计算…

Layui多选框提交时只能获取到最后一个选中的值的解决办法

<div class"layui-card"><div class"layui-card-header layui-this">包装类型</div><div class"layui-card-body"><input type"checkbox" name"aa" title"1A-100" value"1A-100&…

【Linux】文件基础IO操作:C语言接口 | 系统调用接口 | 重定向

重修C语言文件知识Linux文件知识标记位传参文件的系统调用理解什么是文件文件fd的分配规则重定向C语言文件层面的缓冲区知识 重修C语言文件知识 打开文件操作fopen函数&#xff1a; 我们看一段代码&#xff0c;以写(w)的形式来打开文件&#xff1a; #include <stdio.h>…

Web服务器群集:部署Tomcat

目录 一、理论 1.Tomcat 2.JDK 3.Tomcat安装 4.Tomcat优化 5.Tomcat虚拟主机设置 二、实验 1.JDK安装 2.Tomcat安装 3.Tomcat优化 4.Tomcat 虚拟主机配置 三、总结 一、理论 1.Tomcat &#xff08;1&#xff09;概念 Tomcat服务器是一个免费的开放源代码的Web应用…

emscripten的安装

参考&#xff1a;1.1 安装Emscripten-C/C面向WebAssembly编程 下载emsdk&#xff08;emscripten&#xff09;&#xff0c;git地址&#xff1a;git clone GitHub - emscripten-core/emsdk: Emscripten SDK打开emsdk中emsdk.bat所在的目录&#xff0c;进入cmd&#xff0c;输入 e…

Node.js健康检查和过载保护

[图片来源&#xff1a;unsplash.com[1]] 设想一下&#xff0c;你有30个Node服务器与 "Nginx "服务器平衡。服务器的负载被平均分配&#xff0c;所以如果你有9000个用户&#xff0c;每个服务器有300个客户。把负载平均分配给每台服务器并不意味着你可以避免过载&#…

linux下MySQL忘记密码解决方法

背景&#xff1a;自己搭建了很多测试环境&#xff0c;有的时候&#xff0c;某一台机器上面的MySQL密码可能就忘了&#xff0c;这种情况怎么办&#xff1f;记录一下解决方法&#xff0c;便于以后迅速解决这一类问题 第一步&#xff1a;查看MySQL的进程是否存活 ps -ef|grep my…

CMU15-445 2022 Fall 通关记录 —— Project 2:B+ Tree(上篇)

Project 2&#xff1a;B Tree Project #2 - BTree | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) NOTE&#xff1a; 记录完成该Pro中&#xff0c;一些可能会遇到的问题&#xff1a; 本实验中&#xff0c;有很多API是需要自己去实现的&#xff0c;因此&#xf…

NLP入门:word2vec self-attention transformer diffusion的技术演变

这一段时间大模型的相关进展如火如荼&#xff0c;吸引了很多人的目光&#xff1b;本文从nlp领域入门的角度来总结相关的技术路线演变路线。 1、introduction 自然语言处理&#xff08;Natural Language Processing&#xff09;&#xff0c;简称NLP。这个领域是通过统计学、数…