注册功能实现
添加一个 RegisterServlet 类来处理 POST 过来的数据,在 doPost 方法中通过 request 获取表单数据:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name"); // 获取填写的用户名
String password = request.getParameter("password"); // 获取填写的密码
// System.out.println(name);
// System.out.println(password);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().append("注册成功");
}Code language: JavaScript (javascript)
要实现注册,需要一个用户表来记录每个注册用户。使用 Navicat 创建一张 account 表:
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NOT NULL,
`Password` varchar(150) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;Code language: JavaScript (javascript)
调用 JDBC 将记录插入到数据库:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name"); // 获取填写的用户名
String password = request.getParameter("password"); // 获取填写的密码
// System.out.println(name);
// System.out.println(password);
response.setContentType("text/html;charset=UTF-8");
Connection conn = null;
java.sql.PreparedStatement statement = null;
// 注册 JDBC 驱动器
try {
Class.forName(JDBC_DRIVER).newInstance();
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
String sql = "insert into account(name,password) values (?,?)";
statement = conn.prepareStatement(sql);
statement.setString(1, name); // 下标从1开始
statement.setString(2, password);
int res = statement.executeUpdate();
if (res > 0) {
response.getWriter().append("注册成功");
} else {
response.getWriter().append("注册失败");
}
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 完成后关闭
try {
if (statement != null)
statement.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}Code language: JavaScript (javascript)
登录功能实现
登录页面原则上不应使用纯 HTML,因为如果是 HTML,要显示登录人信息则无法在 HTML 里面替换。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>foxdevelop登录</title>
</head>
<body>
<form action="/ServletDemo/register" method="post">
账号:<input type="text" name="name" value=""><br>
密码:<input type="password" name="password" value=""><br>
<input type="submit" value="登录">
</form>
</body>
</html>Code language: HTML, XML (xml)
正常来说,登录应该先去数据库查找记录,然后判断密码是否一致。密码错误则登录失败,密码正确才允许登录。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name"); // 获取填写的用户名
String password = request.getParameter("password"); // 获取填写的密码
response.setContentType("text/html;charset=UTF-8");
Connection conn = null;
java.sql.PreparedStatement statement = null;
// 注册 JDBC 驱动器
try {
Class.forName(JDBC_DRIVER).newInstance();
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
String sql = "select * from account where name = ?";
statement = conn.prepareStatement(sql);
statement.setString(1, name);
ResultSet res = statement.executeQuery();
if (res.next()) {
String orginPassword = res.getString("password");
if (orginPassword.equals(password)) {
// 进行登录
HttpSession session = request.getSession(true);
session.setAttribute("currentname", name);
response.getWriter().append("登录成功");
} else {
response.getWriter().append("登录失败");
}
}
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 完成后关闭
try {
if (statement != null)
statement.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}Code language: JavaScript (javascript)
注意:原文中 SQL 语句
"select * from account where name = '?'"使用了单引号包裹占位符,这是错误的写法。占位符?不应加单引号,正确写法为"select * from account where name = ?"。
显示登录人信息
显示登录人信息,就是在其他页面或其他 Servlet 中先去 Session 获取 currentname 这个值。如果没有,表示未登录;如果有,表示已登录。直接把这个值拼接在 Servlet 输出的 HTML 代码中即可。
- 如果是纯 HTML 页面,可能需要通过 AJAX 来显示登录状态。
- 如果是 JSP + JSTL,则可以直接在页面中通过 EL 表达式
${sessionScope.currentname}显示。
后续技术栈路线
| 阶段 | 技术 |
|---|---|
| 基础 | JavaBean、MySQL、JDBC、JSP |
| 视图层 | JSTL |
| 持久层 | MyBatis、Hibernate |
| 控制层 | Struts2、Spring MVC |
| 框架 | Spring |
Previous: 创建 JstlTest 项目并配置 Servlet 与 JSP