J2EE&通用分页02

这篇具有很好参考价值的文章主要介绍了J2EE&通用分页02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.重构-提取公用方法        

   1.为了进行公共方法的抽取,需要找出上面实习中的可通用部分,和差异化部分

    2.公用方法封装思路

      3. 具体实现

二.分页标签

2.1 准备一个Servlet

 3.2 结果展示页面

三. 过滤器解决中文乱码问题

四.加入分页功能

四.封装分页标签

 编写助手类

标签库描述文件中添加paging标签 

 使用分页标签首先在页面中引入标签

将原来的分页功能,替换为标签即可

MySQL分页

 最后结果展示页面


一.重构-提取公用方法        

   1.为了进行公共方法的抽取,需要找出上面实习中的可通用部分,和差异化部分

  • .只要是分页,就会统计总记录数,而总记录数的统计是在业务sql外封装了一个select count(*)是有规律可循的,可以通用
  • 只要是分页,则封装分页sql也是有规律可循的(在业务sql后加limit子句即可),可以通用
  • 因为每个查询对应的业务实体(即模型)不同,所以ORM映射部分不能通用

    2.公用方法封装思路

  • 将可通用的部分封装到模板中

  • 差异化部分(即不可通用部分),可以定义一个处理接口,以便于通过参数传入个性化的实现部分

      3. 具体实现

通用分页查询模板类:

public final class DBTemplate {
	
	private DBTemplate() {
	}
	
	public static interface IORMConvert<T> {
		List<T> convert(ResultSet rs) throws SQLException;
	}
	
	public static <T> List<T> query(String sql, 
			Object[] params, 
			PageBean pageBean, 
			IORMConvert<T> convert) {
		
		List<T> datas = new ArrayList<>();
		
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		//不需要分页
		if (pageBean == null || !pageBean.isPagination()) {
			try {
				con = DBUtil.getConection();
				ps = con.prepareStatement(sql);
				
				setParam(params, ps);
				
				rs = ps.executeQuery();
				
				datas = convert.convert(rs);
				
				return datas;
			} catch(Exception e) {
				e.printStackTrace();
			} finally {
				DBUtil.closeDB(rs, ps, con);
			}
			
		} else {
			//1. 查询总记录数
			//2. 查询当前页数据
			
			//1. 生成统计总记录数的SQL, 查询总记录数
			try {
				String countSql = "select count(*) from (" + sql + ") tmp";
				con = DBUtil.getConection();
				
				ps = con.prepareStatement(countSql);
				
				setParam(params, ps);
				
				rs = ps.executeQuery();
				
				while(rs.next()) {
					pageBean.setTotal(rs.getInt(1));
				}
				
				/*
				 * 如果统计的总记录数为0,则表示没有符合条件的记录,直接返回一个空结果集即可。
				 */
				if(pageBean.getTotal() == 0) {
					return datas;
				}
				
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if(pageBean.getTotal() == 0) {
					DBUtil.closeDB(rs, ps, con);
				}
				DBUtil.closeDB(rs, ps);
			}
			
			//查询当前页数据
			try {
				String pagingSql = sql 
						+ " limit " 
						+ pageBean.getStartRow() 
						+ ", " 
						+ pageBean.getRows();
				ps = con.prepareStatement(pagingSql);
				
				setParam(params, ps);
				
				rs = ps.executeQuery();
				
				datas = convert.convert(rs);
				
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				DBUtil.closeDB(rs, ps, con);
			}
			
		}
		
		return datas;
	}

	private static void setParam(Object[] params, PreparedStatement ps) throws SQLException {
		if (params != null) {
			int i = 1;
			for (Object param : params) {
				ps.setObject(i, param);
				i++;
			}
		}
	}

}

使用示例:

public class StudentDao2 {
	
	public List<Student> getStudents(String sname, PageBean pageBean) {
		
		String sql = "select * from t_student where sname like ?";
		
		return DaoTemplate.query(sql, new Object[] {sname}, pageBean, new IORMConvert<Student>() {
			
			@Override
			public List<Student> convert(ResultSet rs) throws SQLException {
				List<Student> stus = new ArrayList<>();
				while(rs.next()) {
					Student stu = new Student();
					stu.setSid(rs.getInt("sid"));
					stu.setSname(rs.getString("sname"));
					stu.setAge(rs.getInt("age"));
					stu.setRemark(rs.getString("remark"));
					stus.add(stu);
				}
				
				return stus;
			}
		});
		
	}
	
	public static void main(String[] args) {
		StudentDao2 dao = new StudentDao2();
		PageBean pageBean = new PageBean();
		pageBean.setPage(3);
		List<Student> students = dao.getStudents("张%", pageBean);
		students.forEach(s -> System.out.println(s));
	}

}

二.分页标签

2.1 准备一个Servlet

准备一个servlet用于处理请求,获取数据库中的数据,并转发到结果显示页面

@WebServlet(value = "/students")
public class StudentAction extends HttpServlet {
		
	private static final long serialVersionUID = 3152900867611381148L;
	private StudentDao2 studentDao = new StudentDao2();

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		doPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		PageBean pageBean = new PageBean();
		pageBean.setRequest(request);
		request.setAttribute("pageBean", pageBean);
		
		String sname = request.getParameter("sname");
		List<Student> students = studentDao.getStudents(sname+"%", pageBean);
		request.setAttribute("students", students);
		
		System.out.println("dopost .......... ");
		request.getRequestDispatcher("/students/stuList.jsp").forward(request, response);
	}
	
}

 3.2 结果展示页面

创建一个页面,该页面用于显示结果, 使用jstl的c标签来展示结果,为正常使用c标签,需要引入jstl-1.2.jar和standard-1.1.2.jar。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="z" uri="/zking" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>学生信息</h1>
	
	<form action="<%=request.getContextPath()%>/students" method="post">
		<input type="text" name="sname">
		<input type="submit" value="查询">
	</form>
	
	<table border="1" style="width: 98%;">
	
		<tr>
			<td>学号</td>
			<td>姓名</td>
			<td>年龄</td>
			<td>备注</td>
		</tr>
		
		<c:forEach items="${students}" var="student">
			<tr>
				<td>${student.sid}</td>
				<td>${student.sname}</td>
				<td>${student.age}</td>
				<td>${student.remark}</td>
			</tr>
		</c:forEach>

<z:paging pageBean="${pageBean}"/>
		
	</table>
</body>
</html>

三. 过滤器解决中文乱码问题

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

}

四.加入分页功能

  • 先不考虑功能性在页面上的table标签下,加入及分页工具条
<div style="text-align: right; width:98%;">
		第1页&nbsp;&nbsp;&nbsp;
		共100条记录&nbsp;&nbsp;&nbsp;
		<a>首页</a>&nbsp;&nbsp;&nbsp;
		<a>上页</a>&nbsp;&nbsp;&nbsp; 
		<a>下页</a>&nbsp;&nbsp;&nbsp; 
		<a>尾页</a>&nbsp;&nbsp;&nbsp;
		第<input type="text" size="2" /> 
		<a href="#">GO</a>
	</div>
  • 不考虑通过的分页如下实现,先在结果页面中实现分页功能。
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="z" uri="/zking" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h1>学生信息</h1>
	
	<form action="<%=request.getContextPath()%>/students" method="post">
		<input type="text" name="sname"/>
		<input type="submit" value="查询">
	</form>
	
	<table border="1" style="width: 98%;">
	
		<tr>
			<td>学号</td>
			<td>姓名</td>
			<td>年龄</td>
			<td>备注</td>
		</tr>
		
		<c:forEach items="${students}" var="student">
			<tr>
				<td>${student.sid}</td>
				<td>${student.sname}</td>
				<td>${student.age}</td>
				<td>${student.remark}</td>
			</tr>
		</c:forEach>
	</table>
	
	<!-- 分页页面元素 -->
	<div style="text-align: right; width:98%;">
		第${pageBean.page}页&nbsp;&nbsp;&nbsp;
		共${pageBean.total}条记录&nbsp;&nbsp;&nbsp;
		<a href="javascript: goPage(1);">首页</a>&nbsp;&nbsp;&nbsp;
		<a href="javascript: goPage('${pageBean.previousPage}');">上页</a>&nbsp;&nbsp;&nbsp; 
		<a href="javascript: goPage('${pageBean.nextPage}');">下页</a>&nbsp;&nbsp;&nbsp; 
		<a href="javascript: goPage('${pageBean.totalPage}')">尾页</a>&nbsp;&nbsp;&nbsp;
		第<input type="text" id="pagingPageNum" size="2" onkeypress="goSpecifiedPage(event,this.value);"/> 
		<a href="javascript: goPage(document.getElementById('pagingPageNum').value)">GO</a>
	</div>
	
	<!-- 用于分页的隐藏表单 -->
	<form action="${pageBean.url}" id="pagingForm" method="post">
		<input type="hidden" name="page" value="${pageBean.page}"/>
		<!-- 先只考虑本功能的查询参数,没有考虑公用性(不同功能的参数不同) -->
		<input type="hidden" name="sname" value="<%=request.getParameter("sname")%>"/>
	</form>
	
	<!-- 用于分页的js代码 -->
	<script>
	function goPage(pageNum) {
		var form = document.getElementById("pagingForm");
		form.page.value = pageNum;
		form.submit();
	}
	
	function goSpecifiedPage(event) {
		if(event.keyCode == 13) {
			var pageNum = document.getElementById("pagingPageNum").value;
			var form = document.getElementById("pagingForm");
			form.page.value = pageNum;
			form.submit();
		}
	}
	</script>
	
</body>
</html>

目前为止,分页功能已经实现了。

遗留下来的问题:
1   如果其他功能需要分页,则需要复制大量代码才能重用该功能
2    如果系统需要修改分页工具栏的显示风格呢?

四.封装分页标签

为了方便代码的复用,及可维护性,我们将分页功能封装了一个自定义标签(其实就是将原来写在页面中的代码,通过移入到自定义标签中去实现),开发自定义标签分成三步:

  • 编写助手类
  • 编写标签描述文件
  • 在页面上引入标签库,并使用

 编写助手类

        

public class PagingTag 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 = this.pageContext.getOut();
		
		try {
			out.println(buildHtml());
			return SKIP_BODY;
		} catch (IOException e) {
			throw new JspException("分页标签异常", e);
		}
		
	}
	
	//生成Html内容
	private String buildHtml() {
		
		//构建分页页面元素
		String pagingElement = "<div style=\"text-align: right; width:98%;\">\r\n" + 
				"		第"  + pageBean.getPage() + "页&nbsp;&nbsp;&nbsp;\r\n" + 
				"		共" + pageBean.getTotal() + "条记录&nbsp;&nbsp;&nbsp;\r\n" + 
				"		<a href=\"javascript: goPage(1);\">首页</a>&nbsp;&nbsp;&nbsp;\r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getPreviousPage() + "');\">上页</a>&nbsp;&nbsp;&nbsp; \r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getNextPage() + "');\">下页</a>&nbsp;&nbsp;&nbsp; \r\n" + 
				"		<a href=\"javascript: goPage('" + pageBean.getTotalPage() + "')\">尾页</a>&nbsp;&nbsp;&nbsp;\r\n" + 
				"		第<input type=\"text\" id=\"pagingPageNum\" size=\"2\" value='"+pageBean.getPage()+"' onkeypress=\"goSpecifiedPage(event,this.value);\"/> \r\n" + 
				"		<a href=\"javascript: goPage(document.getElementById('pagingPageNum').value)\">GO</a>\r\n" + 
				"	</div>";
		
		//构建隐藏表单,用于在分页时传递分页参数
		String hiddenForm = "<form action='" + pageBean.getUrl() + "' id=\"pagingForm\" method=\"post\">"
				+ "<input type=\"hidden\" name=\"page\" />";
		Map<String, String[]> parameterMap = pageBean.getParameterMap();
		for(Map.Entry<String, String[]> param: parameterMap.entrySet()) {
			String paramName = param.getKey();
			if("page".equals(paramName)) continue;
			String[] values = param.getValue();
			for(String val:  values) {
				hiddenForm += "<input type='hidden' name='" + paramName + "' value='" + val + "'>";
			}
		}
		hiddenForm += "</form>";
		
		//构建分页功能需要的js代码块
		String script = "<script>\r\n" + 
				"	function goPage(pageNum) {\r\n" + 
				"		var form = document.getElementById(\"pagingForm\");\r\n" + 
				"		form.page.value = pageNum;\r\n" + 
				"		form.submit();\r\n" + 
				"	}\r\n" + 
				"	\r\n" + 
				"	function goSpecifiedPage(event) {\r\n" + 
				"		if(event.keyCode == 13) {\r\n" + 
				"			var pageNum = document.getElementById(\"pagingPageNum\").value;\r\n" + 
				"			var form = document.getElementById(\"pagingForm\");\r\n" + 
				"			form.page.value = pageNum;\r\n" + 
				"			form.submit();\r\n" + 
				"		}\r\n" + 
				"	}\r\n" + 
				"	</script>";
		
		return pagingElement + hiddenForm + script;
	}
	

}

标签库描述文件中添加paging标签 

<tag>
		<name>paging</name>
		<tag-class>com.zking.mvc.tag.PagingTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>pageBean</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

 使用分页标签
首先在页面中引入标签

<%@taglib prefix="z" uri="/zking" %>

将原来的分页功能,替换为标签即可

<z:paging pageBean="${pageBean}"/>

MySQL分页

  • limit语法

select * from table_name limit [offset,] rows
  • 参数说明

参数 说明
offset 指定第一个返回记录行的偏移量(即从哪一行开始返回),注意:初始行的偏移量为0
offset

返回具体行数

 最后结果展示页面

J2EE&通用分页02,java-ee,java,数据库,eclipse,map,xml

 文章来源地址https://www.toymoban.com/news/detail-611805.html

到了这里,关于J2EE&通用分页02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot+java汽车配件销售业绩管理系统 J2EE平台技术

    汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据

    2024年02月06日
    浏览(35)
  • J2EE&集合框架&Set

    目录 一.Set特点 特点:无序,不重复 思考:如果对List容器中的元素去重? 二.遍历:foreach,迭代器 三.扩容: 初始容量16,负载因子0.75,扩容增量1倍 性能参数:初始容量,负载因子 默认值: 初始容量16,负载因子0.75 示例:new HashSet(20, 0.5f); 四.HashSet 五.思考 1. 如何给Arra

    2024年02月13日
    浏览(28)
  • J2EE&集合框架&List

    目录 一.UML ①集合类图 ②线下教育平台用例图  二.List集合特点 ①学集合框架就是了解容器的数据结构(增删改查) ②有序的 可重复的 三.遍历方式 ① foreach ② iterator 迭代器 ③ for 四.LinkedList ①对比ArrayList是数据结构 Linkedlist: 链表 特点:查询修改慢,增加删除快 Arrayli

    2024年02月13日
    浏览(24)
  • J2EE&集合框架&Map

    目录 一.Map特点 1.无序,键值对,键不能重复,值可以重复 2.键重复则覆盖,没有继承Collection接口 二.遍历方式 1.拿到key,再拿值2.拿到映射关系,键值都有  取出保存所有Entry的Set,再遍历此Set即可 三.HashMap与Hashtable的区别 1.Hashtable更安全 2.JDK 1.8之前hashtable的key不能存放null

    2024年02月15日
    浏览(36)
  • J2EE&集合框架&set集合

    目录 一.Set特点 特点:无序,不重复 思考:如果对List容器中的元素去重? 二.遍历:foreach,迭代器 三.扩容: 初始容量16,负载因子0.75,扩容增量1倍 性能参数:初始容量,负载因子 默认值: 初始容量16,负载因子0.75 示例:new HashSet(20, 0.5f); 四.HashSet 五.思考 1. 如何给Arra

    2024年02月13日
    浏览(30)
  • J2EE项目部署与发布(Windows版本)

    目录 一、会议OA单体项目Windows部署 1.1 数据测试 1.2 项目部署 1.3 报错解决 1.4 最终效果 二、spa前后端分离项目Windows部署 2.1 后端代码测试 2.2 前端代码测试 2.3 项目部署 2.3.1 数据导入 2.3.2 后端部署 2.3.3 前端部署 2.3.3.1 Node.js环境配置 2.3.4 端口问题解决 2.3.4.1 method1 2.3.4.2 meth

    2024年02月07日
    浏览(33)
  • J2EE项目部署与发布(Linux版本)

    目录 一.jdktomcat安装 1.jdk的安装  1.2解压对应的安装包 1.3配置环境变量  2.tomcat的安装  二.mysql的安装 三.后端接口部署  后端部署 导入war包 修改端口  开启访问 1.jdk的安装 登录VMware Workstation Pro 然后连接MobaXterm      将 jdk tomcat mysql 导入到MobaXterm   1.2解压对应的安装包  

    2024年02月06日
    浏览(24)
  • J2EE自定义mvc【框架配置及功能】

    目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作(增删改) 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去 将分页标

    2024年02月12日
    浏览(41)
  • 虚拟机部署与发布J2EE项目(Linux版本)

                                                      🎬 艳艳耶✌️:个人主页                                                   🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》                                                     ⛺️ 越努力 ,越幸

    2024年02月06日
    浏览(33)
  • 【Linux】虚拟机部署与发布J2EE项目(Linux版本)

    前期准备工作 先创建一个文件夹用于存放我们的文件,把需要用到的环境都拷进去 1.jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 2.配置环境变量 进入path文件进行编辑 vim /etc/profile 输入配置jdk文件代码(JAVA_HOME后面填写自己所解压的JDK路径) export JAVA_HOME=/root/java/tools/jdk1.8.0_151 export JRE_

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包