当点击注册时,注册的数据,提交到哪里,可以在ajax中指定,如下
此处我是提交到registUserServlet,现在服务端还未创建registUserServlet,那么接下来就开始创建
注册的流程是拿到前端提交的数据,然后插入到数据库里,我可以通过request.getParameterMap();获取,如下
//1.获取数据
Map map = request.getParameterMap();
获取到的数据是一个键值对,我嫌遍历太麻烦,于是我准备将map中的数据映射到JavaBean里
首先创建一个前端对应数据的JavaBean,在项目里,我已定义好一个User类,它的字段将对应到html中表单的字段
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
在service中,创建一个UserService接口,如下
再创建UserService的实现类
首先去数据库查询该用户是否存在,若存在则不插入,反之就要插入
但现在我还没有操作数据库的对象,因此,我要先去创建操作数据库的对象,才能开始后续。
先创建UserDao
创建UserDao的实现类
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public User findByUsername(String username) {
return null;
}
@Override
public void save(User user) {
}
/**
* 根据用户名和密码查询的方法
* @param username
* @param password
* @return
*/
@Override
public User findByUsernameAndPassword(String username, String password) {
return null;
}
}
在Dao层,开始具体的去和数据库进行交互,先完善findByUsername
@Override
public User findByUsername(String username) {
User user = null;
try {
//1.定义sql
String sql = "select * from tab_user where username = ?";
//2.执行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username);
} catch (Exception e) {
}
return user;
}
完善Save
@Override
public void save(User user) {
//1.定义sql
String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";
//2.执行sql
template.update(sql,user.getUsername(),
user.getPassword(),
user.getName(),
user.getBirthday(),
user.getSex(),
user.getTelephone(),
user.getEmail(),
user.getStatus(),
user.getCode()
);
}
完善findByUsernameAndPassword
@Override
public User findByUsernameAndPassword(String username, String password) {
User user = null;
try {
//1.定义sql
String sql = "select * from tab_user where username = ? and password = ?";
//2.执行sql
user = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username,password);
} catch (Exception e) {
}
return user;
}
写完Dao后,继续在service层中完善注册逻辑
@Override
public boolean regist(User user) {
//1.根据用户名查询用户对象
User u = userDao.findByUsername(user.getUsername());
//判断u是否为null
if(u != null){
//用户名存在,注册失败
return false;
}
//2.保存用户信息
userDao.save(user);
return true;
}
回到RegistUserServlet,调用UserServiceImpl去完成注册
UserService service = new UserServiceImpl();
boolean flag = service.regist(user);
ResultInfo info = new ResultInfo();
//4.响应结果
if(flag){
//注册成功
info.setFlag(true);
}else{
//注册失败
info.setFlag(false);
info.setErrorMsg("注册失败!");
}
将数据写回到浏览器
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
//将json数据写回客户端
//设置content-type
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
验证码的获取是通过checkCode,由于html具备缓存,图片链接地址若不变,则不会进行重新请求,因此,需要在checkCode后追加变化的时间值,这样做的目的仅仅是希望,我每次点击验证码时,浏览器都能重新帮我发送请求,获取新的验证码
checkCode对应的Servlet我已提供,你无需编写
验证码的获取已经搞定,继续回到注册,当你点击注册时,数据已经被提交给/registUserServle,此时应该在这个servelt里去判断验证码是否正确
//验证校验
String check = request.getParameter("check");
//从sesion中获取验证码
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
//比较
if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
//验证码错误
ResultInfo info = new ResultInfo();
//注册失败
info.setFlag(false);
info.setErrorMsg("验证码错误");
//将info对象序列化为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
return;
}
在注册的时候,通常有注册激活的功能,此举目的是为了检验用户的有效性,即判断这个用户是机器人注册的,还是正常用户注册的。
激活实现原理如下
@Override
public boolean regist(User user) {
//1.根据用户名查询用户对象
User u = userDao.findByUsername(user.getUsername());
//判断u是否为null
if(u != null){
//用户名存在,注册失败
return false;
}
//2.1设置激活码,唯一字符串
user.setCode(UuidUtil.getUuid());
//2.2设置激活状态
user.setStatus("N");
//2.保存用户信息
userDao.save(user);
//3.激活邮件发送,邮件正文?
String content="点击激活【旅游网】";
MailUtils.sendMail(user.getEmail(),content,"激活邮件");
return true;
}
邮件发送功能,我已封装好一个工具类,你在使用时,只需更改USER,PASSWORD就行。
此处我已提供好一个测试邮箱的账号和授权密码,请各位切勿用于非发滥用。
点击激活是一个链接,它是由/activeUserServlet进行处理
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取激活码
String code = request.getParameter("code");
if(code != null){
//2.调用service完成激活
UserService service = new UserServiceImpl();
boolean flag = service.active(code);
//3.判断标记
String msg = null;
if(flag){
//激活成功
msg = "激活成功,请登录";
}else{
//激活失败
msg = "激活失败,请联系管理员!";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
}
}
项目地址https://gitee.com/cxyhq2020/Mytravel.git