目录
前言
我们上一篇文章介绍了 Servlet 请求与响应接口,这篇文章我就来介绍一下基于目前所学知识,来做出的对于教务系统的模拟,其功能包括用户注册,用户注销,用户信息修改及用户查询等,将会用到JDBC、DAO与实体类封装、HTML表单和请求与响应对象的有关知识。
一、开发步骤
-
创建用户信息表t_users.frm,表中字段包含用户编号(userId)、用户名(username)、密码(password)、性别(sex)、籍贯(location)
-
在包Entity下创建表t_users的对应实体类
-
在包Util下创建简化数据库编程的DBUtil工具类
-
在包DAO下封装对表操作的DAO类
-
创建相关网页,完成向服务器提交数据的功能
-
在包Controller下编写相关的Servlet类以完成前端与后端的数据交互
二、具体实现
1. 建立 t_users 表
-
打开 Navicat ,在数据库MyDataBase下新建表
-
给新建表添加userId,username, password,sex及location这五个字段,其中设置userId字段为主键
-
给这张起名为t_users,注意要添加主键才能完成表的创建
-
创建完这张表后,我们在侧边栏双击这张表,打开如下图所示,我们可以在此页面给表添加数据
-
给表添加如下五个数据,要记住每添加完一行数据,都要去点下面的对号,对添加此行的数据进行保存,才能继续添加下一行数据
2. 创建t_users表的实体类
t_users 实体类相当于 t_users.frm 这个表文件对应在Java代码中的映射。我们在t_users实体类中属性对应t_users表中字段,并且对外提供 getter 与 setter 与 构造方法。要记住,t_users实体类,应该放在Entity包下。
package Entity;
public class t_users {
private Integer userId;
private String username;
private String password;
private String sex;
private String location;
public t_users(Integer userId, String username, String password, String sex, String location) {
this.userId = userId;
this.username = username;
this.password = password;
this.sex = sex;
this.location = location;
}
public Integer getUserId() {
return userId;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getSex() {
return sex;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setLocation(String location) {
this.location = location;
}
public String getLocation() {
return location;
}
}
3. 在WEB-INF下建立lib目录,引入 JDBC jar 包
- 在WEB-INF下,新建lib目录
- 点File —> Project Structure —> Modules —> Dependences
- 点击下面的 + 号, 然后点击1 JARS or Directions…
- 然后找到我们刚刚新建的lib文件夹
- 之后选择Jar Directory 点击 OK 即可
- 配置好之后,我们找到 JBDC 的 jar 包进行复制,然后再lib目录下粘贴即可
- 点击粘贴会出现如下字样
- 导入 jar 包后,lib下结构如图所示
4. 封装 Java DBUtil 工具类
我们之前曾经说过,对于开发步骤需要三步或三步以上的操作都要进行封装,来简化操作的复杂度。我们知道JDBC连接数据库需要六步较为繁琐,所以我们要在包Utility下封装DBUtil工具类来简化JDBC的开发。
package Utility;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.util.ResourceBundle;
public class DBUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
private static Connection conn = null;
private static PreparedStatement ps = null;
static {
try {
ResourceBundle rb = ResourceBundle.getBundle("db");
driver = rb.getString("driver");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
关于数据库配置文件 db.properties ,我们直接放在src目录下即可,如下图所示
DBUtil工具类示意图如下
5. 创建 t_users 的DAO类
t_users 的 DAO 类封装通过JDBC对数据库表t_users的增删改差等操作,也是相当于简化代码简化操作步骤的作用,方便在Servlet类中进行调用。
- 向表中添加数据
- 查询表中所有数据并将数据存储到LIst集合中
- 删除表中数据
- 登录验证
6. 创建网页
我们做教务系统需要完成的本质任务是从前端到后端的数据库交互,用Java代码操控数据库的部分我们已经完成,接下来需要完成的就是客户端发出请求和服务器处理请求,发出请求就是对应HTML网页上的操作,让我们来看看如何进行操作。
- 在web目录下,新建HTML File。注意,是在web下而不是在WEB-INF目录下新建
- 创建userAdd网页,用于向数据库提供要进行添加的数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>userAdd</title>
</head>
<body>
<center>
<form action="/myWeb/user/add" method="get">
<table border="3">
<tr>
<td>username</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>password</td>
<td><input type="text" name="password"/></td>
</tr>
<tr>
<td>sex</td>
<td>
<input type="radio" name="sex" value="male">male
<input type="radio" name="sex" value="female">female
</td>
</tr>
<tr>
<td>location</td>
<td><input type="text" name="location"/></td>
</tr>
<tr>
<td><input type="submit" value="submit"></td>
<td><input type="reset" value="reset"></td>
</tr>
</table>
</form>
</center>
</body>
</html>
action中路径书写为/myWeb/user/add,后面我们创建Servlet类时进行对应的修改
3. 创建 login.html 与 login_error.html 分别代表登录界面和登录失败之后转到的界面,完成登录验证
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<center>
<form action="/myWeb/login" method="post">
<table border="2">
<tr>
<td>登录名</td>
<td><input type="text" name="userName"/></td>
</tr>
<tr>
<td><input type="submit" value="登录"/></td>
<td><input type="reset" /></td>
</tr>
</table>
</form>
</center>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login_error</title>
</head>
<body>
<center>
<font style="color:red;font-size: 30px">登录信息不存在,请重新登录</font>
<form action="/myWeb/login" method="post">
<table border="2">
<tr>
<td>登录名</td>
<td><input type="text" name="userName"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td><input type="submit" value="登录"/></td>
<td><input type="reset" /></td>
</tr>
</table>
</form>
</center>
</body>
</html>
- 创建index.html作为网站首页,其有两个链接-----用户查询 和 用户注册,我们点击相关链接跳转到对应操作界面,其中用户查询中包含删除用户数据的操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<style>
h1 {
font-size : 50px;
color: brown;
}
</style>
</head>
<body>
<center>
<h1>欢迎来到教务系统</h1>
<div>用户信息管理系统</div>
<div> <li><a href="/myWeb/userAdd.html" target="_self">用户信息注册</a></li></div>
<div> <li><a href="/myWeb/user/find" target="_self">用户信息查询</a></li></div>
</center>
</body>
</html>
7. 在包Controller下编写相关的Servlet类
我们通过HTML页面来向服务器提供数据,我们需要相应的Servlet类通过request请求对象来获取提交数据的值,并且通过response响应对象来进行数据返回
1.若是src下无法建立Servlet,我们找到File —> Project Structure 中来设定src 为 Source Roots
这样 new 中就有了Servlet
2.编写 UserAddServlet 类,来完成用户的注册操作,即从前端获取请求数据,然后向后端数据库添加相关数据
package Controller;
import DAO.t_usersDao;
import Entity.t_users;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "userAddServlet", value = "/user/add")
public class UserAddServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username, password, sex, location;
t_usersDao userDao = new t_usersDao();
t_users user = null;
int cnt = 0;
PrintWriter out = null;
username = request.getParameter("username");
password = request.getParameter("password");
sex = request.getParameter("sex");
location = request.getParameter("location");
user = new t_users(null, username, password, sex, location);
cnt = userDao.add(user);
response.setContentType("text/html;charset=utf-8");
out = response.getWriter();
if (cnt == 1) {
out.print("<font style='color:red;font-size:40'>用户信息注册成功</font>");
} else {
out.print("<font style='color:red;font-size:40'>用户信息注册失败</font>");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
路径要进行改写,与HTML中的路径相适配
3. 编写UserFindSevlet类,查找表中数据,并将其显示至前端
package Controller;
import DAO.t_usersDao;
import Entity.t_users;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "UserFindServlet", value = "/user/find")
public class UserFindServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
t_usersDao userDao = new t_usersDao();
PrintWriter out;
List<t_users> userList = userDao.findAll();
response.setContentType("text/html; charset=utf-8");
out = response.getWriter();
out.print("<table border='2' align='center'");
out.print("<tr>");
out.print("<td>用户编号</td>");
out.print("<td>用户姓名</td>");
out.print("<td>用户密码</td>");
out.print("<td>用户性别</td>");
out.print("<td>用户住址</td>");
out.print("</tr>");
for (t_users users:userList) {
out.print("<tr>");
out.print("<td>" + users.getUserId() + "</td>");
out.print("<td> ***** </td>");
out.print("<td>" + users.getUsername() + "</td>");
out.print("<td>" + users.getPassword() + "</td>");
out.print("<td>" + users.getSex() + "</td>");
out.print("<td>" + users.getLocation() + "</td>");
out.print("<td><a href='myWeb/user/delete?userId=" + users.getUserId() + "'>删除用户</a></td>");
}
out.print("</table>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
其中通过response向前端输出内容包括一个删除数据的超链接,这里是关联到UserDeleteServlet类完成操作
4. UserDeleteServlet 类 完成数据的删除操作
package Controller;
import DAO.t_usersDao;
import Entity.t_users;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "UserDeleteServlet", value = "/user/delete")
public class UserDeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userId;
t_usersDao userDao = new t_usersDao();
int cnt;
PrintWriter out = null;
userId = request.getParameter("userId");
cnt = userDao.delete(userId);
response.setContentType("text/html;charset=utf-8");
out = response.getWriter();
if (cnt == 1) {
out.print("<font style='color:red;font-size:40'>用户信息删除成功</font>");
} else {
out.print("<font style='color:red;font-size:40'>用户信息删除失败</font>");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
5. LoginServlet 类完成 前端输入数据的登录验证
package Controller;
import DAO.t_usersDao;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName, password;
t_usersDao userDao = new t_usersDao();
int cnt = 0;
request.setCharacterEncoding("utf-8");
userName = request.getParameter("username");
password = request.getParameter("password");
cnt = userDao.login(userName, password);
if (cnt == 1) {
response.sendRedirect("/myWeb/index.html");
} else {
response.sendRedirect("/myWeb/login_error.html");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
三、演示
在此我们只演示注册操作
- 注册Tomcat按钮,启动Tomcat服务器
- 跳转到index.html, 因为我们Tomcat web.xml配置文件中默认以index.html为默认资源文件,即首页
- 打开其下的userAdd.html网页,如下图所示
- 表单中填入以下数据
- 点击submit进行提交,提交成功后跳转如下界面
- 我们在查看数据库表中,多出来此条数据