• Java后端 学习路线 笔记汇总表【黑马程序员】
  1. JavaWeb黑马旅游网-学习笔记01【准备工作】
  2. JavaWeb黑马旅游网-学习笔记02【注册功能】
  3. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
  4. JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】
  5. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
  6. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】
  7. JavaWeb黑马旅游网-学习笔记07【旅游线路查询】
  8. JavaWeb黑马旅游网-学习笔记08【旅游线路详情】
  9. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】
  10. JavaWeb黑马旅游网-学习笔记10【项目代码】

目录

05-注册功能_功能分析

06-注册功能_前台_表单校验1

07-注册功能_前台_表单校验2

08-注册功能_前台_异步提交表单

09-注册功能_后台_Servlet代码实现

处理编码过滤器Filter CharchaterFilter.java

其他Java代码

10-注册功能_后台_Dao代码实现

11-注册功能_后台_service代码实现&测试

12-注册功能_后台_验证码&前台数据处理

前台验证码

验证码 CheckCodeServlet.java

后台验证码校验

RegistUserServlet.java

13-注册功能_后台_邮件激活分析

14-注册功能_邮件激活_发送邮件

MailUtils.java 发送邮件工具类

15-注册功能_邮件激活_点击激活分析

发送邮件

用户点击邮件激活

发送邮件代码

UUID

16-注册功能_邮件激活_代码实现_Servlet

ActiveUserServlet.java

17-注册功能_邮件激活_代码实现_Service&Dao

UserDao.java

UserDaoImpl.java

修改保存Dao代码,加上存储status和code 的代码逻辑


05-注册功能_功能分析

页面效果:

注册功能分析

06-注册功能_前台_表单校验1

表单校验:
    1.用户名:单词字符,长度8到20位
    2.密码:单词字符,长度8到20位
    3.email:邮件格式
    4.姓名:非空
    5.手机号:手机号格式
    6.出生日期:非空
    7.验证码:非空

07-注册功能_前台_表单校验2

提升用户体验,并减轻服务器压力。

  

  

08-注册功能_前台_异步提交表单

异步(ajax)提交表单

在此使用“异步提交表单”是为了获取服务器响应的数据。因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据。

09-注册功能_后台_Servlet代码实现

6.3.5    编写RegistUserServlet

6.3.6    编写UserService以及UserServiceImpl

6.3.7    编写UserDao以及UserDaoImpl

处理编码过滤器Filter CharchaterFilter.java

package cn.itcast.travel.web.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 解决全站乱码问题,处理所有的请求*/
@WebFilter("/*")
public class CharchaterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {//将父接口转为子接口HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) rep;//获取请求方法String method = request.getMethod();//解决post请求中文数据乱码问题if (method.equalsIgnoreCase("post")) {request.setCharacterEncoding("utf-8");}//处理响应乱码response.setContentType("text/html;charset=utf-8");filterChain.doFilter(request, response);}@Overridepublic void destroy() {}
}

其他Java代码

10-注册功能_后台_Dao代码实现

11-注册功能_后台_service代码实现&测试

12-注册功能_后台_验证码&前台数据处理

前台验证码

验证码 CheckCodeServlet.java

package cn.itcast.travel.web.servlet;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;/*** 验证码*/
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//服务器通知浏览器不要缓存response.setHeader("pragma", "no-cache");response.setHeader("cache-control", "no-cache");response.setHeader("expires", "0");//在内存中创建一个长80,宽30的图片,默认黑色背景//参数一:长//参数二:宽//参数三:颜色int width = 80;int height = 30;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取画笔Graphics g = image.getGraphics();//设置画笔颜色为灰色g.setColor(Color.GRAY);//填充图片g.fillRect(0, 0, width, height);//产生4个随机验证码,12EyString checkCode = getCheckCode();//将验证码放入HttpSession中request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);//设置画笔颜色为黄色g.setColor(Color.YELLOW);//设置字体的小大g.setFont(new Font("黑体", Font.BOLD, 24));//向图片上写入验证码g.drawString(checkCode, 15, 25);//将内存中的图片输出到浏览器//参数一:图片对象//参数二:图片的格式,如PNG,JPG,GIF//参数三:图片输出到哪里去ImageIO.write(image, "PNG", response.getOutputStream());}/*** 产生4位随机字符串*/private String getCheckCode() {String base = "0123456789ABCDEFGabcdefg";int size = base.length();Random r = new Random();StringBuffer sb = new StringBuffer();for (int i = 1; i <= 4; i++) {//产生0到size-1的随机值int index = r.nextInt(size);//在base字符串中获取下标为index的字符char c = base.charAt(index);//将c放入到StringBuffer中去sb.append(c);}return sb.toString();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

后台验证码校验

RegistUserServlet.java

package cn.itcast.travel.web.servlet;import cn.itcast.travel.domain.ResultInfo;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.BeanUtils;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//验证校验String check = request.getParameter("check");//从session中获取验证码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对象序列化为jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);return;}//1.获取数据Map<String, String[]> map = request.getParameterMap();//2.封装对象User user = new User();try {BeanUtils.populate(user, map); // 将map对应的数据封装进user对应的属性中} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//3.调用service完成注册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对象序列化为jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);//将json数据写回客户端//设置content-typeresponse.setContentType("application/json;charset=utf-8");response.getWriter().write(json);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

13-注册功能_后台_邮件激活分析

为什么要进行邮件激活?为了保证用户填写的邮箱是正确的。将来可以推广一些宣传信息到用户邮箱中。

  • 发送邮件。
  • 用户点击邮件,进行激活。

14-注册功能_邮件激活_发送邮件

MailUtils.java 发送邮件工具类

什么是授权码,它又是如何设置?_QQ邮箱帮助中心

package cn.itcast.travel.util;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;/*** 发邮件工具类*/
public final class MailUtils {private static final String USER = ""; // 发件人称号,同邮箱地址private static final String PASSWORD = ""; // 如果是qq邮箱可以使户端授权码,或者登录密码/*** @param to    收件人邮箱* @param text  邮件正文* @param title 标题*//* 发送验证信息的邮件 */public static boolean sendMail(String to, String text, String title) {try {final Properties props = new Properties();props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.qq.com");// 发件人的账号props.put("mail.user", USER);//发件人的密码props.put("mail.password", PASSWORD);// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用环境属性和授权信息,创建邮件会话Session mailSession = Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message = new MimeMessage(mailSession);// 设置发件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 设置收件人InternetAddress toAddress = new InternetAddress(to);message.setRecipient(Message.RecipientType.TO, toAddress);// 设置邮件标题message.setSubject(title);// 设置邮件的内容体message.setContent(text, "text/html;charset=UTF-8");// 发送邮件Transport.send(message);return true;} catch (Exception e) {e.printStackTrace();}return false;}public static void main(String[] args) throws Exception { // 做测试用MailUtils.sendMail("itcast_xian@163.com", "你好,这是一封测试邮件!无需回复。", "测试邮件!");System.out.println("发送成功!!!");}
}

15-注册功能_邮件激活_点击激活分析

发送邮件

  1. 申请邮箱
  2. 开启授权码
  3. 在MailUtils中设置自己的邮箱账号和密码(授权码)

邮件工具类:MailUtils,调用其中sendMail方法可以完成邮件发送。

用户点击邮件激活

经过分析,发现,用户激活其实就是修改用户表中的status为‘Y’。

分析:

发送邮件代码

UUID

package cn.itcast.travel.util;import java.util.UUID;/*** 产生UUID随机字符串工具类*/
public final class UuidUtil {private UuidUtil() {}public static String getUuid() {return UUID.randomUUID().toString().replace("-", "");}/*** 测试*/public static void main(String[] args) {System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());System.out.println(UuidUtil.getUuid());}
}

16-注册功能_邮件激活_代码实现_Servlet

ActiveUserServlet

  • UserService:active
  • UserDao:findByCode、updateStatus

ActiveUserServlet.java

package cn.itcast.travel.web.servlet;import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/activeUserServlet")
public class ActiveUserServlet extends HttpServlet {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 = "激活成功,请<a href='login.html'>登录</a>";} else {//激活失败msg = "激活失败,请联系管理员!";}response.setContentType("text/html;charset=utf-8");response.getWriter().write(msg);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

17-注册功能_邮件激活_代码实现_Service&Dao

UserDao.java

UserDaoImpl.java

修改保存Dao代码,加上存储status和code 的代码逻辑

内心纯洁的人是那么容易被触动,会为了别人的幸福而喜悦,会为了别人的痛苦而悲伤,会为了有人关心而温暖,会为了美好的事物而触动。

有平凡人的喜乐,也有平凡人的悲苦,也有平凡人的追求,希望活在爱中,也不吝啬付出自己的爱。

在孤单无助时会去寻求帮助或者自己努力解决问题,而不是一味逃避,活成行尸走肉。

JavaWeb黑马旅游网-学习笔记02【注册功能】相关推荐

  1. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  2. JavaWeb黑马旅游网-学习笔记08【旅游线路详情】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  4. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  6. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  7. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  8. JavaWeb黑马旅游网-学习笔记10【项目代码】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  9. JavaWeb黑马旅游网-学习笔记07【旅游线路查询】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

最新文章

  1. mysql表导出和导入命令行_MySQL命令行导出导入数据库和数据表-Go语言中文社区...
  2. c++ eos智能合约开发_干货|EOS智能合约开发(一)EOS环境搭建和启动节点
  3. html固定广告位置,如何将广告始终定位到网页右下角
  4. 利用python爬虫(案例7)--X讯招聘的小职位们
  5. 记录pageHelper分页orderby的坑
  6. 浏览器弹窗怎么设置显示url_谷歌浏览器Chrome76版本地址栏不显示HTTPS和WWW怎么办?...
  7. 修复 github 项目的语言属性
  8. PHP实现当前文件夹下所有文件和文件夹的遍历
  9. POJ 1002 电话号码字符串处理
  10. http post java工具类_java实现Http post(参数json格式)、get 请求的HttpUtil工具类
  11. MongoDB World 2016参会全记录
  12. 云计算特点与发展方向
  13. Jira中的全流程开发管理
  14. 通行时间可调的两路口交通灯设计实验(基于Multisim仿真)
  15. HC110110019 FTP原理与配置
  16. RuntimeError: cuda runtime error (77)
  17. php获取文件夹下所有文件名(php遍历目录)
  18. 50. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影
  19. 只有网安人才知道的事情!
  20. Java算法学习13——最近公共祖先

热门文章

  1. 【转载】spring framework体系结构详解
  2. java 动态拼接sql_动态SQL拼接工具类
  3. c语言数组数据用指针查找,c语言数组与指针_指针篇_2011.ppt
  4. 八十二、归并排序求取复杂的逆序数
  5. 二十五、深入Java中的static静态修饰符
  6. 物理化学 焓变的计算,学会状态的转变
  7. React  学习第二天 2018-07-21
  8. 面向新闻媒体的命名实体识别技术
  9. ACL 2018论文解读 | 基于路径的实体图关系抽取模型
  10. 丑憨批的爬虫笔记4BeautifulSoup4