用户注册功能是互联网上最常见的功能。在这一小节中,我们来学习如何使用JSP来实现用户注册功能,并将用户注册的个人信息存储到数据库的表中。可以在JSP文件中编写数据库逻辑,但是将数据操作的逻辑与JSP页面分开是一种常见的做法。 在这里,我们将使用DAO,工厂方法,DTO和单例设计模式。

打开Eclipse,创建一个动态Web项目:jsp-register

主要有以下几个文件:

  • index.jsp - 用于为用户提供输入的表单界面。
  • User.java - 一个具有属性以及settergetter方法的bean类。
  • doreg.jsp - 一个处理请求并调用方法的jsp文件。
  • DBProvider.java - 一个包含许多常量的接口,例如:DRIVER_CLASSCONNECTION_URLUSERNAMEPASSWORD
  • DBConnection.java - 一个返回Connection对象的类,它使用单例和工厂方法设计模式。
  • RegisterDao.java - 一个负责访问数据库的DAO类。

在此示例中,我们使用MySQL数据库。首先在MySQL数据库中创建表:

CREATE TABLE `xn_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '',
  `password` varchar(32) DEFAULT '',
  `email` varchar(255) DEFAULT '',
  `instro` varchar(255) DEFAULT '',
  `status` tinyint(1) unsigned DEFAULT '0',
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

文件:index.jsp

这里为了方便演示,只使用三个字段,以使概念更清晰并简化应用程序流程。还可以根据需要设置其他字段,例如:个人简介,国家/地区,爱好等。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP用户注册功能实践(xntutor.com)</title>
<link rel="stylesheet"
    href="http://www.xntutor.com/static/css/fordemo.css?v=v.1.0894">
</head>
<body class="inside-header inside-aside is-dialog">
    <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
        <div class="row">
            <form class="form-horizontal" action="doreg.jsp" method="post">
                <h2 style="width:100%;text-align:center;padding: 48px;">JSP用户注册功能实践</h2>

                <div class="form-group">
                    <label for="name" class="control-label col-xs-12 col-sm-4">用户名:</label>
                    <div class="col-xs-12 col-sm-4">
                        <input id="name" class="form-control" name="name" type="text"
                            value="">
                    </div>
                </div>

                <div class="form-group">
                    <label for="name" class="control-label col-xs-12 col-sm-4">电子邮箱:</label>
                    <div class="col-xs-12 col-sm-4">
                        <input id="name" class="form-control" name="email" type="text"
                            value="">
                    </div>
                </div>

                <div class="form-group">
                    <label for="name" class="control-label col-xs-12 col-sm-4">密码:</label>
                    <div class="col-xs-12 col-sm-4">
                        <input id="name" class="form-control" name="passwd" type="password"
                            value="">
                    </div>
                </div>

                <div class="form-group">
                    <label class="control-label col-xs-12 col-sm-4"></label>
                    <div class="col-xs-12 col-sm-4">
                        <button type="submit" class="btn btn-success btn-embossed">提交注册</button>

                    </div>
                </div>
            </form>
        </div>
    </div>
</body>
</html>

文件:doreg.jsp

这个jsp文件包含所有到bean类的对象的输入值,该类作为参数传递到RegisterDao类的register()方法中。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册处理...(xntutor.com)</title>
</head>
<body>
    <%@page import="com.xntutor.dao.RegisterDao"%>
    <jsp:useBean id="uobj" class="com.xntutor.bean.User" />
    <jsp:setProperty property="*" name="uobj" />

    <%
        int status = RegisterDao.register(uobj);
        if (status > 0){
            out.print("注册成功~");
        }else{
            out.print("注册失败~");
        }
    %>
</body>
</html>

文件:User.java

此bean类具有settergetter方法的3个属性:usernameemailpasswd

package com.xntutor.bean;

public class User {
    private int id;
    private String name;
    private String passwd;
    private String email;
    private String instro;
    private int status;
    private String created;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String password) {
        this.passwd = password;
    }

    public String getEmail() {
        return email;
    }

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

    public String getInstro() {
        return instro;
    }

    public void setInstro(String instro) {
        this.instro = instro;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCreated() {
        return created;
    }

    public void setCreated(String created) {
        this.created = created;
    }

}

文件:DBProvider.java

此接口包含四个常量,每个数据库的常量可能不同。

package com.xntutor.db;

public class DBProvider {
    static String DRIVER = "com.mysql.cj.jdbc.Driver";
    static String CONNECTION_URL = "jdbc:mysql://localhost/testdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
    static String DBNAME = "testdb";
    static String USERNAME = "root";
    static String PASSWORD = "123456";
}

文件:ConnectionProvider.java

此类负责返回Connection对象。 此处,驱动程序类仅加载一次,并且连接对象仅获取一次内存。

package com.xntutor.db;

import java.sql.*;


public class DBConnection {
    private static Connection con = null;
    static {
        try {
            Class.forName(DBProvider.DRIVER);
            con = DriverManager.getConnection(DBProvider.CONNECTION_URL, DBProvider.USERNAME, DBProvider.PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        System.out.println("Connect to MySQL...");
        return con;
    }

}

文件:RegisterDao.java

此类将Bean组件的值插入数据库。

package com.xntutor.dao;

import java.sql.*;
import java.text.SimpleDateFormat;

import com.xntutor.bean.User;
import com.xntutor.db.DBConnection;

public class RegisterDao {

    public static int register(User u) {
        int status = 0;
        try {
            Connection con = DBConnection.getConnection();
            if(con==null) {
                System.out.println("Connection con is null...");
            }
            java.util.Date  d = new java.util.Date();
            SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String created = format1.format(d);

            PreparedStatement ps = con.prepareStatement("insert into xn_user(id,name,email,password,instro,status, created) values(?,?,?,?,?,?,?)");
            ps.setInt(1, 0);
            ps.setString(2, u.getName());
            ps.setString(3, u.getEmail());
            ps.setString(4, u.getPasswd());
            ps.setString(5, u.getInstro());
            ps.setInt(6, 1);
            ps.setString(7, created);

            status = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return status;
    }

}

运行上面项目,结果如下: