• 用户信息列表实现增删改查案例的实现【问题及解决过程记录】&【综合案例】


    目录

    用户信息列表展示案例

    1. 需求:

     1. 简单功能

            1. 列表查询        2. 登录        3. 添加        4. 删除        5. 修改

      2. 复杂功能

            1. 删除选中        2. 分页查询            * 好处:                1. 减轻服务器内存的开销                2. 提升用户体验        3. 复杂条件查询

    2. 设计:

     1. 技术选型:

    3. 开发:

            1. 环境搭建

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

     细节:

                    1.添加jar包要注意版本是否适配

                     2.配置文件要根据实际情况进行修改​编辑

             3.注意查询语句是否正确

           4、据要写在forEach内​编辑

           2. 编码

    4. 测试

     进阶:

    关于登录界面login.jsp

     添加联系人功能

     删除功能

     修改功能

    复杂功能

    删除选中

     分页查询

    ​编辑

    复杂功能

    复杂条件查询功能

      动态查询小技巧:


    用户信息列表展示案例

    1. 需求:

     1. 简单功能

            1. 列表查询
            2. 登录
            3. 添加
            4. 删除
            5. 修改


      2. 复杂功能

            1. 删除选中
            2. 分页查询
                * 好处:
                    1. 减轻服务器内存的开销
                    2. 提升用户体验
            3. 复杂条件查询


    2. 设计:

     1. 技术选型:

    Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtils+tomcat

    控制器 + 页面展示+ 操作数据库+ 自动封装 + 连接池提高连接效率+ 封装数据 + 部署到服务器上

      

        2. 数据库设计:
            create database test01; -- 创建数据库
            use test01;                -- 使用数据库
     CREATE TABLE user2(  -- 创建表
        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包

     细节:

                    1.添加jar包要注意版本是否适配

     

                     2.配置文件要根据实际情况进行修改

             3.注意查询语句是否正确

           4、据要写在forEach内

           2. 编码

    4. 测试

      在/test02/userListServlet下可以输出,但是list.jsp下没有打印出来

     

     试着打印UserListServlet,
    response.getWriter();

    输出无法识别中文,句首加入

    //简单的形式,设置编码,是在获取流之前设置
            response.setContentType("text/html;charset=utf-8");
    即可。

     最后终于得出错误原因,不是代码错误也不是配置错愕,是进入的网址错误,得从index.jsp进入首页

     成了!

    接着添加增删改操作

    先在UserService接口添加对应接口

    添加数据,报错

    org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [insert into user2 set name=?,gender=?,age=?,adress=?,qq=?,email=?]; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'adress' in 'field list'

     查了半天是拼写错误

    一个好消息,一个坏消息

    好消息:写进去了

    坏消息:但没完全写进去

    出现中文乱码且丢失

    //设置request编码
    request.setCharacterEncoding("utf-8");
    

    会发现性别和籍贯因为是有默认选择的复选框,不是手动输入的数据,所以未被存储进去,需要在UserAddServlet里添加存储进去,这样选择框里的对象也能获取到

    UserAddServlet代码:
    1. package cn.web.servlet;
    2. import cn.domain.User;
    3. import cn.service.UserService;
    4. import cn.service.impl.UserServiceImpl;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.annotation.WebServlet;
    7. import javax.servlet.http.HttpServlet;
    8. import javax.servlet.http.HttpServletRequest;
    9. import javax.servlet.http.HttpServletResponse;
    10. import java.io.IOException;
    11. /**
    12. * @author 乱码酱
    13. * @date :2022-11-29 15:44
    14. * @program: HTMLStudy
    15. * @create:
    16. */
    17. @WebServlet("/userAddServlet")
    18. public class UserAddServlet extends HttpServlet {
    19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    20. //设置request编码
    21. request.setCharacterEncoding("utf-8");
    22. //调用UserService完成添加
    23. UserService service = new UserServiceImpl();
    24. //获取参数
    25. String name = request.getParameter("name");
    26. String gender = request.getParameter("gender");
    27. int age = Integer.parseInt(request.getParameter("age"));
    28. String adress = request.getParameter("address");
    29. String qq = request.getParameter("qq");
    30. String email = request.getParameter("email");
    31. //添加到User里
    32. User user = new User();
    33. user.setName(name);
    34. user.setGender(gender);
    35. user.setAge(age);
    36. user.setAddress(adress);
    37. user.setQq(qq);
    38. user.setEmail(email);
    39. // 调用UserService层
    40. User user1 = service.addUser(user);
    41. // 将list存入request域
    42. request.setAttribute("user1",user);
    43. //转发到
    44. request.getRequestDispatcher("/index.jsp").forward(request,response);
    45. 3.调转到重新查询的servlet
    46. // response.sendRedirect(request.getContextPath()+"/userListServlet");
    47. }
    48. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    49. this.doPost(request, response);
    50. }
    51. }

     进阶:

    将已有用户信息列表改进为后面一种格式

     使用Bootstrap上的内联表单样式,但是出现了分层

     解决方法:在div标签的style样式加一个float浮动即可

     至于分页,在Bootstrap的中文档首页“组件”复制分页即可。

    关于登录界面login.jsp

    验证码执行一个refreshCode();方法

     添加登录所需字段username和password

     可以在数据库查询是否添加成功

    SELECT * FROM user2;

     添加好内容

     数据库添加字段,对应实体类User也要跟着修改

     先进入登录界面login.jsp,登录成功会提示

     

     添加联系人功能

      在list.jsp中添加联系人按钮路径跳转到add.jsp

     add.jsp也要连接指定servlet

     之前的addservlet没用util工具类,需要一个一个添加,

    1. @WebServlet("/addUserServlet")
    2. public class AddUserServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. //设置request编码
    5. request.setCharacterEncoding("utf-8");
    6. //调用UserService完成添加
    7. UserService service = new UserServiceImpl();
    8. //获取参数
    9. String name = request.getParameter("name");
    10. String gender = request.getParameter("gender");
    11. int age = Integer.parseInt(request.getParameter("age"));
    12. String adress = request.getParameter("address");
    13. String qq = request.getParameter("qq");
    14. String email = request.getParameter("email");
    15. //添加到User里
    16. User user = new User();
    17. user.setName(name);
    18. user.setGender(gender);
    19. user.setAge(age);
    20. user.setAddress(adress);
    21. user.setQq(qq);
    22. user.setEmail(email);
    23. // 调用UserService层
    24. User user1 = service.addUser(user);
    25. // 将list存入request域
    26. request.setAttribute("user1",user);
    27. //转发到
    28. request.getRequestDispatcher("/index.jsp").forward(request,response);
    29. 3.调转到重新查询的servlet
    30. // response.sendRedirect(request.getContextPath()+"/userListServlet");
    31. }
    32. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    33. this.doPost(request, response);
    34. }
    35. }

    后来加入了工具类,效率提高

    1. //1.设置编码
    2. request.setCharacterEncoding("utf-8");
    3. //2.获取参数
    4. Map map = request.getParameterMap();
    5. //3.封装对象
    6. User user = new User();
    7. try {
    8. BeanUtils.populate(user,map);
    9. } catch (IllegalAccessException e) {
    10. e.printStackTrace();
    11. } catch (InvocationTargetException e) {
    12. e.printStackTrace();
    13. }
    14. //4.调用service方法报错
    15. UserService service = new UserServiceImpl();
    16. service.addUser(user);
    17. //5.跳转到/userListServlet
    18. // 没有共享数据使用重定向 加上虚拟路径request.getContextPath()
    19. response.sendRedirect(request.getContextPath()+"/userListServlet");
    UserDaoImpl中的addUser方法也优化了
    
    1. @Override
    2. public User addUser(User user) {
    3. try {
    4. //第一版
    5. //String sql = "insert into user2 set name = ?, gender = ?, age = ?, address = ?, qq= ?, email = ?";
    6. //第二版
    7. String sql ="insert into user2 values(null, ?, ?, ?, ?, ?, ?,null, null )";
    8. template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail());
    9. } catch (DataAccessException e) {
    10. e.printStackTrace();
    11. }
    12. return user;
    13. }

    添加用户成功!

     删除功能

     在list.jsp删除按钮添加路径

     编辑DelUserService

    原版本:

    //1.设置request编码
            request.setCharacterEncoding("utf-8");
            int id = Integer.parseInt(request.getParameter("id"));
            //2.调用service
            UserService service = new UserServiceImpl();
            service.deleteUser(id);
            //3.调转到重新查询的servlet
            response.sendRedirect(request.getContextPath()+"/userListServlet");
            3.转发到
            //        request.getRequestDispatcher("/index.jsp").forward(request,response);

    现版本:

    //        因为是根据id删除,不涉及汉字,可以不用设置编码
        // 1.获取id对象
            String id = request.getParameter("id");
    // 2.调用service删除
            UserService service = new UserServiceImpl();
            service.deleteUser(id);
    //3.跳转查询所有servle
            response.sendRedirect(request.getContextPath()+"/userListServlet");

    测试:

     轻易就删除了记录,但是不排除误删的可能性,想加入一个确认删除的提示框

    在list.jsp删除按钮添加一个方法,点击会有确认框

    放到上面去获取不到id,于是传参

     测试一下:

     修改功能

     

     修改update.jsp指向路径并在标签添加value,编写对应service、dao层接口和实现类方法

     测试时出现404错误

     原因是重新建了一个findUserServlet,需要重新启动服务器,启动即可成功访问

    之前的修改性别和地址不知道默认值,所以要判断选择框里的性别和籍贯,需要在update.jsp开头加上标签引入

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    加入判断:

     在

    代码编写好 测试一下

     报了一个500的错

     原来是没重启的锅,重启后恢复正常

    但是新的问题出现了,无法修改内容,除去一部分原因是我在数据库写入数据,里面的地址不在