欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[MVC] 综合案例:用户管理系统

程序员文章站 2024-03-21 17:07:22
...


综合案例

1. 环境搭建

  • 要求根据三层架构,搭建 Web 项目。步骤如下:
    • 创建 Web 项目;
    • 导入第三方 Jar 包;
    • 导入页面资源;
    • 搭建三层包目录结构;
    • 导入 User 实体类;
    • 导入 DataUtils 工具类;
    • 把模拟数据库 userdata.txt 放到桌面,并修改 DataUtils 中的地址值;
    • 启动测试。
  • 项目结构如下:
    [MVC] 综合案例:用户管理系统
  • 访问 http://localhost:8080/webappPractice2/list.jsp,测试效果:
    [MVC] 综合案例:用户管理系统

2. 用户查询功能

a. 功能介绍

  • 使用三层架构和 MVC 模式开发代码,实现用户显示列表功能。

b. 需求分析

[MVC] 综合案例:用户管理系统

  • Web 层:EncodeFilter(中文编码)、FindAllServlet(调用 Service 查询,并将 List 存到 Request 域中,转发到 list.jsp)、list.jsp(EL + JSTL)、index.jsp(首页显示);
  • Service 层:UserService(调用 DAO 查询);
  • DAO 层:UserDao(调用 DataUtils 工具类查询数据库)。

c. 代码实现

i. EncodeFilter

package com.company.web;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class EncodeFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
        // 向下转型
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 如果是post请求,解决中文乱码
        if (request.getMethod().equalsIgnoreCase("post")) {
            request.setCharacterEncoding("utf-8");
        }
        // 放行
        chain.doFilter(request, response);
    }

    public void destroy() {

    }
}

ii. FindAllServlet

package com.company.web;

import com.company.domain.User;
import com.company.service.UserService;

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.List;

@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.调用service查询
        UserService userService = new UserService();
        List<User> list = userService.findAll();
        // 2.将list存储到Request域
        request.setAttribute("list", list);
        // 3.转发到list.jsp
        request.getRequestDispatcher("/list.jsp").forward(request, response);
    }
}

iii. UserService

[MVC] 综合案例:用户管理系统

package com.company.service;

import com.company.dao.UserDao;
import com.company.domain.User;

import java.util.List;

public class UserService {

    public List<User> findAll() {
        // 调用dao查询
        UserDao userDao = new UserDao();
        //  List<User> list = userDao.findAll();
        return userDao.findAll();
    }
}

iv. UserDao

[MVC] 综合案例:用户管理系统

package com.company.dao;

import com.company.domain.User;
import com.company.util.DataUtils;

import java.util.List;

public class UserDao {

    public List<User> findAll() {
        // 调用数据库查询
        List<User> list = DataUtils.readAll();
        return list;
    }
}

v. User

package com.company.domain;

public class User {

    private String id;
    private String name;
    private String sex;
    private Integer age;
    private String address;
    private String qq;
    private String email;

    public User() {
    }

    public User(String id, String name, String sex, Integer age, String address, String qq, String email) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
        this.qq = qq;
        this.email = email;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getQq() {
        return qq;
    }

    public void setQq(String qq) {
        this.qq = qq;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", qq='" + qq + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

vi. DataUtils

package com.company.util;

import com.company.domain.User;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class DataUtils {

    private static String realpath = "C:\\Users\\80626\\Desktop\\userdata.txt";

    //从文件中读取所有学员信息
    public static List<User> readAll() {
        //保存所有学生对象信息
       List<User> list = new ArrayList<>();
        try {
            //得到文件真实路径
            //创建字符输入流
            Reader isr = new InputStreamReader(new FileInputStream(realpath), "UTF-8");
            //创建字符缓冲流
            BufferedReader br = new BufferedReader(isr); //装饰模式

            //一次读一行
            String row = null;
            while ((row = br.readLine()) != null) {//row = "1,张三,男,20"
                String[] arr = row.split(",");
                User user = new User();
                user.setId(arr[0]);
                user.setName(arr[1]);
                user.setSex(arr[2]);
                user.setAge(Integer.parseInt(arr[3]));
                user.setAddress(arr[4]);
                user.setQq(arr[5]);
                user.setEmail(arr[6]);
                //将User对象添加到集合
                list.add(user);
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }

    //向文件中写入所有用户信息--覆盖写
    public static void writeAll(List<User> list) {
        try {
            //创建字符输出流
            Writer osw = new OutputStreamWriter(new FileOutputStream(realpath), "UTF-8");
            //创建字符缓冲流
            BufferedWriter out = new BufferedWriter(osw);
            //循环向文件中写入文本
            for (User user : list) {
                out.write(user.getId() + "," + user.getName() + "," + user.getSex() + "," + user.getAge() + "," + user.getAddress() + "," + user.getQq() + "," + user.getEmail());
                out.newLine();//创建新的一行
            }
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        List<User> list = readAll();

    }
}

vii. index.jsp

[MVC] 综合案例:用户管理系统

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<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}/FindAllServlet" class="btn btn-primary">查询用户信息列表
	</a>
  </div>
  </body>
</html>

viii. list.jsp

[MVC] 综合案例:用户管理系统

<%@ 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>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.sex}</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="update.jsp">修改</a>
                    &nbsp;<a class="btn btn-default btn-sm" href="">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>

d. 测试

3. 添加用户功能

a. 功能介绍

  • 点击添加用户跳转添加用户页面,在添加用户页面,添加新的用户。

b. 需求分析

[MVC] 综合案例:用户管理系统

  • Web 层:AddServlet(接收请求参数 map,封装到 user 实体,调用 service 添加,重定向到 FindAllServlet);
  • Service 层:UserService(调用 dao 添加);
  • Dao 层:UserDao(通过 DataUtils 查询 List,向 List 中添加 User 对象,将 List 写入到数据库)。

c. 代码实现

i. add.jsp

[MVC] 综合案例:用户管理系统

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 网页使用的语言 -->
<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>
</head>
<body>
<div class="container">
    <center><h3>添加联系人页面</h3></center>
    <form action="${pageContext.request.contextPath}/AddServlet" method="post">
        <div class="form-group">
            <label for="name">编号:</label>
            <input type="text" class="form-control" id="id" name="id" placeholder="请输入编号">
        </div>

        <div class="form-group">
            <label for="name">姓名:</label>
            <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
        </div>

        <div class="form-group">
            <label>性别:</label>
            <input type="radio" name="sex" value="" checked="checked"/><input type="radio" name="sex" value=""/></div>

        <div class="form-group">
            <label for="age">年龄:</label>
            <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
        </div>

        <div class="form-group">
            <label for="address">籍贯:</label>
            <input type="text" class="form-control" id="address" name="address" placeholder="请输入籍贯">
        </div>

        <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
        </div>

        <div class="form-group">
            <label for="email">Email:</label>
            <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/
        </div>

        <div class="form-group" style="text-align: center">
            <input class="btn btn-primary" type="submit" value="提交" />
            <input class="btn btn-default" type="reset" value="重置" />
            <input class="btn btn-default" type="button" value="返回" />
        </div>
    </form>
</div>
</body>
</html>

ii. AddServlet

package com.company.web;

import com.company.domain.User;
import com.company.service.UserService;
import org.apache.commons.beanutils.BeanUtils;

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.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/AddServlet")
public class AddServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            // 1.接收请求参数map
            Map<String, String[]> parameterMap = request.getParameterMap();
            // 2.快速封装User实体
            User user = new User();
            BeanUtils.populate(user, parameterMap);
            // 3.调用service,添加User
            UserService userService = new UserService();
            userService.add(user);
            // 4.重定向FindAllServlet
            response.sendRedirect(request.getContextPath() + "/FindAllServlet");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

iii. UserService

[MVC] 综合案例:用户管理系统

package com.company.service;

import com.company.dao.UserDao;
import com.company.domain.User;

import java.util.List;

public class UserService {

    UserDao userDao = new UserDao();
    
    public List<User> findAll() {
        // 调用dao查询
        //  List<User> list = userDao.findAll();
        return userDao.findAll();
    }
    
    public void add(User user){
        // 调用dao添加
        userDao.add(user);
    }
}

iv. UserDao

[MVC] 综合案例:用户管理系统

package com.company.dao;

import com.company.domain.User;
import com.company.util.DataUtils;

import java.util.List;

public class UserDao {

    public List<User> findAll() {
        // 调用数据库查询
        List<User> list = DataUtils.readAll();
        return list;
    }
    
    public void add(User user){
        // 1.调用数据库查询
        List<User> list=DataUtils.readAll();
        // 2. List添加User
        list.add(user);
        // 3. 新的List集合覆盖数据库
        DataUtils.writeAll(list);
    }
}

d. 测试

4. 删除用户功能

a. 主要需求

  • 点击删除按钮删除当前一整行数据,删除之后重新查询全部展示删除效果。

b. 需求分析

[MVC] 综合案例:用户管理系统

  • Web 层:DeleteServlet(接收请求参数 ID,调用 service 删除,重定向到 FindAllServlet);
  • Service 层:UserService(调用 dao 删除);
  • Dao 层:UserDao(先查询所有,遍历判断有无此 ID 的记录,如果有就删除,覆盖数据)。

c. 代码实现

i. list.jsp

[MVC] 综合案例:用户管理系统

<%@ 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>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.sex}</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="update.jsp">修改</a>
                    &nbsp;<a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/DeleteServlet?id=${user.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>

ii. DeleteServlet

package com.company.web;

import com.company.service.UserService;

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;

@WebServlet("/DeleteServlet")
public class DeleteServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.接收请求参数ID
        String id = request.getParameter("id");
        // 2.调用service删除
        UserService userService = new UserService();
        userService.delete(id);
        // 3.重定向到FindAllServlet
        response.sendRedirect(request.getContextPath() + "/FindAllServlet");
    }
}

iii. UserService

[MVC] 综合案例:用户管理系统

package com.company.service;

import com.company.dao.UserDao;
import com.company.domain.User;

import java.util.List;

public class UserService {

    UserDao userDao = new UserDao();

    public List<User> findAll() {
        // 调用dao查询
        //  List<User> list = userDao.findAll();
        return userDao.findAll();
    }

    public void add(User user) {
        // 调用dao添加
        userDao.add(user);
    }

    public void delete(String id) {
        userDao.delete(id);
    }
}

iv. UserDao

[MVC] 综合案例:用户管理系统

package com.company.dao;

import com.company.domain.User;
import com.company.util.DataUtils;

import java.util.List;

public class UserDao {

    public List<User> findAll() {
        // 调用数据库查询
        List<User> list = DataUtils.readAll();
        return list;
    }

    public void add(User user) {
        // 1.调用数据库查询
        List<User> list = DataUtils.readAll();
        // 2. List添加User
        list.add(user);
        // 3. 新的List集合覆盖数据库
        DataUtils.writeAll(list);
    }

    public void delete(String id) {
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2.遍历
        for (User user : list) {
            // 查找有无此ID记录,可避免修改异常
            if (user.getId().equalsIgnoreCase(id)) {
                list.remove(user);
                break;
            }
        }
        // 3.将删完的list覆盖数据库
        DataUtils.writeAll(list);
    }
}

d. 测试

5. 修改用户功能

a. 主要需求

  • 查找指定用户:点击修改按钮,跳转到更新页面(回显数据)。
  • 修改用户:重写输入用户信息,点击提交,更新系统。

b. 需求分析

[MVC] 综合案例:用户管理系统

c. 代码实现:查找指定用户

i. list.jsp

[MVC] 综合案例:用户管理系统

<%@ 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>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${list}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.sex}</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}/FindByIdServlet?id=${user.id}">修改</a>
                    &nbsp;<a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/DeleteServlet?id=${user.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>

ii. FindByIdServlet

package com.company.web;

import com.company.domain.User;
import com.company.service.UserService;

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;

@WebServlet("/FindByIdServlet")
public class FindByIdServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.接收请求参数id
        String id = request.getParameter("id");
        // 2.调用service,根据id查询
        UserService userService = new UserService();
        User user = userService.findById(id);
        // 3.将user存储到request域
        request.setAttribute("user", user);
        // 4.转发到update.jsp
        request.getRequestDispatcher("/update.jsp").forward(request, response);
    }
}

iii. UserService

[MVC] 综合案例:用户管理系统

package com.company.service;

import com.company.dao.UserDao;
import com.company.domain.User;

import java.util.List;

public class UserService {

    UserDao userDao = new UserDao();

    public List<User> findAll() {
        // 调用dao查询
        //  List<User> list = userDao.findAll();
        return userDao.findAll();
    }

    public void add(User user) {
        // 调用dao添加
        userDao.add(user);
    }

    public void delete(String id) {
        userDao.delete(id);
    }

    public User findById(String id){
        // 调用dao,根据id查询
        return userDao.findById(id);
    }
}

iv. UserDao

[MVC] 综合案例:用户管理系统

package com.company.dao;

import com.company.domain.User;
import com.company.util.DataUtils;

import java.util.List;

public class UserDao {

    public List<User> findAll() {
        // 调用数据库查询
        List<User> list = DataUtils.readAll();
        return list;
    }

    public void add(User user) {
        // 1.调用数据库查询
        List<User> list = DataUtils.readAll();
        // 2. List添加User
        list.add(user);
        // 3. 新的List集合覆盖数据库
        DataUtils.writeAll(list);
    }

    public void delete(String id) {
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2.遍历
        for (User user : list) {
            // 查找有无此ID记录,可避免修改异常
            if (user.getId().equalsIgnoreCase(id)) {
                list.remove(user);
                break;
            }
        }
        // 3.将删完的list覆盖数据库
        DataUtils.writeAll(list);
    }

    public User findById(String id) {
        User returnUser = null;
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2.遍历
        for (User user : list) {
            if (user.getId().equalsIgnoreCase(id)) {
                returnUser = user;
            }
        }
        // 3.返回
        return returnUser;
    }
}

v. update.jsp

[MVC] 综合案例:用户管理系统

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>

    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jquery-2.1.0.min.js"></script>
    <script src="js/bootstrap.min.js"></script>

</head>
<body>
<div class="container">
    <div class="container">
        <h3 style="text-align: center;">修改用户</h3>
        <form action="" method="post">
            <div class="form-group">
                <label for="name">编号:</label>
                <input type="text" class="form-control" id="id" readonly="readonly" name="id" value="${user.id}">
            </div>

            <div class="form-group">
                <label for="name">姓名:</label>
                <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名"/>
            </div>

            <div class="form-group">
                <label>性别:</label>
                <input type="radio" name="sex" value="" <c:if test="${user.sex==''}">checked="checked"</c:if>>/>男
                <input type="radio" name="sex" value="" <c:if test="${user.sex==''}">checked="checked"</c:if>>/>女
            </div>

            <div class="form-group">
                <label for="age">年龄:</label>
                <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄"/>
            </div>

            <div class="form-group">
                <div class="form-group">
                    <label for="address">籍贯:</label>
                    <input type="text" class="form-control" id="address" name="address" placeholder="请输入籍贯">
                </div>
            </div>

            <div class="form-group">
                <label for="qq">QQ:</label>
                <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
            </div>

            <div class="form-group">
                <label for="email">Email:</label>
                <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
            </div>

            <div class="form-group" style="text-align: center">
                <input class="btn btn-primary" type="submit" value="提交"/>
                <input class="btn btn-default" type="reset" value="重置"/>
                <input class="btn btn-default" type="button" value="返回"/>
            </div>
        </form>
    </div>
</div>
</body>
</html>

d. 测试:用户回显

e. 代码实现:修改用户

i. update.jsp

[MVC] 综合案例:用户管理系统

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>

    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/jquery-2.1.0.min.js"></script>
    <script src="js/bootstrap.min.js"></script>

</head>
<body>
<div class="container">
    <div class="container">
        <h3 style="text-align: center;">修改用户</h3>
        <form action="${pageContext.request.contextPath}/UpdateServlet" method="post">
            <div class="form-group">
                <label for="name">编号:</label>
                <input type="text" class="form-control" id="id" readonly="readonly" name="id" value="${user.id}">
            </div>

            <div class="form-group">
                <label for="name">姓名:</label>
                <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名"/>
            </div>

            <div class="form-group">
                <label>性别:</label>
                <input type="radio" name="sex" value="" <c:if test="${user.sex==''}">checked="checked"</c:if>>/>男
                <input type="radio" name="sex" value="" <c:if test="${user.sex==''}">checked="checked"</c:if>>/>女
            </div>

            <div class="form-group">
                <label for="age">年龄:</label>
                <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄"/>
            </div>

            <div class="form-group">
                <div class="form-group">
                    <label for="address">籍贯:</label>
                    <input type="text" class="form-control" id="address" name="address" placeholder="请输入籍贯">
                </div>
            </div>

            <div class="form-group">
                <label for="qq">QQ:</label>
                <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
            </div>

            <div class="form-group">
                <label for="email">Email:</label>
                <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
            </div>

            <div class="form-group" style="text-align: center">
                <input class="btn btn-primary" type="submit" value="提交"/>
                <input class="btn btn-default" type="reset" value="重置"/>
                <input class="btn btn-default" type="button" value="返回"/>
            </div>
        </form>
    </div>
</div>
</body>
</html>

ii. UpdateServlet

package com.company.web;

import com.company.domain.User;
import com.company.service.UserService;
import org.apache.commons.beanutils.BeanUtils;

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.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/UpdateServlet")
public class UpdateServlet extends HttpServlet {

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // 1.接收请求参数
            Map<String, String[]> parameterMap = request.getParameterMap();
            // 2.快速封装到User实体
            User newUser = new User();
            BeanUtils.populate(newUser, parameterMap);
            // 3.调用service,更新
            UserService userService = new UserService();
            userService.update(newUser);
            // 4.重定向,FindAllServlet
            response.sendRedirect(request.getContextPath()+"/FindAllServlet");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

iii. UserService

[MVC] 综合案例:用户管理系统

package com.company.service;

import com.company.dao.UserDao;
import com.company.domain.User;

import java.util.List;

public class UserService {

    UserDao userDao = new UserDao();

    public List<User> findAll() {
        // 调用dao查询
        //  List<User> list = userDao.findAll();
        return userDao.findAll();
    }

    public void add(User user) {
        // 调用dao添加
        userDao.add(user);
    }

    public void delete(String id) {
        userDao.delete(id);
    }

    public User findById(String id){
        // 调用dao,根据id查询
        return userDao.findById(id);
    }

    public void update(User newUser){
        userDao.update(newUser);
    }
}

iv. UserDao

[MVC] 综合案例:用户管理系统

package com.company.dao;

import com.company.domain.User;
import com.company.util.DataUtils;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

public class UserDao {

    public List<User> findAll() {
        // 调用数据库查询
        List<User> list = DataUtils.readAll();
        return list;
    }

    public void add(User user) {
        // 1.调用数据库查询
        List<User> list = DataUtils.readAll();
        // 2. List添加User
        list.add(user);
        // 3. 新的List集合覆盖数据库
        DataUtils.writeAll(list);
    }

    public void delete(String id) {
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2.遍历
        for (User user : list) {
            // 查找有无此ID记录,可避免修改异常
            if (user.getId().equalsIgnoreCase(id)) {
                list.remove(user);
                break;
            }
        }
        // 3.将删完的list覆盖数据库
        DataUtils.writeAll(list);
    }

    public User findById(String id) {
        User returnUser = null;
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2.遍历
        for (User user : list) {
            if (user.getId().equalsIgnoreCase(id)) {
                returnUser = user;
            }
        }
        // 3.返回
        return returnUser;
    }

    public void update(User newUser) {
        // 1.查询所有
        List<User> list = DataUtils.readAll();
        // 2遍历
        for (User user : list) {
            // 判断ID是否一致
            if (user.getId().equalsIgnoreCase(newUser.getId())) {
                try {
                    // 3.新的数据,覆盖旧的
                   /* user.setName(newUser.getName());
                    user.setAge(newUser.getAge());*/
                    BeanUtils.copyProperties(user, newUser);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        // 4.覆盖原有的数据库
        DataUtils.writeAll(list);
    }
}

f. 测试


原文链接:https://qwert.blog.csdn.net/article/details/105766698

相关标签: Web Application