一个注册的例子

注册功能实现

添加一个 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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注