第一天总结 之 用户管理界面的实现 之 模糊查询和分页操作
1、明确页面的跳转
当登录操作执行时
如果正确 跳转到 UserFuzzySelectServlet 即用户模糊查询的select
注:因为第一次写项目 对于很多操作都不熟悉 很多前期操作没 有 按着 见名之意 的方式命名 如:用户模糊查询的select 正常书写应该为 UserFuzzySelectServlet 而我第一天书写时 写的为 UserFuzzyServlet 对于后续操作 需周知
如果错误 跳转到 登录界面
2、用户管理前端页面的展示
这是通过直接打开jsp页面获取的界面展示
很明显看出 模糊查询是通过姓名 或 性别 如果两个都不选为查询所有的数据
3、UserFuzzySelectServlet的书写
因为是select 在MVC框架中 应放在controller层下
即:第一步 在controller下 创建 UserFuzzySelectServlet
如果未找到servlet 可按下图操作
创建 UserFuzzySelectServlet
在dopost()下调用doset();
在doget()方法下 进行下列操作
1、设置请求和响应的字符集 防止中文乱码
2、获取当前的页码 如果为null 设置为1
3、设置每页显示的数据个数
4、获取前端 模糊查询 时的 依据 如 姓名 性别
5、通过 姓名 性别 当前页码 每页数据 进行查询
姓名 对应sql语句中 模糊查询的 username like "模糊查询传的值"
性别 对应sql中 sex = "前端传过来的性别数据"
当前页码 和 每页的数据 对应sql语句中 的 limit 当前页码*每页数据 , 每页数据
limit 0,5 代表 从第0条数据开始 选择前5条数据
6、将查询出来的数据 以list集合的形式存放到 request 域中
从而使得 前端页面能够获取到 并且从中获取数据 展示在页面上
7、转发数据到 前端页面
其中 UserFuzzySelectServlet代码如下:
package com.qfedu.controller;
import com.qfedu.entity.User;
import com.qfedu.service.UserService;
import com.qfedu.service.impl.UserServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
//注解的方式 设置路径
@WebServlet(name = "UserFuzzyServlet", value = "/UserFuzzyServlet")
public class UserFuzzyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求字符集 防止中文乱码
request.setCharacterEncoding("utf-8");
String pageNo = request.getParameter("pageNo");
if(pageNo==null){
pageNo="1";
}
Integer pNo=Integer.valueOf(pageNo);
int pageSize=4;
//获取前端 模糊查询 的username和sex
String username = request.getParameter("username");
String sex = request.getParameter("sex");
UserService userService =new UserServiceImpl();
//调用service 获取一页的所有数据
List<User> users = userService.getOnePageUsers(username,sex,pNo,pageSize);
//将users集合存到 request域中
request.setAttribute("users",users);
//获取总的页数
int pageCount=0;
pageCount = userService.getpageCount(pageSize);
request.setAttribute("pageNo",pNo);
request.setAttribute("pageCount",pageCount);
//转发到前端页面
request.getRequestDispatcher("/after/user.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
UserServiceImpl 中 getOnePageUsers代码如下
@Override
public List<User> getOnePageUsers(String username,String sex,int pNo,int pageSize) {
Object[] objs={(pNo-1)*pageSize,pageSize};
String condition=null;
if(username !=null&&!"".equals(username)&&sex!=null&&!"".equals(sex)){
//SELECT * FROM t_user WHERE 1=1 AND sex = "男" AND username LIKE "%a%" LIMIT 0,3
condition=" and sex = \""+sex+"\" and username like \"%"+username+"%\" ";
}else if (username != null && !"".equals(username)) {
condition = " AND username LIKE \"%"+ username+"%\"";
}else if( sex != null && !"".equals(sex)){
condition = " AND sex=\""+sex+"\"";
} else {
condition = "";
}
return userDao.getOnePageUsers(condition,objs);
}
UserDaoImpl 中的 getOnePageUsers代码如下
@Override
public List<User> getOnePageUsers(String condition,Object[] objs) {
String sql="select * from t_user where 1=1 "+condition+" limit ?,? ";
return super.query(sql,objs,User.class);
}
在前端代码中 展示数据 其中的部分代码截图如下
从而实现数据在前端页面的展示
效果图如下
4、遇到的问题与解决方法
测试上下页和 模糊查询 发现存在一处bug
当我 通过 模糊查询 查询数据时 即 我 查询带a的名字的数据 然后发现 查询的没有问题 但当我 点击下一页 之后 发现 我第二页的数据为 全部数据的第二页
解决方法:
在request 域中 设置两个 标识 ua ub 代表模糊查询的 username 和 sex 在servlet中 添加判断操作 如果当前的 页面传过来的 username和sex 都为null 则获取ua和ub 将username 和 sex的设置为ua ub对应的值
然后进行查询操作 最后再 重新设置一下ua ub
修改后UserFuzzySelectServlet 的代码如下
package com.qfedu.controller;
import com.qfedu.entity.User;
import com.qfedu.service.UserService;
import com.qfedu.service.impl.UserServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
@WebServlet(name = "UserFuzzySelectServlet", value = "/UserFuzzySelectServlet")
public class UserFuzzySelectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求字符集 防止中文乱码
request.setCharacterEncoding("utf-8");
String pageNo = request.getParameter("pageNo");
if(pageNo==null){
pageNo="1";
}
Integer pNo=Integer.valueOf(pageNo);
int pageSize=4;
//获取前端 模糊查询 的username和sex
String username = request.getParameter("username");
String sex = request.getParameter("sex");
// System.out.println("username="+username);
// System.out.println("sex="+sex);
// System.out.println("///");
if( (username ==null||"".equals(username))&& (sex==null||"".equals(sex)) ){
username=request.getParameter("ua");
sex=request.getParameter("ub");
// System.out.println("username="+username);
// System.out.println("sex="+sex);
// System.out.println("!!!!");
}
UserService userService =new UserServiceImpl();
//调用service 获取一页的所有数据
List<User> users = userService.getOnePageUsers(username,sex,pNo,pageSize);
//将users集合存到 request域中
request.setAttribute("users",users);
// System.out.println(users);
//获取总的页数
int pageCount=0;
pageCount = userService.getpageCount(username,sex,pageSize);
request.setAttribute("pageNo",pNo);
request.setAttribute("pageCount",pageCount);
// System.out.println("pNo="+pNo);
// System.out.println("pageCount="+pageCount);
request.setAttribute("ua",username);
request.setAttribute("ub",sex);
//转发到前端页面
request.getRequestDispatcher("/after/user.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
前端页面的 跳转部分 进行略微修改 原因:request域中的属性 仅只支持一次请求 之后销毁 所以我通过 跳转的url 携带上 ua和ub 从而实现 点击下一页或上一页 ua ub 依然存在