刚学完Java Web相关知识,做一个分页查询功能演示,从这个案例中把之前的一些零散的小知识点结合起来,最重要的要学会面向对象思想的方式编程,
我们要做成如下界面:
要求实现的功能点击相应的页面可以完成查询
首先分析在分页条上我们知道显示了共12条记录这个是我们从数据库查询出来的,这个共几页是根据每一页显示条数计算出来的
totalCount//表示总记录数
totalPage//表示总页数
list//表示当前页面显示的数据
currnetPage//表示客户端当前的页码
以上的信息都是由服务器返回客户端的
学完Java以后我们要有面向对象的思想,我们可以把以上信息封装PageBean对象,我们可以把对象传送客户端,客户端通过el表达式,就可以拿到相应的参数的值
以上都是我们服务器发送给客户端的数据,
那么客户应该向服务端输入什么数据,我们才能可以返回客户端需要的数据呢。
很显然得知总记录数我们很容易得到
totalCount:select count(*) from user;
第二数据如何获取呢
totalPage//表示总页数 totalPage=totalCount/rows rows代表每页要显示的条数,由此得知我们还要客户端获取rows,才能计算出相应的totalPage//表示总页数
list:select * from user limit ?,?;
第一个?指的是查询的索引
第二个?指的是查询的rows
currnetPage也是需要客户端提供当前页码给服务器的
由此可以计算出索引(currnetPage-1)*rows
从以上分析的只要客户端提供 currnetPage//表示客户端当前的页码,,rows//每页要显示的条数
我们就可以返回客户端需要的数据
我们做下整个代码实现逻辑分析
活不多说直接上代码
首先创建PageBean对象
package cn.itcast.domain;
import java.util.List;
/**
* 分页对象
*/
public class PageBean<T> {
private int totalCount; // 总记录数
private int totalPage ; // 总页码
private List<T> list ; // 每页的数据
private int currentPage ; //当前页码
private int rows;//每页显示的记录数
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
@Override
public String toString() {
return "PageBean{" +
"totalCount=" + totalCount +
", totalPage=" + totalPage +
", list=" + list +
", currentPage=" + currentPage +
", rows=" + rows +
'}';
}
}
servlet代码
package cn.itcast.web.servlet;
import cn.itcast.domain.PageBean;
import cn.itcast.domain.User;
import cn.itcast.service.UserService;
import cn.itcast.service.impl.UserServiceImpl;
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 java.io.IOException;
import java.util.Map;
@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//1.获取参数
String currentPage = request.getParameter("currentPage");
String rows = request.getParameter("rows");
if(currentPage == null || "".equals(currentPage)){
currentPage = "1";
}
if(rows == null || "".equals(rows)){
rows = "5";
}
Map<String, String[]> condition = request.getParameterMap();
//2.调用service查询
UserService service = new UserServiceImpl();
PageBean<User> pb = service.findUserByPage(currentPage,rows,condition);
System.out.println(pb);
//3.将PageBean存入到request
request.setAttribute("pb",pb);
request.setAttribute("condition",condition);//用于回显信息
//4.转发到list.jsp
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
service代码
package cn.itcast.service.impl;
import cn.itcast.dao.Impl.UserDaoImpl;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.PageBean;
import cn.itcast.domain.User;
import cn.itcast.service.UserService;
import java.util.List;
import java.util.Map;
public class UserServiceImpl implements UserService {
private UserDao dao = new UserDaoImpl();
@Override
public List<User> findAll() {
//调用Dao类来完成查询
return dao.findAll();
}
@Override
public User login(User user) {
return dao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword());
}
@Override
public void AddUser(User user) {
dao.add(user);
}
@Override
public void delUser(String id) {
dao.del(id);
}
@Override
public User findUserId(String id) {
return dao.findUser(Integer.parseInt(id));
}
@Override
public void updateUser(User user) {
dao.update(user);
}
@Override
public void delSelectUser(String[] ids) {
//1.判断ids是否有值,防止报空指针异常
if(ids != null && ids.length>0){
for (String id : ids) {
dao.del(id);
}
}
//1.遍历数组
}
@Override
public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
int currentPage = Integer.parseInt(_currentPage);//String类型装换成int
int rows = Integer.parseInt(_rows);
if(currentPage < 1){
currentPage = 1;
}
//1.创建空的PageBean对象
PageBean<User> pb = new PageBean<User>();
//2.设置参数
pb.setCurrentPage(currentPage);
pb.setRows(rows);
//3.调用dao查询总记录数
int totalCount = dao.findTotalCount(condition);
pb.setTotalCount(totalCount);
//4.调用dao开始查询的List集合
//计算开始的记录索引
int start =(currentPage - 1) * rows;
List<User> list = dao.findByPage(start,rows,condition);
pb.setList(list);
//5.计算总页码数
int totalPage = (totalCount % rows) == 0 ? totalCount/rows : (totalCount/rows) + 1;
pb.setTotalPage(totalPage);
pb.setTotalCount(totalCount);
return pb;
}
}
dao代码
package cn.itcast.dao.Impl;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<User> findAll() {
//使用JDBC操作数据库
//1.定义sql语句
String sql = "select * from user";
List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
return users;
}
@Override
public User findUserByUsernameAndPassword(String username, String password) {
try {
String sql = "select * from user where username = ? and password = ?";
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username, password);
return user;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void add(User user) {
//写sql语句
String sql = "insert into user values(null,?,?,?,?,?,?,null,null)";
template.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
}
@Override
public void del(String id) {
//1.写sql语句
String sql = "delete from user where id=?";
template.update(sql,id);
}
@Override
public User findUser(int id) {
//1.定义sql语句
String sql = "select * from user where id =? ";
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);//queryForObject返回的是单个对象
//query返回的事结果集
return user;
}
@Override
public void update(User user) {
//1.写sql语句
String sql ="update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id=?";
template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());
}
@Override
public int findTotalCount(Map<String, String[]> condition) {
//1.定义sql模板
String sql = "select count(*) from user where 1 = 1 ";
StringBuffer sb = new StringBuffer(sql);
//2.遍历map集合
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;//跳出当前循环,下面不执行
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值
sb.append(" and " +key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
System.out.println(sb.toString());
System.out.println(params);
return template.queryForObject(sb.toString(),Integer.class,params.toArray());
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
StringBuffer sb = new StringBuffer(sql);
//2.遍历map集合
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;//跳出当前循环,下面不执行
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值
sb.append(" and " +key+" like ? ");
params.add("%"+value+"%");//?条件的值
}
}
//添加分页查询
sb.append(" limit ?,?");
//添加分页查询的参数值
params.add(start);
params.add(rows);
String s = sb.toString();
System.out.println(sql);
System.out.println(params);
List<User> query = template.query(s, new BeanPropertyRowMapper<User>(User.class),params.toArray() );
return query;
}
}
需要注意得是如果我们输入的参数空要做一下判断,把参数重新赋值,显示第一页。
还有动态sql语句编写,以及如何拼接
list集合取到的value值是一个数组,我们这个只有一个值取到的参数后面要加【0】,例如list.name【0】