上一期大致讲到了前台验证的方面,接下来就是要向后台提交数据
首先要给予注册按钮的点击事件
进来之后先判断我们之前给的标志位是否全部通过
确认数据无误后再使用ajax向后台提交数据
//提交注册信息给后台
$.post("RegisterServlet", $('#register_form').serialize(), function (data) {
if (data.flag) { //接收后台验证是否通过
//通过
registerHandOff();
document.getElementById("register_code_i").value = "";
} else {
//未通过获取后台错误信息并打印`
let errors = data.errors;
for (let key in errors) {
registerErrors(key, errors[key]);
showPrompt(false, errors[key]);
}
}
});
将我们的注册数据提交给RegisterServlet类
$('#register_form').serialize()是将表单的值序列化成json
使用回调函数判断是否注册成功
然后就是编写后台的代码了
首先是RegisterServlet类
protected void service(HttpServletRequest req, HttpServletResponse resp) {
//注册信息
//创建注册实例化对象
UserRegisterAccount userA = new UserRegisterAccount();
try {
//编码处理
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//获取表单数据
BeanUtils.populate(userA, req.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
//创建表单数据验证对象
FormDataService fds = new FormDataService();
//调用service层进行验证,返回结果对象
ResultInfo resultInfo = fds.registerForm(userA);
//json返回
JsonReturn.jsonReturns(resp, resultInfo);
}
BeanUtils.populate(userA, req.getParameterMap());用user对象接收前台传递的注册信息
然后创建seervice对象与结果集对象
/**
* @param userA: 用户注册实例,用于注册信息验证
* @return : 返回resultinfo实例,前台接收
* @description : 注册表单验证;接收controller层的数据进行处理,再提交给dao层进行处理,最终返回结果给controller层
*/
public ResultInfo registerForm(UserAccount userA) {
ResultInfo rif = new ResultInfo(); //创建结果返回对象实例
UserDataService uds = new UserDataServiceImpl(); //创建用户数据验证对象
Map<String, String> errors = uds.registerAction(userA); //创建错误返回集接收用户注册验证的错误集
UserDao userDao = new UserDaoImpl(); //创建用户数据库操作对象
EmailDao emailDao = new EmailDaoImpl(); //创建邮箱数据库操作对象
//查找用户名是否有重复,有重复添加错误进错误集合
if (!userDao.findUserNameRepeat(userA)) errors.put("userName", "此用户名已被使用");
//查找邮箱是否有重复,有重复添加错误进错误集合
if (!emailDao.findUserEmailRepeat(userA)) errors.put("email", "此邮箱已被使用");
//错误集合为空并且用户邮箱表数据添加成功允许注册
if (errors.isEmpty()) {
int uid = userDao.findMaxUid(); //找到最大的uid
if (uid == 0) uid = 1000000;
userA.setUid(++uid); //为用户创建uid
userDao.addUser(userA); //添加用户数据到用户表
userDao.addUserToEmail(userA);
Email email = emailDao.findEmailAll(userA); //创建邮箱实例接收创建的邮箱表数据
rif.setData(email); //结果对象实例传入email实例
rif.setFlag(true); //设置返回标识为true
} else { //驳回注册
rif.setFlag(false); //设置返回标识为true
rif.setErrors(errors); //错误信息集合返回
}
return rif;
}
FormDataService对象里的registerFrom方法里,创建UserDataService对象
然后用UserDataService对象里的registerAction方法验证注册信息是否规范,使用errors集合接收返回的错误信息
/**
* @param userA: 用户实例,获取实例中的属性进行验证
* @return : 返回验证完毕后的错误集合
* @description : 注册信息验证,将处理完结果的错误集返回给调用者
*/
@Override
public Map<String, String> registerAction(UserAccount userA) {
//获取用户名与密码的验证
Map<String, String> errors = UserNameAndPassWord(userA);
String passWord = userA.getPassWord(); //获取密码
String confirmThePassWord = userA.getConfirmThePassword(); //获取确认密码
String email = userA.getEmail(); //获取邮箱
if (confirmThePassWord == null || "".equals(confirmThePassWord)) { //判断确认密码为空
errors.put("confirmThePassword", "确认密码不能为空");
} else if (!(passWord.equals(confirmThePassWord))) { //判断两次密码是否一致
errors.put("confirmThePassword", "两次密码不一致");
}
if (email == null || "".equals(email)) { //判断邮箱为空
errors.put("email", "邮箱不能为空"); //邮箱正则
} else if (!(email.matches("^\\s*\\w+(?:\\.?[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"))) {
errors.put("email", "邮箱格式不正确");
}
return errors;
}
/**
* @param userA: 用户实例,获取实例中的属性进行验证
* @return : 返回验证完毕后的错误集合
* @description : 用户和密码的非空与规范验证,将处理完结果的错误集返回给调用者
*/
public Map<String, String> UserNameAndPassWord(UserAccount userA) {
Map<String, String> errors = new HashMap<>(); //创建错误集合
String userName = userA.getUserName(); //获取用户名
String passWord = userA.getPassWord(); //获取密码
if (userName == null || "".equals(userName)) { //判断用户名为空
errors.put("userName", "用户名不能为空");
} else if (!(userName.matches("^[a-zA-Z0-9]{6,20}$"))) { //用户名正则
errors.put("userName", "用户名不规范");
}
if (passWord == null || "".equals(passWord)) { //判断密码为空
errors.put("passWord", "密码不能为空");
} else if (!(passWord.matches("^(?=.*[0-9])(?=.*[a-zA-Z])(.{8,20})$"))) { //密码正则
errors.put("passWord", "密码不规范");
}
return errors;
}
之后判断返回的集合内信息是否为空,如果为空说明数据验证通过
然后再进入dao层根据用户信息查询数据库内是否有重复,如果这里也验证通过后就可以向数据库添加用户信息了
注册成功将结果集对象的flag属性设置为true,注册失败设置为false
然后使用json返回给前台
public class JsonReturn {
/**
* @param resp: resp对象
* @param resultInfo: 返回结果实例
* @description : 表单提交返回前台数据
*/
public static void jsonReturns(HttpServletResponse resp, ResultInfo resultInfo) {
try {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().write(json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
前台再使用ajax回调函数判断这个flag就能知道用户是否注册成功
到此注册功能就写完啦