JavaWeb黑马旅游网-学习笔记02【注册功能】
- Java后端 學(xué)習(xí)路線 筆記匯總表【黑馬程序員】
目錄
05-注冊(cè)功能_功能分析
06-注冊(cè)功能_前臺(tái)_表單校驗(yàn)1
07-注冊(cè)功能_前臺(tái)_表單校驗(yàn)2
08-注冊(cè)功能_前臺(tái)_異步提交表單
09-注冊(cè)功能_后臺(tái)_Servlet代碼實(shí)現(xiàn)
處理編碼過(guò)濾器Filter?CharchaterFilter.java
其他Java代碼
10-注冊(cè)功能_后臺(tái)_Dao代碼實(shí)現(xiàn)
11-注冊(cè)功能_后臺(tái)_service代碼實(shí)現(xiàn)&測(cè)試
12-注冊(cè)功能_后臺(tái)_驗(yàn)證碼&前臺(tái)數(shù)據(jù)處理
前臺(tái)驗(yàn)證碼
驗(yàn)證碼 CheckCodeServlet.java
后臺(tái)驗(yàn)證碼校驗(yàn)
RegistUserServlet.java
13-注冊(cè)功能_后臺(tái)_郵件激活分析
14-注冊(cè)功能_郵件激活_發(fā)送郵件
MailUtils.java 發(fā)送郵件工具類
15-注冊(cè)功能_郵件激活_點(diǎn)擊激活分析
發(fā)送郵件
用戶點(diǎn)擊郵件激活
發(fā)送郵件代碼
UUID
16-注冊(cè)功能_郵件激活_代碼實(shí)現(xiàn)_Servlet
ActiveUserServlet.java
17-注冊(cè)功能_郵件激活_代碼實(shí)現(xiàn)_Service&Dao
UserDao.java
UserDaoImpl.java
修改保存Dao代碼,加上存儲(chǔ)status和code 的代碼邏輯
05-注冊(cè)功能_功能分析
頁(yè)面效果:
注冊(cè)功能分析06-注冊(cè)功能_前臺(tái)_表單校驗(yàn)1
表單校驗(yàn):
? ? 1.用戶名:單詞字符,長(zhǎng)度8到20位
? ? 2.密碼:單詞字符,長(zhǎng)度8到20位
? ? 3.email:郵件格式
? ? 4.姓名:非空
? ? 5.手機(jī)號(hào):手機(jī)號(hào)格式
? ? 6.出生日期:非空
? ? 7.驗(yàn)證碼:非空
07-注冊(cè)功能_前臺(tái)_表單校驗(yàn)2
提升用戶體驗(yàn),并減輕服務(wù)器壓力。
??
??
08-注冊(cè)功能_前臺(tái)_異步提交表單
異步(ajax)提交表單
在此使用“異步提交表單”是為了獲取服務(wù)器響應(yīng)的數(shù)據(jù)。因?yàn)槲覀兦芭_(tái)使用的是html作為視圖層,不能夠直接從servlet相關(guān)的域?qū)ο螳@取值,只能通過(guò)ajax獲取響應(yīng)數(shù)據(jù)。
09-注冊(cè)功能_后臺(tái)_Servlet代碼實(shí)現(xiàn)
6.3.5?? ?編寫RegistUserServlet
6.3.6?? ?編寫UserService以及UserServiceImpl
6.3.7?? ?編寫UserDao以及UserDaoImpl
處理編碼過(guò)濾器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;/*** 解決全站亂碼問(wèn)題,處理所有的請(qǐng)求*/ @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 {//將父接口轉(zhuǎn)為子接口HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) rep;//獲取請(qǐng)求方法String method = request.getMethod();//解決post請(qǐng)求中文數(shù)據(jù)亂碼問(wèn)題if (method.equalsIgnoreCase("post")) {request.setCharacterEncoding("utf-8");}//處理響應(yīng)亂碼response.setContentType("text/html;charset=utf-8");filterChain.doFilter(request, response);}@Overridepublic void destroy() {} }其他Java代碼
10-注冊(cè)功能_后臺(tái)_Dao代碼實(shí)現(xiàn)
11-注冊(cè)功能_后臺(tái)_service代碼實(shí)現(xiàn)&測(cè)試
12-注冊(cè)功能_后臺(tái)_驗(yàn)證碼&前臺(tái)數(shù)據(jù)處理
前臺(tái)驗(yàn)證碼
驗(yàn)證碼 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;/*** 驗(yàn)證碼*/ @WebServlet("/checkCode") public class CheckCodeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//服務(wù)器通知瀏覽器不要緩存response.setHeader("pragma", "no-cache");response.setHeader("cache-control", "no-cache");response.setHeader("expires", "0");//在內(nèi)存中創(chuàng)建一個(gè)長(zhǎng)80,寬30的圖片,默認(rèn)黑色背景//參數(shù)一:長(zhǎng)//參數(shù)二:寬//參數(shù)三:顏色int width = 80;int height = 30;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//獲取畫(huà)筆Graphics g = image.getGraphics();//設(shè)置畫(huà)筆顏色為灰色g.setColor(Color.GRAY);//填充圖片g.fillRect(0, 0, width, height);//產(chǎn)生4個(gè)隨機(jī)驗(yàn)證碼,12EyString checkCode = getCheckCode();//將驗(yàn)證碼放入HttpSession中request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);//設(shè)置畫(huà)筆顏色為黃色g.setColor(Color.YELLOW);//設(shè)置字體的小大g.setFont(new Font("黑體", Font.BOLD, 24));//向圖片上寫入驗(yàn)證碼g.drawString(checkCode, 15, 25);//將內(nèi)存中的圖片輸出到瀏覽器//參數(shù)一:圖片對(duì)象//參數(shù)二:圖片的格式,如PNG,JPG,GIF//參數(shù)三:圖片輸出到哪里去ImageIO.write(image, "PNG", response.getOutputStream());}/*** 產(chǎn)生4位隨機(jī)字符串*/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++) {//產(chǎn)生0到size-1的隨機(jī)值int index = r.nextInt(size);//在base字符串中獲取下標(biāo)為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);} }后臺(tái)驗(yàn)證碼校驗(yàn)
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 {//驗(yàn)證校驗(yàn)String check = request.getParameter("check");//從session中獲取驗(yàn)證碼HttpSession session = request.getSession();String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");session.removeAttribute("CHECKCODE_SERVER");//為了保證驗(yàn)證碼只能使用一次//比較if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {//驗(yàn)證碼錯(cuò)誤ResultInfo info = new ResultInfo();//注冊(cè)失敗info.setFlag(false);info.setErrorMsg("驗(yàn)證碼錯(cuò)誤");//將info對(duì)象序列化為jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);return;}//1.獲取數(shù)據(jù)Map<String, String[]> map = request.getParameterMap();//2.封裝對(duì)象User user = new User();try {BeanUtils.populate(user, map); // 將map對(duì)應(yīng)的數(shù)據(jù)封裝進(jìn)user對(duì)應(yīng)的屬性中} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//3.調(diào)用service完成注冊(cè)UserService service = new UserServiceImpl();boolean flag = service.regist(user);ResultInfo info = new ResultInfo();//4.響應(yīng)結(jié)果if (flag) {//注冊(cè)成功info.setFlag(true);} else {//注冊(cè)失敗info.setFlag(false);info.setErrorMsg("注冊(cè)失敗!");}//將info對(duì)象序列化為jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(info);//將json數(shù)據(jù)寫回客戶端//設(shè)置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-注冊(cè)功能_后臺(tái)_郵件激活分析
為什么要進(jìn)行郵件激活?為了保證用戶填寫的郵箱是正確的。將來(lái)可以推廣一些宣傳信息到用戶郵箱中。
- 發(fā)送郵件。
- 用戶點(diǎn)擊郵件,進(jìn)行激活。
14-注冊(cè)功能_郵件激活_發(fā)送郵件
MailUtils.java 發(fā)送郵件工具類
什么是授權(quán)碼,它又是如何設(shè)置?_QQ郵箱幫助中心
package cn.itcast.travel.util;import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties;/*** 發(fā)郵件工具類*/ public final class MailUtils {private static final String USER = ""; // 發(fā)件人稱號(hào),同郵箱地址private static final String PASSWORD = ""; // 如果是qq郵箱可以使戶端授權(quán)碼,或者登錄密碼/*** @param to 收件人郵箱* @param text 郵件正文* @param title 標(biāo)題*//* 發(fā)送驗(yàn)證信息的郵件 */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");// 發(fā)件人的賬號(hào)props.put("mail.user", USER);//發(fā)件人的密碼props.put("mail.password", PASSWORD);// 構(gòu)建授權(quán)信息,用于進(jìn)行SMTP進(jìn)行身份驗(yàn)證Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用戶名、密碼String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用環(huán)境屬性和授權(quán)信息,創(chuàng)建郵件會(huì)話Session mailSession = Session.getInstance(props, authenticator);// 創(chuàng)建郵件消息MimeMessage message = new MimeMessage(mailSession);// 設(shè)置發(fā)件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 設(shè)置收件人InternetAddress toAddress = new InternetAddress(to);message.setRecipient(Message.RecipientType.TO, toAddress);// 設(shè)置郵件標(biāo)題message.setSubject(title);// 設(shè)置郵件的內(nèi)容體message.setContent(text, "text/html;charset=UTF-8");// 發(fā)送郵件Transport.send(message);return true;} catch (Exception e) {e.printStackTrace();}return false;}public static void main(String[] args) throws Exception { // 做測(cè)試用MailUtils.sendMail("itcast_xian@163.com", "你好,這是一封測(cè)試郵件!無(wú)需回復(fù)。", "測(cè)試郵件!");System.out.println("發(fā)送成功!!!");} }15-注冊(cè)功能_郵件激活_點(diǎn)擊激活分析
發(fā)送郵件
郵件工具類:MailUtils,調(diào)用其中sendMail方法可以完成郵件發(fā)送。
用戶點(diǎn)擊郵件激活
經(jīng)過(guò)分析,發(fā)現(xiàn),用戶激活其實(shí)就是修改用戶表中的status為‘Y’。
分析:
發(fā)送郵件代碼
UUID
package cn.itcast.travel.util;import java.util.UUID;/*** 產(chǎn)生UUID隨機(jī)字符串工具類*/ public final class UuidUtil {private UuidUtil() {}public static String getUuid() {return UUID.randomUUID().toString().replace("-", "");}/*** 測(cè)試*/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-注冊(cè)功能_郵件激活_代碼實(shí)現(xiàn)_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.調(diào)用service完成激活UserService service = new UserServiceImpl();boolean flag = service.active(code);//3.判斷標(biāo)記String msg = null;if (flag) {//激活成功msg = "激活成功,請(qǐng)<a href='login.html'>登錄</a>";} else {//激活失敗msg = "激活失敗,請(qǐng)聯(lián)系管理員!";}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-注冊(cè)功能_郵件激活_代碼實(shí)現(xiàn)_Service&Dao
UserDao.java
UserDaoImpl.java
修改保存Dao代碼,加上存儲(chǔ)status和code 的代碼邏輯
內(nèi)心純潔的人是那么容易被觸動(dòng),會(huì)為了別人的幸福而喜悅,會(huì)為了別人的痛苦而悲傷,會(huì)為了有人關(guān)心而溫暖,會(huì)為了美好的事物而觸動(dòng)。
有平凡人的喜樂(lè),也有平凡人的悲苦,也有平凡人的追求,希望活在愛(ài)中,也不吝嗇付出自己的愛(ài)。
在孤單無(wú)助時(shí)會(huì)去尋求幫助或者自己努力解決問(wèn)題,而不是一味逃避,活成行尸走肉。
總結(jié)
以上是生活随笔為你收集整理的JavaWeb黑马旅游网-学习笔记02【注册功能】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaWeb图书管理系统day03
- 下一篇: 微信公众号Java开发-笔记01【微信公