JavaWeb 实现增改查删

资料来源黑马JAVA2019

登入和验证码板块,已经在上几篇文章中写到了,这里只需要按照三层架构模式,改写一些代码即可。开发文件结构如图所示:
在这里插入图片描述
按照DAO,SERVICE负责页面展示的Servlet等分门别类摆放。

主要看注释和图!
具体代码由于跳转和调用太多,要看整体代码https://github.com/miraclekowk/HeiMaJavaPractice_Day17

查询所有用户信息

代码逻辑:
在这里插入图片描述

DAO层–实现:

public class UserDaoImpl implements UserDao {
    
    
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

	//查询模块
    @Override
    public List<User> findAll() {
    
    
        //使用JDBC操作数据库   查询
        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;
        }
    }

UserService层实现:

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) {
    
    
        String userName = user.getUsername();
        String passWord = user.getPassword();

        System.out.println(userName + "   " + passWord);

        User userByUsernameAndPassword = dao.findUserByUsernameAndPassword(userName, passWord);

        return userByUsernameAndPassword;
    }
}

UserList层实现:

@WebServlet("/userListServlet")
public class UserListServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.调用UserService完成查询
        UserService service = new UserServiceImpl();
        List<User> users = service.findAll();

        System.out.println("现有的信息条数" + users.size());

        //2.将list放入域
        request.setAttribute("users",users);
        //转发到list.jsp
        request.getRequestDispatcher("/list.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

LoginServlet:

这里有两个做练习的过程中的错误点:
1.由于前端的list.jsp中的标签的name的规定,所以定义domin中User类的私有变量,必须和标签同名(大小写敏感)。不然咋找输入参数嘛?
2.如果发现登入问题,则优先去查看sql查询代码有没有写对,可以在sqlyog中手动输入来查询

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.设置编码
        request.setCharacterEncoding("utf-8");
        //2.获取验证码数据
        String verifycode = request.getParameter("verifycode");

        //3.验证码效验
        HttpSession session = request.getSession();
        String checkCode_server = (String) session.getAttribute("CHECKCODE_SERVER");

        //确保验证码的一次性
        session.removeAttribute("CHECKCODE_SERVER");

        if(!checkCode_server.equalsIgnoreCase(verifycode))
        {
    
    
            //验证码不正确  给提示信息跳转登入页面
            request.setAttribute("verify_fail","验证码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }


        Map<String, String[]> parameterMap = request.getParameterMap();
        //4.封装user对象
        User user = new User();
        try {
    
    
            //BeanUtils.populate( Object bean, Map properties )
            //这个方法会遍历map<key, value>中的key,如果bean中有这个属性,就把这个key对应的value值赋给bean的属性。
            //!!!注意这里面的username(jsp中的标签name)一定要和User类中的成员变量一样 大小写敏感
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        } catch (InvocationTargetException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("现在我在封装对象" + user.getUsername()+"   " + user.getPassword());


        //5.调用Service查询
        UserService Service = new UserServiceImpl();
        User loginUser = Service.login(user);
        //6.判断是否登入成功
        if(loginUser != null)
        {
    
    
            //登入成功  信息进入session域
            session.setAttribute("user",loginUser);
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }
        else
        {
    
    
            request.setAttribute("login_fail","用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

前端 index.jsp (主要用来跳转到 userListServlet处理再转发到list.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <title>首页</title>

  <!-- 1. 导入CSS的全局样式 -->
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  <script src="js/jquery-2.1.0.min.js"></script>
  <!-- 3. 导入bootstrap的js文件 -->
  <script src="js/bootstrap.min.js"></script>
  <script type="text/javascript">
  </script>
</head>
<body>
<div align="center">
  <a
          href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
  </a>
</div>
</body>
</html>

前端 list.jsp

注意这里的EL写法的迭代写法:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <c:forEach items="${users}" var="user" varStatus="s">
                <tr>
                    <td><input type="checkbox" name="uid" value="${user.id}"></td>
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.gender}</td>
                    <td>${user.age}</td>
                    <td>${user.address}</td>
                    <td>${user.qq}</td>
                    <td>${user.email}</td>
                    <td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a>&nbsp;
                        <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td>
                </tr>
            </c:forEach>

需要注意以下几点:
1、items相当于list,就是你要循环的那个容器。
2、var相当于list中装有的每个独立物体的临时变量。
3、varStatus是循环状态对象,常用s.index和s.count。
S.index:代表容器中元素的索引,从0开始。相当于for(int i = 0;i < n;i++)中的i
S.count:代表循环次数,从1开始。

这种写法等价于for(User user : list) 遍历容器写法。

此外还有完成重复操作写法,等价于for(int i = 0;i < n;i++)。foreach写法有以下属性:
begin:开始值
end:结束值
step:步长
var:临时变量

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

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

<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
     
     
            text-align: center;
        }
    </style>

    <script>
        function deleteUser(id){
     
     
            //用户安全提示
            if(confirm("您确定要删除吗?")){
     
     
                //访问路径
                location.href="${pageContext.request.contextPath}/delUserServlet?id="+id;
            }
        }

        window.onload = function(){
     
     
            //给删除选中按钮添加单击事件
            document.getElementById("delSelected").onclick = function(){
     
     
                if(confirm("您确定要删除选中条目吗?")){
     
     

                    var flag = false;
                    //判断是否有选中条目
                    var cbs = document.getElementsByName("uid");
                    for (var i = 0; i < cbs.length; i++) {
     
     
                        if(cbs[i].checked){
     
     
                            //有一个条目选中了
                            flag = true;
                            break;
                        }
                    }

                    if(flag){
     
     //有条目被选中
                        //表单提交
                        document.getElementById("form").submit();
                    }

                }

            }
            //1.获取第一个cb
            document.getElementById("firstCb").onclick = function(){
     
     
                //2.获取下边列表中所有的cb
                var cbs = document.getElementsByName("uid");
                //3.遍历
                for (var i = 0; i < cbs.length; i++) {
     
     
                    //4.设置这些cbs[i]的checked状态 = firstCb.checked
                    cbs[i].checked = this.checked;

                }

            }


        }


    </script>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>

    <div style="float: left;">

        <form class="form-inline" action="${pageContext.request.contextPath}/findUserByPageServlet" method="post">
            <div class="form-group">
                <label for="exampleInputName2">姓名</label>
                <input type="text" name="name" value="${condition.name[0]}" class="form-control" id="exampleInputName2" >
            </div>
            <div class="form-group">
                <label for="exampleInputName3">籍贯</label>
                <input type="text" name="address" value="${condition.address[0]}" class="form-control" id="exampleInputName3" >
            </div>

            <div class="form-group">
                <label for="exampleInputEmail2">邮箱</label>
                <input type="text" name="email" value="${condition.email[0]}" class="form-control" id="exampleInputEmail2"  >
            </div>
            <button type="submit" class="btn btn-default">查询</button>
        </form>

    </div>

    <div style="float: right;margin: 5px;">

        <a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a>
        <a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a>

    </div>
    <form id="form" action="${pageContext.request.contextPath}/delSelectedServlet" method="post">
        <table border="1" class="table table-bordered table-hover">
            <tr class="success">
                <th><input type="checkbox" id="firstCb"></th>
                <th>编号</th>
                <th>姓名</th>
                <th>性别</th>
                <th>年龄</th>
                <th>籍贯</th>
                <th>QQ</th>
                <th>邮箱</th>
                <th>操作</th>
            </tr>

            <c:forEach items="${users}" var="user" varStatus="s">
                <tr>
                    <td><input type="checkbox" name="uid" value="${user.id}"></td>
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.gender}</td>
                    <td>${user.age}</td>
                    <td>${user.address}</td>
                    <td>${user.qq}</td>
                    <td>${user.email}</td>
                    <td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a>&nbsp;
                        <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a></td>
                </tr>

            </c:forEach>


        </table>
    </form>
    <div>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <c:if test="${pb.currentPage == 1}">
                <li class="disabled">
                    </c:if>

                    <c:if test="${pb.currentPage != 1}">
                <li>
                    </c:if>


                    <a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage - 1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>


                <c:forEach begin="1" end="${pb.totalPage}" var="i" >


                    <c:if test="${pb.currentPage == i}">
                        <li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
                    </c:if>
                    <c:if test="${pb.currentPage != i}">
                        <li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
                    </c:if>

                </c:forEach>


                <li>
                    <a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage + 1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size: 25px;margin-left: 5px;">
                    共${pb.totalCount}条记录,共${pb.totalPage}页
                </span>

            </ul>
        </nav>

    </div>
</div>
</body>
</html>

分页查询用户信息


比较复杂,需要前端传过来两个参数,一是当前页面currentPage,二是一页展示多少行rows。
实现分页所需的参数:

实现分页所需的参数
分页查询具体逻辑:
在这里插入图片描述
Servlet层:

@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获取参数
        String currentPage = request.getParameter("currentPage"); //当前页码
        String rows = request.getParameter("rows"); //每页显示的条数

        //获取条件查询参数
        Map<String, String[]> condition = request.getParameterMap();


        //2.调用service查询   为了满足条件查询,需要把condition参数传进去
        UserServiceImpl service = new UserServiceImpl();
        PageBean<User> pb = service.findUserByPage(currentPage,rows,condition);

        //3.存储数据
        request.setAttribute("pb",pb);
        request.setAttribute("condition",condition);

        //4.转发
        request.getRequestDispatcher("/list.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

Service层方法:

@Override
    public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
    
    
        int currentPage = Integer.parseInt(_currentPage);
        int rows = Integer.parseInt(_rows);

        //防止用户一直点上一页点到负数
        if(currentPage <= 0)
            currentPage = 1;


        //1.创建空pagebean
        PageBean<User> pb = new PageBean<>();
        //2.设置参数
        pb.setCurrentPage(currentPage);
        pb.setRows(rows);

        //3.调用dao查询总记录数
        int totalCount = dao.findTotalCount(condition);
        pb.setTotalCount(totalCount);

        //4.调用dao查询List集合
        //计算开始的记录索引   封装查询结果(list)
        int start = (currentPage - 1) * rows;
        List<User> list = dao.findByPage(start,rows,condition);
        pb.setList(list);

        //5.计算总页码  比如63条记录,每页10行则一共有7页
        int totalPage = totalCount % rows == 0 ? totalCount/rows : totalCount/rows + 1;
        pb.setTotalPage(totalPage);

        return pb;
    }

DAO层方法:findTotalCount算出符合条件(为了配合条件查询)的有多少条数据,findByPage来找具体数据。

@Override
    public int findTotalCount(Map<String, String[]> condition) {
    
    
        //1.定义模板初始化sql
        String sql = "select count(*) from user where 1 = 1 ";
        StringBuilder sb = new StringBuilder(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 ";

        StringBuilder sb = new StringBuilder(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);
        sql = sb.toString();
        System.out.println(sql);
        System.out.println(params);

        return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
    }

此外,当然要有PageBean来封装分页数据:

package cn.domain;

import java.util.List;

//加泛型是为了通用性,现在用user,以后可以装别的比如manager
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层:
遇到Bug:存数据库这一下发生乱码问题 在这行之前(封装过程)打印出来都是ok的
解决:在druid里面加characterencoding参数 = utf-8

e.g.

url=jdbc:mysql:///day17?characterEncoding=utf-8
@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("utf-8");

        //获取参数
        Map<String, String[]> parameterMap = request.getParameterMap();

        //封装对象
        User user = new User();
        try {
    
    
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        } catch (InvocationTargetException e) {
    
    
            e.printStackTrace();
        }

        //System.out.println(user.getName()+"   "+user.getAddress());

        //调用Service保存
        //!!! 存进去这一下发生乱码问题 在这行之前(封装过程)打印出来都是ok的 解决:在druid里面加characterencoding参数 = utf-8
        UserServiceImpl Service = new UserServiceImpl();
        Service.addUser(user);

        //跳转到userListServlet  (因为加入完后还要查询一次)
        response.sendRedirect(request.getContextPath() + "/userListServlet");


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

Service层:

@Override
    public void addUser(User user) {
    
    
        dao.add(user);
    }

Dao层:

@Override
    public void add(User user) {
    
    
        //1.定义sql
        String sql = "insert into user values(null,?,?,?,?,?,?,null,null)";
        //2.执行sql
        template.update(sql,user.getName(),user.getGender(),user.getAge(),
                user.getAddress(),user.getQq(),user.getEmail());

        System.out.println(user.getName());
    }

改:修改按钮-》1.回显信息在页面上 2.再次提交


逻辑:
1.选中某条信息打钩,需要传到后端某个唯一标识:“id”
2.回显这条的相关信息在一个修改.jsp中。
3.用户改动后,再次提交,并调转到查询所有用户上。

在这里插入图片描述

找到用户在修改哪条信息并返回User供前端回显

//用来修改的用户信息的,先找到,再修改
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获取查找所需的id参数
        String id = request.getParameter("id");

        //2.调用service查询
        UserServiceImpl Service = new UserServiceImpl();
        User user = Service.findUserById(id);

        //3.把user转发
        request.setAttribute("user",user);
        request.getRequestDispatcher("/update.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

找到用户修改哪条的Service层:

public User findUserById(String id) {
    
    
        return dao.findById(Integer.parseInt(id));
    }

DAO层:

@Override
    public User findById(int id) {
    
    
        String sql = "select * from user where id = ?";
        return template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),id);
    }

更新数据库:
Servlet层:

@WebServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.设置编码
        request.setCharacterEncoding("utf-8");
        //2.获取map   这里面id被偷偷传进来了,用户是看不见的,id在隐藏框中
        Map<String, String[]> parameterMap = request.getParameterMap();
        //3.封装对象
        User user = new User();

        try {
    
    
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        } catch (InvocationTargetException e) {
    
    
            e.printStackTrace();
        }

        //4.调用Service修改
        UserServiceImpl Service = new UserServiceImpl();
        Service.updateUser(user);

        //5.转发 重新查询整个列表 没有传参可以用重定向完成
        response.sendRedirect(request.getContextPath() + "/userListServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

Service层:

@Override
    public void updateUser(User user) {
    
    
        dao.update(user);
    }

DAO层:

@Override
    public void update(User user) {
    
    
        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());
    }

删:删除选中条目


1.同样利用唯一标识符Id来选中用户要删除的条目,在前端中组成数组传入后端
2.dao层直接调用删除即可,用户确认删除的逻辑在前端JSP中已经实现了。
3.同样的,删除完要跳转回查询页面。

基础逻辑:单次删除
在这里插入图片描述
进阶逻辑,选中删除:

在这里插入图片描述

Servlet层:

@WebServlet("/delSelectedServlet")
public class DelSelectedServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获取所有的id
        String[] ids = request.getParameterValues("uid");
        //2.调用service删除
        UserServiceImpl service = new UserServiceImpl();
        service.delSelectedUser(ids);

        //3.跳转查询所有的service
        response.sendRedirect(request.getContextPath()+"/userListServlet");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

Service层:

public void delSelectedUser(String[] ids) {
    
    
        //1.遍历数组
        for (String id : ids) {
    
    
            //调用dao删除
            dao.delet(Integer.parseInt(id));
        }
    }

DAO层:

@Override
    public void delet(int id) {
    
    
        //1.定义sql
        String sql = "delete from user where id = ?";
        //执行sql
        template.update(sql,id);
    }

猜你喜欢

转载自blog.csdn.net/abyss_miracle/article/details/113811756