用户注册功能是互联网上最常见的功能。在这一小节中,我们来学习如何使用JSP来实现用户注册功能,并将用户注册的个人信息存储到数据库的表中。可以在JSP文件中编写数据库逻辑,但是将数据操作的逻辑与JSP页面分开是一种常见的做法。 在这里,我们将使用DAO
,工厂方法,DTO和单例设计模式。
打开Eclipse,创建一个动态Web项目:jsp-register
主要有以下几个文件:
index.jsp
- 用于为用户提供输入的表单界面。User.java
- 一个具有属性以及setter
和getter
方法的bean类。doreg.jsp
- 一个处理请求并调用方法的jsp文件。DBProvider.java
- 一个包含许多常量的接口,例如:DRIVER_CLASS
,CONNECTION_URL
,USERNAME
和PASSWORD
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类具有setter
和getter
方法的3个属性:username
,email
和passwd
。
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;
}
}
运行上面项目,结果如下: