Web小案例_用户信息展示

案例:用户信息列表展示

  1. 需求:用户信息的增删改查操作

  2. 设计:

    1. 技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat

    2. 数据库设计:

       create database day17; -- 创建数据库
       use day17; 			   -- 使用数据库
       create table user(   -- 创建表
       	id int primary key auto_increment,
       	name varchar(20) not null,
       	gender varchar(5),
       	age int,
       	address varchar(32),
       	qq	varchar(20),
       	email varchar(50)
       );
      
  3. 开发:

    1. 环境搭建

      1. 创建数据库环境
      2. 创建项目,导入需要的jar包
    2. 编码

  4. 测试

  5. 部署运维
    在这里插入图片描述


1 登录

在这里插入图片描述
首先校验验证码,验证码正确再获取user对象,其中包括用户名和密码,到数据库进行校验,有数据会返回完整的user信息,跳转到用户列表显示。
如果其中一项不符合都会回到登录界面,并且request转发到 jsp 会携带提示信息log_mas。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1 设置编码
        request.setCharacterEncoding("utf-8");
        //2 获取数据
        //2.1 获取验证码
        String verifycode = request.getParameter("verifycode");
        //3 验证码校验
        HttpSession session = request.getSession();
        String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//获取session中保存的验证码
        session.removeAttribute("CHECKCODE_SERVER");  //确保验证码一次性
        if(!checkcode_server.equalsIgnoreCase(verifycode)){
            //将验证码与用户输入比较
            //错误 --- 提示信息 -- 跳转登录页面
            request.setAttribute("login_msg","验证码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }

        //4 封装user对象
        Map<String, String[]> map = request.getParameterMap();  //获取所有数据
        User user = new User();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        //5 调用service查询  -- 验证码正确的情况
        UserService service = new UserServiceImpl();
        User loginUser = service.login(user);

        //6 判断是否登录成功
        if(loginUser != null){
            //查询到数据,登录成功 -- 跳转index.jsp
            //将用户存入session
            session.setAttribute("user",loginUser);
            //跳转页面
            response.sendRedirect(request.getContextPath()+"/index.jsp");  //没有共享数据,使用重定向
        }else {
            request.setAttribute("login_msg","登录失败!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }
    }

1 显示用户数据

不需要参数,到数据库中查询所有用户信息,回到jsp页面展示,在jsp中使用foreach遍历了返回的list集合,在table中显示信息。
到后面这个显示所有数据的Servlet会弃用,改成分页查询的servlet

@WebServlet("/userListServlet")
public class userListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //1 调用UserService完成查询
        UserService service = new UserServiceImpl();
        List<User> users = service.findAll();  //查询所有用户
        //2 将list存入request域
        request.setAttribute("users",users);//存储查询到的数据
        //3 转发到页面
        request.getRequestDispatcher("/list.jsp").forward(request,response);  //转发不需要虚拟目录
    }

2 添加用户数据

从显示数据的jsp跳转到添加数据的jsp,将获得的数据发给addUserServlet处理,需要注意的是input的name要和数据库的字段对应,添加完数据之后会重新查询所有数据返回显示。
在这里插入图片描述

3 删除用户数据

删除单个用户:
点击删除去到delUserServlet,并且携带要删除用户的user.id,数据库根据id删除用户。
在这里插入图片描述
删除多个用户(删除选中):
使用表单提交uid携带要删除数据的user.id,只有checked选中的会被提交,数据提交到delSelectedServlet获取所有要删除数据的id,调用service遍历ids数组进行删除。
在这里插入图片描述

4 修改用户数据

在页面中选择修改,则这条user数据会携带user.id传到findUserServlet,根据id查询出user,并将完整的user数据返回,跳转到update页面,使用request域里的user将所有user数据回显到修改表单中,因为需要使用id到数据库中查询,所以id也需要提交,使用隐藏域。
修改完毕提交到updateUserServlet,调用service修改后返回数据显示页面。
在这里插入图片描述

5 分页查询功能

使用bootstrap中的分页组件,需要写一个分页对象,来存储分页所需要的数据和分页查询的user信息。
重新写一个查询数据的Servlet,需要传入参数即当前页码和每页显示条数
在这里插入图片描述

/**
 * 分页对象
 */
public class PageBean<T> {
    private int totalCount;     //总记录数
    private int totalPage;      //总页码
    private List<T> list;       //存储数据的集合
    private int currentPage;    //当前页码
    private int rows;           //每页显示的记录数

    @Override
    public String toString() {
        return "PageBean{" +
                "totalCount=" + totalCount +
                ", totalPage=" + totalPage +
                ", list=" + list +
                ", currentPage=" + currentPage +
                ", rows=" + rows +
                '}';
    }

查询数据库中的总条目数totalCount,再根据传递过来的参数计算总页数PageCount,使用sql语句中的limit start,rows,就可以实现每次只查询固定条数而不是查询所有数据,将数据存入PageBean的list集合中,转发到list.jsp显示。
在这里插入图片描述

5 条件查询功能

将表格上方的查询使用from表单包裹,数据提交到分页查询的servlet,只是在原有的查询基础上增加条件。
需要注意的数据库sql的编写,因为传递过来的数据可能是空条件,所以需要判断input是否有内容,动态拼接sql查询。
在这里插入图片描述

 //查询总记录数
    @Override
    public int findTotalCount(Map<String, String[]> condition) {
        //1 定义模板sql
        String sql = "select count(*) from user where 1 = 1 ";
        //2 遍历map,根据map是否有值,拼接对应的sql
        StringBuilder sb = new StringBuilder(sql);
        Set<String> keySet = condition.keySet();
        //定义参数的集合
        List<Object> params = new ArrayList<Object>();
        for (String key : keySet) {
            //排除分页条件的参数
            if("currentPage".equals(key) || "rows".equals(key)){
                continue;  //结束当前循环,继续下一次循环----寻找其他的key
            }
            //获取value
            String value = condition.get(key)[0];
            //判断value是否有值
            if(value != null && !"".equals(value)){
                //有值 -- 拼接sql
                sb.append(" and "+key+" like ? ");
                params.add("%"+value+"%");  //?条件的值
            }
        }
        System.out.println(sb.toString());
        System.out.println(params);
        int count = template.queryForObject(sb.toString(),Integer.class,params.toArray());//返回Integer类型的值,自动拆箱
        return count;
    }

    //分页查询的数据
    @Override
    public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
        String sql = "select * from user where 1 = 1 ";
        //2 遍历map,根据map是否有值,拼接对应的sql
        StringBuilder sb = new StringBuilder(sql);
        Set<String> keySet = condition.keySet();
        //定义参数的集合
        List<Object> params = new ArrayList<Object>();
        for (String key : keySet) {
            //排除分页条件的参数
            if("currentPage".equals(key) || "rows".equals(key)){
                continue;  //结束当前循环,继续下一次循环----寻找其他的key
            }
            //获取value
            String value = condition.get(key)[0];
            //判断value是否有值
            if(value != null && !"".equals(value)){
                //有值 -- 拼接sql
                sb.append(" and "+key+" like ? ");
                params.add("%"+value+"%");  //?条件的值
            }
        }
        //添加分页查询
        sb.append(" limit ?,? ");
        //添加查询的参数
        params.add(start);
        params.add(rows);

        sql = sb.toString();
        System.out.println(sql);
        System.out.println(params);
        return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值