注册功能
1.用户表sys_user的设计
id /用户名/密码/手机号/注册日期
id:UUID varchar(60)
全是字符串类型,给合适的长度
create table zhucedenglu.sys_user
(
id varchar(60) not null,
username varchar(32) not null,
password varchar(18) not null,
mobile varchar(32) not null,
zhuce_time varchar(32) not null,
constraint sys_user_id_uindex
unique (id),
constraint sys_user_mobile_uindex
unique (mobile),
constraint sys_user_username_uindex
unique (username)
);
alter table zhucedenglu.sys_user
add primary key (id);
2.注册业务时序图
id使用UUID 生成随机
用户名不能重复,手机号也不能重复,如果有一个重复都不能完成注册,并响应给用户不能注册的具体原因
3. 代码
3.1 编写实体类
public class SysUser {
private String id;
private String username;
private String password;
private String mobile;
private String zhuceTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getZhuceTime() {
return zhuceTime;
}
public void setZhuceTime(String zhuceTime) {
this.zhuceTime = zhuceTime;
}
}
3.1 编写SysUserDao
//方法
public interface SysUserDao {
//根据用户名查询用户对象
SysUser selectByUserName(String username) throws SQLException;
//根据手机号查询用户对象
SysUser selectByMobile(String mobile) throws SQLException;
//保存用户对象
Integer insertSysUser(SysUser sysUser) throws SQLException;
}
3.2 编写SysUserDaoImpl
public class SysUserDaoImpl implements SysUserDao{
@Override
public SysUser selectByUserName(String username) throws SQLException {
Connection conn = JDBCUtils.getConn();
String sql = "select * from sys_user where username = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,username);
ResultSet rs = ps.executeQuery();
if(rs.next()){
SysUser sysUser = new SysUser();
sysUser.setId(rs.getString("id"));
sysUser.setUsername(rs.getString("username"));
sysUser.setMobile(rs.getString("mobile"));
sysUser.setPassword(rs.getString("password"));
sysUser.setZhuceTime(rs.getString("zhuce_time"));
return sysUser;
}
return null;
}
@Override
public SysUser selectByMobile(String mobile) throws SQLException {
Connection conn = JDBCUtils.getConn();
String sql = "select * from sys_user where mobile = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,mobile);
ResultSet rs = ps.executeQuery();
if(rs.next()){
SysUser sysUser = new SysUser();
sysUser.setId(rs.getString("id"));
sysUser.setUsername(rs.getString("username"));
sysUser.setMobile(rs.getString("mobile"));
sysUser.setPassword(rs.getString("password"));
sysUser.setZhuceTime(rs.getString("zhuce_time"));
return sysUser;
}
return null;
}
@Override
public Integer insertSysUser(SysUser sysUser) throws SQLException {
Connection conn = JDBCUtils.getConn();
String sql = "insert into sys_user(id,username,password,mobile,zhuce_time) value (?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,sysUser.getId());
ps.setString(2,sysUser.getUsername());
ps.setString(3,sysUser.getPassword());
ps.setString(4,sysUser.getMobile());
ps.setString(5,sysUser.getZhuceTime());
int i = ps.executeUpdate();
return i;
}
}
3.3 编写SysUserService
public interface SysUserService {
//注册的方法
void register(SysUser sysUser);
}
3.4 编写SysUserServiceImpl
public class SysUserServiceImpl implements SysUserService {
@Override
public void register(SysUser sysUser) {
SysUserDao sysUserDao = new SysUserDaoImpl();
try {
//调用SysUserDao中根据用户名查询对象的方法
SysUser sysUser1 = sysUserDao.selectByUserName(sysUser.getUsername());
//可以根据sysUser1是否为null进行判断
if(sysUser1!=null){
//用户名已存在
//通过手动制造运行时异常,来给Servlet反馈:用户名已存在
throw new RuntimeException("用户名已存在");
}else{
//用户名不存在
//调用SysUserDao中根据手机号查询对象的方法
SysUser sysUser2 = sysUserDao.selectByMobile(sysUser.getMobile());
if(sysUser2!=null){
//手机号已存在
//通过手动制造运行时异常,来给Servlet反馈:手机号已存在
throw new RuntimeException("手机号已存在");
}else{
//手机号不存在
//调用SysUserDao中保存用户对象的方法
Integer i = sysUserDao.insertSysUser(sysUser);
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
3.5 编写DoRegisterServlet
@WebServlet("/sysUser/doRegister")
public class DoRegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收请求
//处理请求的乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String mobile = req.getParameter("mobile");
//使用UUID生成id
String id = UUID.randomUUID().toString().replace("-","");
String zhuceTime = "";
//java 代码获取当前系统时间
Date date = new Date();
//日期类型怎么转换成字符串类型的日期
zhuceTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
//将这些参数封装到一个SysUser对象
SysUser sysUser = new SysUser();
sysUser.setId(id);
sysUser.setUsername(username);
sysUser.setPassword(password);
sysUser.setMobile(mobile);
sysUser.setZhuceTime(zhuceTime);
//调用注册业务
SysUserService sysUserService = new SysUserServiceImpl();
try {
//可能出现异常的代码使用tryCatch 进行处理
sysUserService.register(sysUser);
//没有异常
//响应结果:重定向到登录的Servlet
System.out.println("重定向到登录的Servlet");
} catch (RuntimeException e) {
//捕捉运行时异常
//用户名存在
//手机号存在
//响应结果:转发
req.setAttribute("msg",e.getMessage());
req.getRequestDispatcher("/WEB-INF/sysuser/register.jsp").forward(req,resp);
}catch (Exception e){
//保存失败,软件系统异常
e.printStackTrace();
//响应结果
}
}
}
3.6 编写register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<h3>注册表单</h3>
<form action="/sysUser/doRegister" method="post">
用户名:<input type="text" name="username" value="${param.username}"><br>
密码:<input type="password" name="password" value="${param.password}"><br>
手机号:<input type="text" name="mobile" value="${param.mobile}"><br>
<input type="submit" value="注册"> <span style="color: #ff0000">${msg}</span><br>
</form>
</body>
</html>
3.7编写 RegisterServlet
@WebServlet("/sysUser/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/sysuser/register.jsp").forward(req,resp);
}
}