JavaWeb黑马旅游网-学习笔记02【注册功能】
- Java后端 学习路线 笔记汇总表【黑马程序员】
- JavaWeb黑马旅游网-学习笔记01【准备工作】
- JavaWeb黑马旅游网-学习笔记02【注册功能】
- JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
- JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】
- JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
- JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】
- JavaWeb黑马旅游网-学习笔记07【旅游线路查询】
- JavaWeb黑马旅游网-学习笔记08【旅游线路详情】
- JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】
- 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-注册功能_邮件激活_点击激活分析
发送邮件
- 申请邮箱
- 开启授权码
- 在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【注册功能】相关推荐
- JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记08【旅游线路详情】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记01【准备工作】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记10【项目代码】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记07【旅游线路查询】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
最新文章
- mysql表导出和导入命令行_MySQL命令行导出导入数据库和数据表-Go语言中文社区...
- c++ eos智能合约开发_干货|EOS智能合约开发(一)EOS环境搭建和启动节点
- html固定广告位置,如何将广告始终定位到网页右下角
- 利用python爬虫(案例7)--X讯招聘的小职位们
- 记录pageHelper分页orderby的坑
- 浏览器弹窗怎么设置显示url_谷歌浏览器Chrome76版本地址栏不显示HTTPS和WWW怎么办?...
- 修复 github 项目的语言属性
- PHP实现当前文件夹下所有文件和文件夹的遍历
- POJ 1002 电话号码字符串处理
- http post java工具类_java实现Http post(参数json格式)、get 请求的HttpUtil工具类
- MongoDB World 2016参会全记录
- 云计算特点与发展方向
- Jira中的全流程开发管理
- 通行时间可调的两路口交通灯设计实验(基于Multisim仿真)
- HC110110019 FTP原理与配置
- RuntimeError: cuda runtime error (77)
- php获取文件夹下所有文件名(php遍历目录)
- 50. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影
- 只有网安人才知道的事情!
- Java算法学习13——最近公共祖先