Java Web分页显示实现思路

实现效果实现效果

一.需求描述

从数据库中将所有数据查询出来,分页显示在前端页面上,每页显示若干条数据,并实现"首页","上一页","下一页","尾页","跳转至指定页码","显示当前页码"等功能

 

二.实现思路

 我的思路是将当前页码的值作为参数传给servlet,作为查询时传入持久层的参数,查询出对应页的五条数据(我的项目中规定一页显示五条),然后将查询出来的对象集合传给jsp显示,下面是前端实现代码(此处请注意!实体对象的属性字段开头两个字母不能一个大写一个小写,这不符合JavaBean的属性命名规范,开头字母必须小写,例如username,不能写成UserName,否则在EL表达式中将报异常:javax.el.PropertyNotFoundException:Property 'UserName' not found on,因为我之前不清楚这个规范,所以当时在这个地方卡了很久 )

<script type="text/javascript">
  	function remove(node){
  		 var tr1 = node.parentNode.parentNode;
             var username = tr1.cells[1].innerText;
             alert(username);
             var newurl = "DeleteServlet?username="+username;
             location.href = newurl;
  	}
  	
  	function First(){
  		location.href = "PageServlet?pageno=1";
  	}
  	
  	function Last(){
  		var pageno =<%= (Integer)request.getAttribute("pageno")  %>
  		if(pageno<=1){
  			alert("这已经是最前面一页!");
  			return;
  		}else{
  			pageno = pageno - 1;
  			location.href = "PageServlet?pageno="+pageno;
  		}
  	}
  	
  	function Next(){
  		var pageno =<%= (Integer)request.getAttribute("pageno")  %>
  		var pagenum =<%= (Integer)request.getAttribute("pagenum") %>
  		if(pageno>=pagenum){
  			alert("没有下一页了!");
  			return;
  		}else{
  			pageno++;
  			
  			location.href = "PageServlet?pageno="+pageno;	
  		}
  	}
  	
  	function End(){
  		var pagenum =<%= (Integer)request.getAttribute("pagenum") %>
  		location.href = "PageServlet?pageno="+pagenum;
  	}
  	
  	function random(){
  		var spage=document.getElementById("randompage").value;
  		var pagenum =<%= (Integer)request.getAttribute("pagenum") %>
  		
  		if((spage>=1) && (spage<=pagenum)){
  			var pageno = spage;
  			location.href = "PageServlet?pageno="+pageno;	
  		}else{
  			alert("超出页码范围!请重新输入");
  		}		
  	}
 	</script>
	 <body>
   	<table border="1" id="no1">
   			<tr>
	   			<th>序号</th>
	   			<th>用户名</th>
	   			<th>用户密码</th>
	   			<th>用户邮箱</th>
	   			<th>用户性别</th>
	   			<th>用户所在地区</th>
	   			<th>用户密保序列号</th>
	   			<th>操作</th>
	   		</tr>
   		<c:forEach items="${us}" var="user">
   			<tr>
   				<td><%= count+=1 %></td>
	   			<td>${user.username}</td>
	   			<td>${user.password}</td>
	   			<td>${user.useremail}</td>
	   			<td>${user.sex}</td>
	   			<td>${user.country}</td>
	   			<td>${user.passwordstring}</td>
	   			<td><button onclick="remove(this)">删除</button></td>
   			</tr>
   		</c:forEach>
   	</table>
   	<table id="no2">
   		<tr>
   			<td><button onclick="First()">首页</button></td>
   			<td><button onclick="Last()">上一页</button></td>
   			<td><button onclick="Next()">下一页</button></td>
   			<td><button onclick="End()">尾页</button></td>
   			<label>当前数据库中共有<%= (Integer)request.getAttribute("pagenum") %>页</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   			<label>跳转至第</label>
   			<input id="randompage" type="text"  />页
     			<button onclick="random()">跳转</button>
     			<label>当前是第<%= (Integer)request.getAttribute("pageno") %>页</label>
   		</tr>
   	</table>
  </body>

 使用SQL查询语句 select  *  from  table_name  limit  n,m;(从指定表中查询第n条开始的m数据),将查询出来的数据放入集合中保存,以下是dao层的方法实现

	//查询当前页面的五条记录
	public List<User> queryuserlimit(int pageno) throws ClassNotFoundException, SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection(url,username,pwd);
		String sql = "select * from user limit ?,?";
		//企业级应用中通常使用preparedstatement而不使用statement
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = null;
		//pageno是当前要查询的页码值
		ps.setInt(1,(pageno*5)-5);
		ps.setInt(2,5);
		rs = ps.executeQuery();
		//将查询返回的结果集中的对象保存到集合中,方便jsp页面显示
		List<User> us = new ArrayList();
		while(rs.next()){
			User user = new User();
			user.setUsername(rs.getString("username"));
			user.setPassword(rs.getString("password"));
			user.setUseremail(rs.getString("useremail"));
			user.setSex(rs.getString("sex"));
			user.setCountry(rs.getString("country"));
			user.setPasswordstring(rs.getString("passwordstring"));
			us.add(user);
		}
		//关闭资源
		rs.close();
		ps.close();
		conn.close();
		return us;
	}

 

 

下面是Servlet的实现代码,将pageno作为参数传入servlet执行控制层的任务

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取页面传来的pageno页码值
		String pageno1 = request.getParameter("pageno");
		int pageno = Integer.parseInt(pageno1);
		System.out.println("JSP中传来的参数pageno="+pageno);
		UserdaoImpl ul = new UserdaoImpl();
		List<User> us = new ArrayList();
		try {
			us = ul.queryuserlimit(pageno);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			try {
				//查询数据库里所有信息   以获得pagenum(总页数)和usernum(总记录条数)
				ul.queryAll();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		//获取总页数的值
		int pagenum = ul.getPagenum();
		System.out.println("当前有"+pagenum+"页数据");
		//获取总记录条数的值
		int usernum = ul.getUsernum();
		System.out.println("当前有"+usernum+"条记录");
		for(User i : us){
			System.out.println(i.toString());
		}
		request.setAttribute("pageno", pageno);
		request.setAttribute("pagenum", pagenum);
		//传递usernum的值
		request.setAttribute("usernum", usernum);
		//传递保存User对象的集合us
		request.setAttribute("us", us);
		request.getRequestDispatcher("RootManage.jsp").forward(request, response);
	}

这个地方我们必须要获取当前数据库中的数据如果以五条一页显示时的总页码数以及数据库中的总记录条数,这个地方我处理的有点愚,数据库中的总记录数可以用select  count(*)  from  table_name这条SQL语句来查询,而我是查询了所有数据保存在集合中,再获取它的size(),这个办法有点愚。

我们在进入到显示前端的JSP时,应该给一些关键参数初始化,例如pageno(当前页码数)和pagenum(当前总页码数),如果不给pageno初始化值的话,会报空指针异常!这个地方很关键,下面是我JSP中的java代码

<%	
  	//打开浏览器时给pageno初始化,不然会报空指针异常
  	UserdaoImpl ul = new UserdaoImpl();
  	if(request.getAttribute("pageno") == null){
  		request.setAttribute("pageno",1);
  	}
  	//给每条数据编序号
  	int count = 5*(Integer)request.getAttribute("pageno")-5;
  	
  	if(request.getAttribute("us") == null){
  		List<User> al = ul.queryuserlimit(1);
  		request.setAttribute("us",al);
  		int pagenum = ul.getPagenum();
  		request.setAttribute("pagenum",pagenum);
  	}
   %>

 每次点击触发js事件来改变pageno的值,然后传给servlet,servlet调用持久层的方法来查询数据并转发到JSP,JSP再获取相应值发生改变。这就是我实现简单分页显示的思路。

三.文末总结

因为最近在学习java web22,所以一直在写相关的功能实现,今天写完这个分页显示的功能,突然想要在CSDN上写一篇技术类博客,一方面是因为自己一直在CSDN上免费获取各位大牛的知识,所以想为CSDN贡献点东西来回馈社区,真的很希望这篇博客能帮助到其他有需要的同学。另一方面是为了把自己这个阶段的所学所想记录下来,方便日后回看对比。

最后还是那句老话:不积跬步,无以至千里。不积小流,无以成江海。勉励自己,也勉励看到此文章的朋友。

  • 35
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: MyBatis-Plus可以使用Java代码来实现分页查询,具体步骤如下:1. 在Mapper文件定义SQL语句;2. 创建Page对象;3. 调用Mapper.selectPage方法执行查询;4. 使用Page对象获取分页结果。 ### 回答2: Mybatis-Plus是一个开源的JPA持久层框架,提供了许多方便实用的功能,其包括了分页查询的支持。下面是使用Java代码实现分页查询的步骤: 1. 先,需要在项目的依赖添加Mybatis-Plus的相关依赖,可以通过Maven或者Gradle来管理依赖。 2. 在实体类引入Page对象,该对象用于封装分页查询的结果信息。 ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; public class User { private Long id; private String name; private Integer age; // 省略getter和setter方法 } ``` 3. 创建Mapper接口,该接口继承自BaseMapper,并使用@Mapper注解标注。在接口定义分页查询的方法。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { Page<User> selectUserPage(Page<User> page); } ``` 4. 在Mapper.xml文件编写SQL语句,实现分页查询的逻辑。 ```xml <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserPage" resultType="com.example.entity.User"> select * from user </select> </mapper> ``` 5. 在Service层调用Mapper接口的分页查询方法,并传入Page对象和查询条件。 ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Page<User> getUserPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); userMapper.selectUserPage(page); return page; } } ``` 6. 最后,在Controller层调用Service层的方法,并将得到的分页结果返回给前端。 ```java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.entity.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public Page<User> getUserPage(@RequestParam int pageNum, @RequestParam int pageSize) { return userService.getUserPage(pageNum, pageSize); } } ``` 通过以上步骤,我们就可以使用Java代码实现分页查询了。在Controller层的接口,可以通过传入pageNum和pageSize参数来指定查询数和每的大小,然后通过Service层的方法调用Mapper层的方法,并将查询结果封装到Page对象返回给前端。 ### 回答3: Mybatis-plus是一个基于Mybatis的ORM框架,提供了很多便捷的操作方法,包括分页查询。下面是使用Java代码实现分页查询的示例: 1. 先,创建一个实体类,与数据的表对应,定义实体类的属性和对应的表字段。 ```java public class User { private Long id; private String name; private Integer age; // 省略 getter 和 setter 方法 } ``` 2. 在Mapper接口定义分页查询的方法。 ```java public interface UserMapper extends BaseMapper<User> { List<User> selectPage(Page<User> page); } ``` 3. 在ServiceImpl类实现分页查询的方法。 ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public Page<User> getUserByPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); page.setTotal(baseMapper.selectCount(null)); List<User> userList = baseMapper.selectPage(page); page.setRecords(userList); return page; } } ``` 4. 在Controller调用分页查询的方法,并返回结果给前端。 ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public Page<User> getUsers(@RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize) { return userService.getUserByPage(pageNum, pageSize); } } ``` 以上就是使用Java代码实现分页查询的步骤。在实际项目,可以根据需要进行调整和扩展,但整体思路是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值