首先,我们构建一个名为 User和一个名为file 的实体类,User类用于封装用户信息,file类用于封装文件信息。随后,我们设计一个名为 UserDao 和一个名为FileDao的接口类,它们负责与数据库进行交互。UserDao接口包括了基本的创建、读取、更新、删除操作方法:addUser()、deleteUser()、searchUser()、updateUser(),以及用于检索所有用户信息的getAllUsers()方法,实现用户登录的login()方法,根据用户名检索用户信息的getUser()方法,获取用户记录总数的getTotalRecords()方法;
FileDao接口包括了上传文件uploadFile()方法、删除文件deleteFile()方法、获取所有文件信息的getAllFiles()方法和获取所有文件总数的getAllRecords()方法。
接下来,我们实现一个名为 UserDaoImpl 的类和一个FileDaoImpl类,UserDaoImpl类作为 UserDao 接口的具体实现,包含了所有方法的实现逻辑;FileDaoImpl类作为FileDao接口的具体实现,包含了所有方法的实现逻辑。此外,我们还需要创建多个 Servlet 来处理不同的业务逻辑。LoginServlet 负责处理登录页面提交的请求,而 LoginFilter 过滤器则用于拦截除 login.jsp 页面外的所有页面请求。Userservlet 处理获取用户列表的请求,AddServlet 处理 userAdd.jsp 页面的添加用户请求,UpdateServlet 处理 userUpdate.jsp 页面的更新用户请求,DeleteServlet 处理删除用户请求,SearchServlet 处理 search.jsp 页面的搜索用户请求,UploadServlet处理uploadFile.jsp页面的文件上传请求,DownloadServlet负责展示所有上传的文件以及处理downloadFile.jsp页面的文件下载请求。
最后,我们设计多个 JSP 页面以展示用户界面。
登录页面(login.jsp)
由于LoginFilter过滤器仅允许访问login.jsp页面,用户必须输入正确的姓名和密码才能登录信息系统。若用户尚未创建账户,可点击“点击注册”链接,跳转至userAdd.jsp页面以添加个人信息并注册账户。注册成功后,系统将引导用户返回login.jsp页面,并弹出提示框显示“添加用户成功”。一旦用户输入的姓名和密码验证无误,将显示“登录成功”的提示框,并进入用户列表页面userList.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html lang="en">
<head>
<title>登录</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="https://fonts.googleapis.com/css?family=Lato:300,400,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<% if (session.getAttribute("message") != null) { %>
<script>
alert("<%= session.getAttribute("message") %>");
</script>
<% } %>
<section class="ftco-section">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-7 col-lg-5">
<div class="login-wrap p-4 p-md-5">
<div class="icon d-flex align-items-center justify-content-center">
<span class="fa fa-user-o"></span>
</div>
<h3 class="text-center mb-4">用户登录</h3>
<form action="login" class="login-form" method="post">
<div class="form-group">
<input type="text" name="username" class="form-control rounded-left" placeholder="用户名" required>
</div>
<div class="form-group d-flex">
<input type="password" name="password" class="form-control rounded-left" placeholder="密码" required>
</div>
<div class="form-group">
<button type="submit" class="form-control btn btn-primary rounded submit px-3">登录</button>
</div>
<div class="form-group d-md-flex">
<div class="w-50">
<label class="checkbox-wrap checkbox-primary">记住我
<input type="checkbox" checked>
<span class="checkmark"></span>
</label>
</div>
<div class="w-50 text-md-right">
<a href="userAdd.jsp">注册账户</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<script src="js/jquery.min.js"></script>
<script src="js/popper.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
用户列表页面(userList.jsp)
当点击“用户列表”功能时,页面会以get请求方式调用UserServlet处理获取用户列表请求,在Servlet再调用UserDaoImpl类中的getAllUsers()方法获取所有User类对象,同时获取当前页码,调用UserDaoImpl类中的getTotalRecords()方法获取所有记录数,计算总页数totalPages,并将参数设置到session对象中,然后根据请求跳转到userList.jsp页面以分页形式显示所有用户的信息,在用户信息下方分页信息条:包含当前页数、总共页数和总共记录数,还有页面跳转按钮,并为每条记录提供修改和删除按钮。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="com.practice2.User" %>
<html>
<head>
<title>用户列表</title>
<link rel="stylesheet" type="text/css" href="styles.css"> <!-- 引入样式表 -->
<script type="text/javascript" src="checkForm.js"></script>
<script type="text/javascript">
window.onload = function() {
var message = "<%= request.getAttribute("message") == null ? "" : request.getAttribute("message") %>";
showMessage(message);
};
</script>
</head>
<body>
<h1 class="headline">用户列表</h1>
<jsp:include page="index.jsp"/>
<form action="users" method="get" >
<table border="1" class="tb">
<tr class="tb-header">
<th>用户名</th>
<th>用户类型</th>
<th>性别</th>
<th>出生日期</th>
<th>兴趣爱好</th>
<th>电子邮件</th>
<th>自我介绍</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>) request.getAttribute("users");
Integer currentPage = (Integer) session.getAttribute("currentPage");
Integer totalPages = (Integer) session.getAttribute("totalPages");
Integer totalRecords = (Integer) session.getAttribute("totalRecords");
if (users != null && !users.isEmpty()) {
for (User user : users) {
%>
<tr>
<td><%= user.getUsername() %></td>
<td><%= user.getUser_type() %></td>
<td><%= user.getGender() %></td>
<td><%= user.getBirth_date() %></td>
<td><%= String.join(",", user.getInterests()) %></td>
<td><%= user.getEmail() %></td>
<td><%= user.getIntroduction() %></td>
<td>
<a class="operation op1" href="updateUser?username=<%= user.getUsername() %>">修改</a>
<a class="operation op2" href="deleteUser?username=<%= user.getUsername() %>">删除</a>
</td>
</tr>
<%
}
} else {
%>
<tr>
<td colspan="8">没有用户数据</td>
</tr>
<%
}
%>
</table>
<div class="pagination"><br>
<p>当前第<%= currentPage %>页 共<%= totalPages %>页 总<%= totalRecords %>条记录</p><br>
<%
if (currentPage > 1) {
%>
<a href="users?currentPage=<%= currentPage - 1 %>"><<</a>
<%
}
for (int i = 1; i <= totalPages; i++) {
%>
<a href="users?currentPage=<%= i %>" <%= currentPage == i ? "class=\"active\"" : ""%>><%= i %></a>
<%
}
if (currentPage < totalPages) {
%>
<a href="users?currentPage=<%= currentPage + 1 %>">>></a>
<%
}
%>
</div>
</form>
</body>
</html>
添加用户信息页面(userAdd.jsp)
- 根据需求分析提供表单供用户输入新用户信息,然后将表单以post方式提交给处理程序AddServlet处理用户信息的添加请求,然后调用UserDaoImpl类中addUser()方法并将请求数据插入到数据库,并设置提示信息message到session中然后再响应重定向到UserServlet,UserServlet在session中获取到message属性后设置到Request请求属性中再由请求重定向到userList.jsp页面显示提示框信息和所有用户信息。
- 在表单中对用户名、密码、电子邮件和自我介绍的输入都作出条件和格式限制,每个字段对应有检查方法在checkForm.js进行输入的验证,最终提交表单时会对每个方法进行再次验证,返回结果为真才能提交成功。同时要求输入除了自我介绍外用户类型、性别、出生日期和兴趣爱好不能为空,并且密码和确认密码需要一致,否则无法提交。
- 当用户信息填写完提交后会有添加成功提示弹框,点击确认后会将页面跳转回用户列表页面展示所有用户信息。
- 此外还提供了重置添加信息的按钮。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加用户</title>
<link rel="stylesheet" type="text/css" href="styles.css"> <!-- 引入样式表 -->
<script type="text/javascript" src="checkForm.js"></script>
</head>
<body>
<h1 class="headline">添加用户</h1>
<jsp:include page="index.jsp"/>
<form action="addUser" method="post">
<div class="border-radius display-area">
<table>
<tr><td>用户名</td><td><input type="text" id="UN" name="username" required onblur="return validateUN()"></td>
<td><span id="tips_username">* 用户名由6-18位字符组成</span></td></tr>
<tr><td>密码</td><td><input type="password" id = "PWD" name="password" required onblur="return validatePWD()"></td>
<td><span id="tips_password">* 密码由6-18位字符组成,且必须包含字母、数字和标点符号</span></td></tr>
<tr><td>确认密码</td><td><input type="password" id ="CPD" name="confirm_password" required onblur="return validateCPD()"></td>
<td><span id="tips_repeat">* 请再次输入你的密码</span></td></tr>
<span id="error" style="color: red;"></span>
<tr><td>用户类型</td><td>
<select name="user_type" id="UT" required onblur="return validateUT()">
<option disabled>请选择</option>
<option value="普通用户">普通用户</option>
<option value="管理员">管理员</option>
</select></td>
<td><span id="tips_usertype">* 请选择用户类型</span></td></tr>
<tr><td>性别</td>
<td><input type="radio" name="gender" value="男" required onclick="return validateGender()"> 男
<input type="radio" name="gender" value="女" required onclick="return validateGender()"> 女</td>
<td><span id="tips_gender">* 请选择你的性别</span></td></tr>
<tr><td>出生日期</td><td><input type="date" id="BD" name="birth_date" required onblur="return validateBD()"></td>
<td><span id="tips_birthdate">* 请选择你的出生日期</span></td>
</tr>
<tr><td>兴趣爱好</td>
<td>
<input type="checkbox" name="interests" value="阅读" onblur="return validateInst()"> 阅读
<input type="checkbox" name="interests" value="音乐" onblur="return validateInst()"> 音乐
<input type="checkbox" name="interests" value="运动" onblur="return validateInst()"> 运动</td>
<td><span id="tips_hobby">* 请选择兴趣爱好</span></td>
</tr>
<tr><td>电子邮件</td><td><input type="email" id="EML" name="email" required onblur="return validateEmail()"></td>
<td><span id="tips_email">* 请填写常用的EMAIL,将用于密码找回</span></td>
</tr>
<tr><td>自我介绍</td><td><textarea id="Intro" name="introduction" rows="4" cols="50" onblur="return validateIntro()"></textarea></td>
<td><span id="tips_introduction">* 限100字以内</span></td>
</tr>
<tr>
<td colspan="2" align="center">
<input class="operation" type="submit" name="submit" value="提交" onclick="return submitCheck()"/>
<input class="operation" type="reset" name="reset" value="重置"/>
</td></tr>
</table>
</div>
</form>
</body>
</html>
查询用户页面(search.jsp)
- 根据需求分析提供搜索表单,用户可以通过用户的任何信息项,模糊匹配关键字,查询符合条件的记录。
- 查找方式提供了:用户名,电子邮件,性别,用户类型,出生日期,兴趣爱好和自我介绍七种,输入关键字即可进行模糊匹配。
- 当选择查询方式和输入关键字后点击“查询”页面会以get请求方式携带参数searchBy和searchTerm调用SearchServlet,在doGet方法下获取请求参数searchBy和searchTerm后调用UserdaoImpl类的searchUsers()方法获取符合查询条件的用户信息记录,以及调用getAllRecords()方法获取符合查询条件的记录数并计算总页数,然后将users设置到Request请求属性中,将总记录数总页数等信息设置到session中,然后通过请求转发到search.jsp页面以分页的形式显示查询结果。
- 在查找结果用户信息下方分页信息条包含当前页数、总共页数和总共记录数,还有页面跳转的按钮。
- 在查询按钮旁也设置了添加用户信息便捷键,在每条记录中也提供了删除和修改操作按钮。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="com.practice2.User" %>
<html>
<head>
<title>搜索用户</title>
<link rel="stylesheet" type="text/css" href="styles.css"> <!-- 引入样式表 -->
</head>
<body>
<h1 class="headline">搜索用户</h1>
<jsp:include page="index.jsp"/>
<form class="search-bar" action="search" method="get">
查找方式:
<select name="searchBy">
<option value="username">用户名</option>
<option value="email">电子邮件</option>
<option value="gender">性别</option>
<option value="user_type">用户类型</option>
<option value="birth_date">出生日期</option>
<option value="interests">兴趣爱好</option>
<option value="introduction">自我介绍</option>
</select>
关键字: <input class="input1" type="text" name="searchTerm" placeholder="search">
<input class="border-radius button" id="submitBtn" type="submit" name = "submit" value="查询" onsubmit="return submitBtnCheck()">
<input type="hidden" id="buttonClickedResult" name="buttonClickedResult" value="false">
<a href="userAdd.jsp" class="border-radius button">添加用户信息</a>
</form>
<table border="1" class="tb">
<tr class="tb-header">
<th>用户名</th>
<th>用户类型</th>
<th>性别</th>
<th>出生日期</th>
<th>兴趣爱好</th>
<th>电子邮件</th>
<th>自我介绍</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>) request.getAttribute("users");
Integer currentPage = (Integer) session.getAttribute("currentPage");
Integer totalPages = (Integer) session.getAttribute("totalPages");
Integer totalRecords = (Integer) session.getAttribute("totalRecords");
if (users != null && !users.isEmpty()) {
for (User user : users) {
%>
<tr>